News for hackers. Stuff that matters.
Re:Show HN: tere – A Faster Alternative to cd+ls by chrismorgan on Friday July 15, 2022 @05:53AM (#32106452)
`cargo tree` output:

  tere v1.0.0
  ├── clap v3.0.10
  │   ├── bitflags v1.3.2
  │   ├── indexmap v1.8.0
  │   │   └── hashbrown v0.11.2
  │   │   [build-dependencies]
  │   │   └── autocfg v1.1.0
  │   ├── os_str_bytes v6.0.0
  │   │   └── memchr v2.4.1
  │   ├── strsim v0.10.0
  │   ├── terminal_size v0.1.17
  │   │   └── libc v0.2.126
  │   └── textwrap v0.14.2
  │       ├── smawk v0.3.1
  │       ├── terminal_size v0.1.17 (*)
  │       ├── unicode-linebreak v0.1.2
  │       │   [build-dependencies]
  │       │   └── regex v1.5.4
  │       │       ├── aho-corasick v0.7.18
  │       │       │   └── memchr v2.4.1
  │       │       ├── memchr v2.4.1
  │       │       └── regex-syntax v0.6.25
  │       └── unicode-width v0.1.9
  ├── crossterm v0.24.0
  │   ├── bitflags v1.3.2
  │   ├── libc v0.2.126
  │   ├── mio v0.8.4
  │   │   ├── libc v0.2.126
  │   │   └── log v0.4.14
  │   │       └── cfg-if v1.0.0
  │   ├── parking_lot v0.12.1
  │   │   ├── lock_api v0.4.7
  │   │   │   └── scopeguard v1.1.0
  │   │   │   [build-dependencies]
  │   │   │   └── autocfg v1.1.0
  │   │   └── parking_lot_core v0.9.3
  │   │       ├── cfg-if v1.0.0
  │   │       ├── libc v0.2.126
  │   │       └── smallvec v1.8.0
  │   ├── signal-hook v0.3.13
  │   │   ├── libc v0.2.126
  │   │   └── signal-hook-registry v1.4.0
  │   │       └── libc v0.2.126
  │   └── signal-hook-mio v0.2.3
  │       ├── libc v0.2.126
  │       ├── mio v0.8.4 (*)
  │       └── signal-hook v0.3.13 (*)
  ├── dirs v4.0.0
  │   └── dirs-sys v0.3.6
  │       └── libc v0.2.126
  ├── regex v1.5.4 (*)
  ├── serde v1.0.134
  ├── serde_json v1.0.75
  │   ├── itoa v1.0.1
  │   ├── ryu v1.0.9
  │   └── serde v1.0.134
  ├── textwrap v0.14.2 (*)
  └── unicode-segmentation v1.8.0
I can easily look at each one of these and understand why it’s there, save only a few: most of crossterm’s recursive dependencies, which are fairly involved but the immediate dependencies at least are clearly explained in its README (and you could probably remove one or two of them at minor performance or similar costs); mio’s use of log, which I believe should be optional and I would say not enabled by default, but I’d rather use it with log than miss out on it, where it’s useful; uses of autocfg, which are build-time implementation detail for taking advantage of rustc features where available and readily understood on analysis; and I was going to say cfg-if, which I have a minor personal vendetta against due to extensive unnecessary use, but after looking at parking_lot_core’s src/thread_parker/mod.rs I will begrudgingly admit this is one of the rare cases where it is fairly well-justified. All up, none of the dependencies are in any way unreasonable.

Having over fifty dependencies for something like this is not in any way terrifying—you’re just starting with a different set of expectations and understandings of how things are done. It’s a natural and reasonable outworking of (a) using the right tools for the job, (b) doing things properly rather than half-heartedly (most obviously where terminal interactions are involved), and (c) Rust’s deliberately thin standard library.

Re:Show HN: tere – A Faster Alternative to cd+ls by reaperducer on Friday July 15, 2022 @09:44AM (#32108115)
hashbrown, smawk, corasick, parking_lot, itoa, ryu

Writing in Rust looks like casting spells in an Infocom game.

Gnusto rezrov!

Re:Show HN: tere – A Faster Alternative to cd+ls by mynameisvlad on Friday July 15, 2022 @10:58AM (#32108846)
Really? itoa is one of your "magic incantations"?

https://en.m.wikibooks.org/wiki/C_Programming/stdlib.h/itoa

I get the others, but that ones a pretty standard type converter, the opposite of the C standard atoi

Re:Show HN: tere – A Faster Alternative to cd+ls by nicoburns on Friday July 15, 2022 @04:15PM (#32112275)
In fairness, C standard library functions mostly look like magic incantations to me (I think due in large part to the old-school convention of abbreviating function names). malloc, sprintf, atoi, etc don't exactly read like english... (unless you happen to already know what they stand for)
Re:Show HN: tere – A Faster Alternative to cd+ls by mgunyho on Friday July 15, 2022 @11:03AM (#32108893)
Also, aho-corasick comes from the name of this algorithm that is named after its inventors https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm
Re:Show HN: tere – A Faster Alternative to cd+ls by enriquto on Friday July 15, 2022 @11:03AM (#32108894)
What is the point of this function? In rust, there's no equivalent to sprintf?
Re:Show HN: tere – A Faster Alternative to cd+ls by mynameisvlad on Friday July 15, 2022 @11:07AM (#32108935)
https://doc.rust-lang.org/std/fmt/

Different tools for the same job. One is explicitly integer to string conversion the other is sting formatting.

You can technically use the latter, but some prefer a function which explicitly does one thing and one thing only.

Re:Show HN: tere – A Faster Alternative to cd+ls by pie_flavor on Friday July 15, 2022 @02:20PM (#32111232)
More accurately, some prefer a function that is statically dispatched and does not talk to std::fmt::Formatter.
Re:Show HN: tere – A Faster Alternative to cd+ls by MichaelCollins on Friday July 15, 2022 @12:10PM (#32109592)
atoi is a classic example of the sort of bad naming C has long been infamous for. It's not a word, it's an initialism, and the common documentation for it doesn't even say what the initialism actually means. It's relatively easy to infer what it means from the description of what it does (ascii to integer), but can easily be incorrectly inferred ([character] array to integer.)

C kind of gets a pass for this stuff because C was old and in the early days they were limited by token size. But to still be using this term today in a new language seems fairly derisible.

Re:Show HN: tere – A Faster Alternative to cd+ls by jonnycomputer on Friday July 15, 2022 @10:37AM (#32108639)
I don't know much about Rust, but I have a hard time believing python's standard library wouldn't have all the required functionality covered (whether performance would be adequate is different question). I for one, really really like python for its comprehensive standard library.
Re:Show HN: tere – A Faster Alternative to cd+ls by chrismorgan on Friday July 15, 2022 @11:59AM (#32109475)
No, actually. Of the direct dependencies, Python’s standard library has equivalents of regex (re), serde/serde_json (json), clap (argparse) and the boring half of textwrap (textwrap, which is only suitable for ASCII, and possibly curses providing a buggy and incomplete version of Unicode- and column-awareness, but I’m not sure of even that much, and I don’t think it’s properly cross-platform either), and some parts of crossterm (curses, of uncertain availability and reliability). But it completely lacks equivalents of most of crossterm and textwrap, and all of dirs and unicode-segmentation, providing in the latter two cases only functionality pretty much exactly equivalent to what Rust’s standard library contains.

This is the sort of thing that I meant by “doing things properly rather than half-heartedly”. You could make something like this by reimplementing half the libraries in an inferior fashion, full of bugs, cross-platform inconsistencies and missing functionality. Or you can take an extra dependency. Even in Python, the recommendation would be firmly to add dependencies like appdirs for dirs and I dunno what for the rest.

Re:Show HN: tere – A Faster Alternative to cd+ls by wongarsu on Friday July 15, 2022 @11:11AM (#32108970)
Yes, Rust has a very different philosophy to the standard library. As soon as something enters the standard library its API is basically set in stone, since there's no versioning for the standard lib. As a consequence, Rust choses to keep a lot of "must-have" functionality in crates, where it can evolve and compete. (rather than just adding more and more HTTP clients to the standard lib like Python did :) )
Re:Show HN: tere – A Faster Alternative to cd+ls by mxben on Friday July 15, 2022 @11:37AM (#32109226)
> As soon as something enters the standard library its API is basically set in stone

Is that really all that different from Python?

Re:Show HN: tere – A Faster Alternative to cd+ls by chrismorgan on Friday July 15, 2022 @11:46AM (#32109332)
No, that’s the point: if you put this stuff in the standard library, it gets frozen forever, and that’s why Rust doesn’t.
Re:Show HN: tere – A Faster Alternative to cd+ls by infinityio on Friday July 15, 2022 @12:42PM (#32110043)
To quote the python developers guide:

> Because of Python’s conservative nature when it comes to backwards-compatibility, when a module is added to the stdlib its API becomes frozen.

So it sounds like they do do something fairly similar, but just a different mindset on adding libraries

Re:Show HN: tere – A Faster Alternative to cd+ls by nibbleshifter on Friday July 15, 2022 @11:52AM (#32109387)
Python is "batteries included", Rust isn't. Different design choices entirely.

You can do a lot with pythons stdlib, and a lot of popular libraries (requests, for example) largely are just usability wrappers for underlying stdlib stuff.

Whereas with Rust, you have a very minimal std, and things you want to achieve are imported specifically.

Re:Show HN: tere – A Faster Alternative to cd+ls by mixmastamyk on Friday July 15, 2022 @02:11PM (#32111137)
requests is a wrapper around urllib3, which re-implements quite a bit.
Re:Show HN: tere – A Faster Alternative to cd+ls by sayanarijit on Friday July 15, 2022 @10:52AM (#32108778)
As long as there's no need to ship standalone binaries without shared libraries.
Re:Show HN: tere – A Faster Alternative to cd+ls by mgunyho on Friday July 15, 2022 @11:04AM (#32108906)
Indeed, Python would be a good language to implement this in terms of ease of development, but it's very difficult to distribute a standalone binary (which I wanted to do). The built-in curses support of Python is also not cross-platform I think.
Re:Show HN: tere – A Faster Alternative to cd+ls by chrismorgan on Friday July 15, 2022 @12:12PM (#32109620)
It’s a funny thing I’ve noticed about scripting languages: they’re generally easier to get going with yourself, but they’re horrible for distribution/deployment, and if you have to integrate code written in other languages (even C libraries with Python bindings, or similar—things like wxWidgets or GTK), that rapidly escalates to a nightmare. Meanwhile, ahead-of-time compiled languages like Rust and Go are simply a breeze to distribute/deploy.
Re:Show HN: tere – A Faster Alternative to cd+ls by mgunyho on Friday July 15, 2022 @12:23PM (#32109764)
That's true, although I think in the case of Go, it is a central design decision to make single-binaries easy so it's more of an exception to the rule.

I don't think it's an inherent feature of scripting languages that they are hard to distribute. I'm pretty sure it's possible to package up a tiny Lua interpreter (or e.g. QuickJS) and all necessary scripts into a standalone file.

Re:Show HN: tere – A Faster Alternative to cd+ls by sayanarijit on Friday July 15, 2022 @02:39PM (#32111405)
Lua is only a configuration language without luarocks. With luarocks, we're back to the root of the argument - dependency vs standard library.
Re:Show HN: tere – A Faster Alternative to cd+ls by mixmastamyk on Friday July 15, 2022 @02:21PM (#32111244)
There are several working options for packaging Python apps, some existing for twenty years. Sure, while a little more complicated than compiling a static executable, it is hardly a "nightmare." It's basically writing a config file, and adding another stanza to a Makefile or modern equivalent.

Reminds me of the idea regularly pushed here that you need a virtualenv even for thirty-line scripts. I read these kind of takes here often and am a bit baffled by them. Maybe it is because developers have lost administrator skills over time, that this feels like an insurmountable challenge?

Re:Show HN: tere – A Faster Alternative to cd+ls by chrismorgan on Sunday July 17, 2022 @09:12AM (#32126466)
I’ve worked with several of those ways of distributing Python apps over the years, mostly under Windows with a little under Linux and macOS, and mostly around a decade ago now, though I’ve touched a very little non-Windows stuff in the last year or two. They’ve consistently been more work than they seem even if all your stuff is pure Python, and there are just caveats left, right and centre. All kinds of stuff that should be fundamental and built-in was just extra effort at every step. Hooking up resources in the .exe file, controlling the Windows subsystem stuff, adding a manifest that works, figuring out which MSVCRT redistributables you need and how to hook them up (and you can’t pretty much just couldn’t automate this in any way), finding what library files (.dll, .so, whatever) you need because of dynamic linking, fixing library.zip stuff that just mysteriously didn’t work for some libraries, special-casing stuff here and there for C dependencies, tweaking optimisation and compression levels to try to speed things up and shrink them since startup is unreasonably slow and the distribution unreasonably large but these tweaks are also inconsistent and often break things, adding files your program depends on in a place where they’ll work, tweaking your code because it runs differently under py2exe or py2app or pyinstaller or whatever, trying to figure out why what you’ve built just isn’t even starting on so-and-so’s machine…

Granted, a few of these things apply to Rust stuff as well (e.g. resources and manifests can’t quite be done out of the box without extra tools), but most of them are inapplicable, and the remainder tend to have better solutions than I observed in Python-land. And a lot of the pain that I’m describing of the Python stuff isn’t that it’s hard to do anything, but more that I’ve found it all just exceptionally error prone and unreliable.

Re:Show HN: tere – A Faster Alternative to cd+ls by sayanarijit on Friday July 15, 2022 @02:46PM (#32111480)
That static executable will basically contain the whole python interpreter with a huge standard library. Maybe makes sense for a gui app, but I'd avoid installing a whole python interpreter for each of my little cli tools.

Don't forget the startup time overhead of first loading a whole interpreter into memory, then loading a python program into the interpreter.

Re:Show HN: tere – A Faster Alternative to cd+ls by mixmastamyk on Friday July 15, 2022 @02:54PM (#32111563)
There are multiple options for these requirements as well. I understand that solutions are sometimes clumsy, but the end-user won't know the difference.
Re:Show HN: tere – A Faster Alternative to cd+ls by nibbleshifter on Friday July 15, 2022 @11:54AM (#32109407)
Standalone Python apps as binaries tend to be poorly performant, and huge (due to shipping an interpreter, stdlib, deps, etc) in my experience.

Assuming you get it working at all.

Re:Show HN: tere – A Faster Alternative to cd+ls by jonnycomputer on Friday July 15, 2022 @03:07PM (#32111702)
I'd prefer an informative rebuttal if people disagree with nibbleshifter, because I want to learn.
Re:Show HN: tere – A Faster Alternative to cd+ls by nibbleshifter on Saturday July 16, 2022 @07:17AM (#32116973)
I'm also kind of hoping someone comes along and says I'm wrong with a solution that doesn't suck tbh.