[HN Gopher] Owl: A toolkit for writing command-line user interfa...
       ___________________________________________________________________
        
       Owl: A toolkit for writing command-line user interfaces in Elixir
        
       Author : clessg
       Score  : 149 points
       Date   : 2023-01-08 17:13 UTC (5 hours ago)
        
 (HTM) web link (hexdocs.pm)
 (TXT) w3m dump (hexdocs.pm)
        
       | andy_ppp wrote:
       | How problematic is the BEAM startup time for this? I made a
       | command line tool once and it took a while to start the VM but
       | this was on a much older machine...
        
         | lytedev wrote:
         | It's going to completely depend on the tool. I can start an
         | elixir app in half a second, which is going to be unacceptable
         | in many situations.
         | 
         | That said, there are also many situations where that is a
         | tradeoff absolutely worth making!
        
           | guiriduro wrote:
           | If you have several commands you're likely to use and
           | possibly pipe together, it might make sense to have
           | lightweight compiled C/Rust command client stubs invoke an
           | Elixir server, so you'd pay the BEAM startup cost only once,
           | in exchange for some complexity.
        
           | throwawaymaths wrote:
           | I wonder if you can tree-shake unnecessary modules in the
           | release. There's a lot of stuff in the otp beam release you
           | probably _don 't_ need in any given CLI app and it should be
           | easy to parse bytecode and figure out dependencies.
        
             | manusachi wrote:
             | That's one of the goals of Firefly[1]
             | 
             | > It can compile code more efficiently than the BEAM by
             | stripping out dead code and compiling only what's necessary
             | for an application.
             | 
             | Though, they only mention faster compilation and smaller
             | digital footprint, not faster startup.
             | 
             | [1] https://dockyard.com/blog/2022/09/01/dockyard-r-d-
             | firefly-op...
        
             | asabil wrote:
             | Shouldn't be necessary if you configure your release to
             | start in interactive move instead of embedded mode as
             | modules would then get loaded lazily
        
         | amalgamated_inc wrote:
         | ~200-250ms on my machine
        
       | shijie wrote:
       | It seems that every ShowHN that features an Elixir project is
       | well-polished, has a sensical API, and has friendly, solid
       | documentation. Is this a function of the nature of the language,
       | the community, or a mix of both?
        
         | bluehatbrit wrote:
         | I use Elixir as my primary language in my day job and I'd say
         | it's a mix of the community and the ecosystem. Most modules
         | seem to have great documentation, so if you're producing one
         | you also put in the effort. However, ExDoc (the documentation
         | module) is also really solid with loads of great features,
         | including the ability to run your examples as unit tests.
         | 
         | That said, it's not all that uncommon to be searching for
         | something like an implementation of a SaaS API and find a
         | totally undocumented module. It's not the norm by any stretch
         | though.
        
         | hazn wrote:
         | The Elixir community has good internal (and official!) tooling
         | around libraries and documentation. I would say it's a positive
         | feedback loop. The nice community resources attract good
         | programmers, good programmers make nice community resources.
        
         | ctvo wrote:
         | Or it's the way upvotes work for the most part?
        
         | kitplummer wrote:
         | Absolutely both.
         | 
         | But...the issue is packaging/distributing a CLI built with
         | Elixir. Comparatively to building a CLI in something like Rust,
         | there is a lot of overhead that comes with a VM-based language
         | and framework. Especially if you want to target multiple OS and
         | processor architectures (or distributions). Not to say that it
         | is impossible, just maybe not as simple. It is one thing to run
         | Mix tasks, or access the Owl API from REPL, it is another to
         | run an Owl-based app on macOS, Linux and Windows and get it
         | there.
        
           | kirushik wrote:
           | Well, `mix release`
           | (https://hexdocs.pm/mix/Mix.Tasks.Release.html) exists to
           | address this very issue.
           | 
           | It still has limitations (the biggest one is the requirement
           | for the os&architecture to match between the builder and the
           | deployment target) -- but the result is a standalone binary
           | which not only embeds the VM and preloads the app's bytecode,
           | but even "trims" the stdlib to only ship the required
           | functions.
        
             | kitplummer wrote:
             | Right, so the moral of the story centers on the target user
             | of the CLI tool. If you're building something for the
             | Elixir community - game on I suppose, though there is still
             | the complexity of build-env per OS/arch.
             | 
             | I wonder where WASM/container enters the discussion.
        
             | throwawaymaths wrote:
             | Burrito is supposed to close the gap even further, though
             | I've never used it.
        
           | [deleted]
        
           | quaunaut wrote:
           | Undeniably it's not going to be as convenient, but the divide
           | isn't what it used to be. BEAM apps can be compiled to a
           | binary, and as long as that binary was compiled for the
           | platform, that should be good enough.
           | 
           | I'm doubtful I'll see it used much _outside_ the BEAM
           | community, but then again it 's been a "successful despite a
           | lack of mass usage" community for awhile.
        
         | amalgamated_inc wrote:
         | Both. Best of Ruby (community, docs, pleasant to use) and
         | Erlang (functional, value oriented, BEAM).
        
       | djm_ wrote:
       | This looks great!
       | 
       | If you're building CLI tooling in Elixir, you may also be
       | interested in TableRex, my ASCII-table drawing library. [1]
       | 
       | [1] https://github.com/djm/table_rex
        
       | vlad wrote:
       | Building a cross-platform CLI from a python script in 2009
       | required unrelated open-source tools to package for each of the
       | three major operating systems. I remember asking Dropbox guys
       | what they were using. Having an official way to do it is much
       | better.
       | 
       | Regardless of technology, I think CLI's tend to maintain their
       | original size, or get smaller over time. If you choose to use a
       | CLI built with Elixir, I imagine it could gain a web-based GUI
       | without a large increase, if each build already includes a
       | runtime environment and system libraries. Or if a CLI is written
       | in another language and advertised as very compact, I imagine its
       | size will also stay consistent, but might not gain the same fancy
       | features. And in any case, popular compilers or packaging tools
       | tend gain optimization improvements over time.
        
         | bombolo wrote:
         | Uh? What unreleased tools did you need in 2009?
         | 
         | Everything worked fine for me then.
        
           | SirGiggles wrote:
           | Did you misread "unrelated" for "unreleased" in the first
           | sentence?
        
       | kemiller wrote:
       | This is very welcome. Elixir is ill-suited to command line apps
       | out of the box.
        
       | hun-nemethpeter wrote:
       | We have an FTXUI for C++. https://github.com/ArthurSonzogni/FTXUI
        
       | escherize wrote:
       | Is there something like this for Java?
        
         | electrum wrote:
         | JLine has a complete terminal library and includes a demo which
         | is a full editor: https://github.com/jline/jline3
        
         | Celeo wrote:
         | Many, yes. You can pair a CLI arg parser with a logger that
         | supports colored output, and add a TUI library if you needed
         | that. There are "command line frameworks" as well, like picocli
         | that can be paired with something like Jbang for distribution.
        
         | eternalban wrote:
         | https://github.com/remkop/picocli
         | 
         |  _" Picocli is a one-file framework for creating Java command
         | line applications with almost zero code. Picocli aims to be the
         | easiest way to create rich command line applications that can
         | run on and off the JVM.
         | 
         | Picocli supports a variety of command line syntax styles
         | including POSIX, GNU, MS-DOS and more. It generates highly
         | customizable usage help messages with ANSI colors and styles.
         | Picocli-based applications can have command line TAB completion
         | showing available options, option parameters and subcommands,
         | for any level of nested subcommands. Picocli-based applications
         | can be ahead-of-time compiled to a GraalVM native image, with
         | extremely fast startup time and lower memory requirements,
         | which can be distributed as a single executable file.
         | 
         | Picocli generates beautiful documentation for your application
         | (HTML, PDF and Unix man pages)."_
         | 
         | https://picocli.info/quick-guide.html
        
       | revskill wrote:
       | Github user interface is really not good in this case. Need a
       | visible verticle line between begin..end block.
        
       | lycos wrote:
       | I love using Elixir but I also like to think "right tool for the
       | job" and imho Elixir is generally not the right tool for the job
       | for command-line user interfaces. It's fun to experiment with
       | though, of course.
       | 
       | Having said all of that that, something like this might be useful
       | when writing custom Mix tasks inside Elixir projects!
        
         | matlin wrote:
         | Elixir is having a big push into machine learning (checkout Nx
         | and Axon) and generally is also great for doing data streaming
         | processing so you could imagine tools cropping up that might
         | have it's primary interface be a CLI... this would be a great
         | fit for those use cases.
        
         | ch4s3 wrote:
         | As long as you aren't severely memory constrained or trying to
         | do tasks that only take a few ms, it's totally fine. It's even
         | desirable in a lot of cases. You can do a lot of tasks in about
         | the time it takes python, or faster if it's a parallelizable
         | problem.
        
         | Existenceblinks wrote:
         | I wonder which one is currently the king (include all arbitrary
         | metrics you can think of)? I guess 1.Go 2.Rust
        
           | theobeers wrote:
           | As of last year, Meta recommends internally that CLI tools be
           | implemented in Rust:
           | 
           | https://engineering.fb.com/2022/07/27/developer-
           | tools/progra...
        
           | mgaunard wrote:
           | Python is by far the world most popular language, and is used
           | a lot for command-line scripts.
        
           | RexM wrote:
           | Bash?
        
             | c0balt wrote:
             | Won't work on windows outside of WSL, at least that has
             | been a reason I've heard for not using Bash for simple
             | stuff.
             | 
             | For complex applications bash (or shellscript in general)
             | is also rather ill-suited as it has a lot of footguns and
             | can be hard to maintain.
        
               | cglong wrote:
               | You can also use Bash in Cygwin/MSYS environments, like
               | Git for Windows. I've been using Bash for writing cross-
               | platform Git scripts :)
        
               | thesneakin wrote:
               | For decades. Bash even runs in DOS.
        
             | Existenceblinks wrote:
             | I have no idea if Bash has library? It's more like for
             | managing host stuff rather than compute wide range of
             | application.
        
         | amalgamated_inc wrote:
         | I rewrote all my CLI scripts in Elixir, it's best in class IMO.
         | With Mix.install now it's just amazing. Fast, free and simple
         | concurrency, low startup time, great ecosystem, very good
         | system level abstractions and functions in the stdlib.
        
           | xcdzvyn wrote:
           | I completely agree with GP in that Elixir isn't really
           | _designed_ for CLI tools, but I agree with you that it does
           | happen to be great for it. I don't doubt there are some
           | facilities it lacks that would make ones life easier, but
           | overwhelmingly its standard library is more than sufficient.
        
         | brightball wrote:
         | One of the great things about Elixir is that it encourages you
         | to think of your application as the code that executed the
         | purpose of your system and everything else as an interface to
         | it.
         | 
         | So a web interface, an API interface, a CLI interface, etc are
         | all treated the same way since the code doing the work isn't
         | tightly integrated to any of them.
         | 
         | From that perspective, Elixir can be great for CLI.
        
           | lycos wrote:
           | Either I don't understand what you are saying, or this is not
           | unique to Elixir at all? Or both lol
        
             | brightball wrote:
             | With Elixir/Erlang the various BEAM nodes can connect and
             | call each other so the code internally tends to reflect the
             | same approach.
             | 
             | The equivalent approach in most other languages would be to
             | create a single web API and have everything talk to it via
             | REST, etc.
             | 
             | It's closer to thinking of everything having an RPC
             | interface by default I suppose.
        
               | dmix wrote:
               | And not all CLI tools are isolated UNIXy bins you
               | install. It could be an interface to a larger app running
               | on the system like a database.
        
             | thesneakin wrote:
             | It's not. I keep factoring my CLI scripts to something
             | that's very MVC. Everytime.
        
               | SirGiggles wrote:
               | brightball is perhaps alluding that the BEAM VM
               | environment itself is treated more as an operating system
               | within an operating system rather than just another
               | process in an operating system.
               | 
               | The BEAM VM is unique (at least compared to mainstream
               | languages) in that everything is run as a preempted,
               | stackful coroutine. The result is an environment
               | reminiscent of an operating system.
        
       ___________________________________________________________________
       (page generated 2023-01-08 23:00 UTC)