[HN Gopher] Babashka is a fast-starting scripting environment fo... ___________________________________________________________________ Babashka is a fast-starting scripting environment for Clojure Author : tosh Score : 126 points Date : 2022-12-08 15:54 UTC (7 hours ago) (HTM) web link (medium.com) (TXT) w3m dump (medium.com) | user3939382 wrote: | I've been looking for a good excuse to use Clojure, small shell | scripts sounds like a great low-risk way to do that. | eamonnsullivan wrote: | I used this for my back up system: | https://github.com/eamonnsullivan/backup-scripts | | The server runs on a Raspberry Pi with a 1-2TB USB disk attached. | charesjrdan wrote: | I think this is one of my favourite pieces of tech in the past | five years tbh. | | I still use bash for short <5 line scripts but everything else is | bb (though I've started looking into nbb because you can use node | libs like ink which seems pretty cool) | | And repl integration with neovim and conjure is great! | timdeve wrote: | I've been using it for quick web scrapping scripts and it's | really nice. | nerpderp82 wrote: | What libraries do you use? I do most of my scraping in Python | using beautifulsoup. | nathell wrote: | I plan to port my scraping framework (Skyscraper, | https://github.com/nathell/skyscraper) to babashka one day. | I'm not sure how easy it will be, though, since it uses | core.async (which I believe bb has limited support for) and | SQLite via clojure.java.jdbc. | noblepayne wrote: | As mentioned by the one and only Borkdude, bootleg is a nice | option for this. | | It includes the Hickory library: https://github.com/clj- | commons/hickory | | I'm a previous BeautifulSoup user and have found the | combination of (1) having the scraped data presented in plain | Clojure data structures, and (2) Hickory's built in | selectors, to be a very nice experience. | | Happy scraping! | timdeve wrote: | As other people have said Bootleg + Hickory. | | Here is an, admitedly not very clean, example that grabs | stream urls from hltv.org: | | https://github.com/TimDeve/.dotfiles/blob/master/scripts/gen. | .. | | Also a basic RSS reader using the clojure XML lib: | | https://github.com/TimDeve/.dotfiles/blob/master/scripts/gen. | .. | aeonik wrote: | Not OP but I use Reaver with good results. It supports all of | JSoup's selectors, and makes it very clean to extract data | from HTML. | | The documentation is a little lacking though, I had to look | up other examples on GitHub to figure out how to use all the | features. | | https://github.com/mischov/reaver | Borkdude wrote: | Babashka doesn't have a built-in HTML parsing library but it | supports it through pods: | | https://github.com/babashka/pod-registry | | Pods can be written in any language and they can expose | functions to babashka by implementing a protocol. | | One pod exposing HTML parsing is: | | https://github.com/retrogradeorbit/bootleg | | Here is an example of how to use that: | | https://github.com/babashka/pod- | registry/blob/master/example... | kopos wrote: | All our cron jobs and scripts with non trivial logic are in | babashka now. It has been a joyful experiences | bokchoi wrote: | Babashka is great! I've used it for doing some munging of csv and | xml files. | musha68k wrote: | I personally stopped using it since both shellcheck and jq fill | their own niches way too nicely "unfortunately"... | | None the less, a lovely tool and the couple of scripts I wrote | are mostly still in use and well maintained for a reason ;) | Clojure is just fantastic and so is the speed of the GraalVM. | __MatrixMan__ wrote: | The positivity in the comments here makes me want to learn | Clojure. Apparently it makes you happy. | sokoloff wrote: | I'm doing Advent of Code in clojure for the second year. It's | frustrating in some ways (learning the string-parsing to | process the inputs takes longer to learn in clojure than to | simply execute in C++, C#, or JS, but that's because I know | those other languages much better). | | But the pleasure of iterating towards the solution and building | and quickly testing each of the constituents is joy-inducing. | wry_discontent wrote: | That's funny because I've found the exact opposite. Most | everything seems to use roughly the same utilities, but | Clojure lets me move more quickly in getting the inputs | parsed correctly. | | For example, I often start with something like `(slurp | "inputs/day-2")` and keep wrapping that until I get a | structure I'm happy with. Then I split it into a few fns so I | can keep testing with the smaller input | sokoloff wrote: | I'm at the stage of using clojure for a total of perhaps 50 | hours, 40 of which has been in AoC 2021 or 2022 and no | prior JVM experience to draw on the java library ecosystem | fluidly (which is a massive strength of clojure, but one | that I'm poorly equipped to use). | | My solution times so far have scaled pretty heavily with | "how long did I futz around with parsing the input?" I did | well on days 3, 4, and 6, because the parsing was so | trivial and it was just a quick function composition. Day 5 | I spend entirely too much time parsing the input (In | retrospect, I probably should have just edited it into an | initial data structure in emacs.) | yladiz wrote: | Honestly, I think a good chunk of the challenge with a | lot of Advent of Code puzzles comes from parsing the | input. That's where I end up spending a lot of my time | too, especially when it needs something more than parsing | each line individually or reducing by lines. | capableweb wrote: | It absolutely makes you happy. Be beware, finding a language | that makes you too happy, can lead to you not wanting to | program in anything else anymore. You're better off being in | the middle of grumpy and happy, like a normal programmer. | lordgroff wrote: | Don't learn a Lisp. For one, you'll end up in endless arguments | whether your Lisp is a proper Lisp, and two, everything else | will look ludicrously constraining for no good reason. | yladiz wrote: | Lisp-1s are bastard children of the true Lisp-2s /s | the-alchemist wrote: | It's this really nice combination of bash, curl, and libraries | for JSON, CSV, ZIP files, and almost everything else you could | need. Full list at [0]. You can always spawn a shell too. | | It starts just as fast as Python too, if not faster, at least on | my machine: time python3 -c 'import os.path; | print(os.path.exists("README.md"))' time bb -e | '(.exists (new java.io.File "README.md"))' | | Python averages around 40-50ms, and bb averages 30-40ms. | | [0]: https://book.babashka.org/#built-in-namespaces | capableweb wrote: | > Python averages around 40-50ms, and bb averages 30-40ms. | | Sounds like you have a slow harddrive here, rather than | measuring the startup of the interpreters. | | With hyperfine: $ hyperfine --warmup=100 | --runs=1000 'python3 -c "import os.path; | print(os.path.exists('"'README.md'"'))"' 'bb -e '"'(.exists | (new java.io.File "'"README.md"'"))'"'' | Benchmark 1: python3 -c "import os.path; | print(os.path.exists('README.md'))" Time (mean +- s): | 5.3 ms +- 0.7 ms [User: 4.9 ms, System: 1.2 ms] | Range (min ... max): 4.5 ms ... 9.8 ms 1000 runs | Benchmark 2: bb -e '(.exists (new java.io.File "README.md"))' | Time (mean +- s): 6.0 ms +- 2.5 ms [User: 2.5 ms, | System: 4.3 ms] Range (min ... max): 0.4 ms ... | 10.6 ms 1000 runs Summary | 'python3 -c "import os.path; | print(os.path.exists('README.md'))"' ran 1.12 +- | 0.49 times faster than 'bb -e '(.exists (new java.io.File | "README.md"))'' | | Running on the following "not absolutely shabby" specs: | | > Intel i7-1185G7, 6.0.11-arch, Toshiba NVMe SSD (KBG40ZNS256G) | | Seems Python has more consistent startup performance (`4.5 ms | ... 9.8 ms`) while Babashka can startup faster (`0.4 ms ... | 10.6 ms`) but on average, Python startups faster. | pixelmonkey wrote: | This is a particularly joyful piece of open source software. | After seeing Michiel Borkent -- its author and writer of OP -- | present on it at a meetup, I wrote a tidy overview of babashka | (bb) which you can find here: | | https://amontalenti.com/2020/07/11/babashka ___________________________________________________________________ (page generated 2022-12-08 23:00 UTC)