1. 8

    Thanks for posting this article! It captures most of the major issues that have influenced me not to use Rust for more than toy projects (yet). (For me this is mostly tooling, integration, and lack of other implementations.)

    I do want to note one of the issues which the author “deliberately omitted” as not a real problem:

    ”Dependencies (“stdlib is too small / everything has too many deps”) — given how good Cargo and the relevant parts of the language are, I personally don’t see this as a problem.”

    While I definitely recognize the merits of the “small-stdlib” model, it makes Rust more difficult to use in some environments. In particular, environments that lack good Internet connections are difficult to develop Rust in.

    For example: I think this is one reason I haven’t seen Rust make much headway in scientific high-performance computing. It’s difficult to develop Rust on supercomputers! In HPC, it’s common to have large data centers which are actively used for at-scale development, but bandwidth to the outside world is low because simulation workloads almost never call out of the local network. Getting an HPC center to invest in a better Internet connection can be an uphill battle.

    Additionally, many of the institutions with the biggest influence in scientific computing (e.g., US national labs) do a lot of their work in completely air-gapped environments! Moving data to these environments is often a manual process which may include human approvals. Having done some work in such an environment myself, it provides a major incentive to use languages with large stdlibs or where your Linux distro already packages your deps. ;-)

    One way these environments manage this issue is local mirrors and package registries, and I’ve definitely seen local Docker registries as an enabler for HPC systems to start using containers. I’m hoping to see this eventually for Rust, but even the Cargo Book points out that “At this time, there is no widely used software for running a custom registry.”

    1. 5

      Perhaps I’m missing something, but… why do you need to build the software on the supercomputer?

      I work in a semi-related area (electronics design tooling and bulk-simulation), and we deploy our software as a full Python virtual environment. It’s effectively a big statically-linked blob, hosted on a shared NFS mount and executed as a normal Linux process on all of the hosts that run it. It only really depends on the system libc.

      Rust binaries are the same way, except they’re actually statically linked. I’m imagining that you could compile your code on a laptop using the break-room wi-fi if that’s what you need to do (Rust packages are typically not large downloads, and cargo caches them automatically) and then transfer the resulting statically-linked binary over the air-gap. As with our software, you’d only need to depend on the system libc.

      What am I missing here? Perhaps that’s not allowed for security reasons?

      1. 6

        Mostly it’s a pain, and it slows down the development process. Think of it as increasing your effective build time!

        Additionally, a lot of problems in this kind of development only manifest when you run at scale. A developer might get an interactive allocation with some small number of nodes (usually single-digit), do some small-scale runs and fix a bunch of bugs, then submit a larger job for a scale run. Find some more bugs, try to fix them, iterate and continue to scale up. After a certain point, doing all your development on the cluster itself becomes the less painful option, and a lot of HPC development tooling has been built out to enable this pattern.

        That’s not to say the “develop locally, deploy to the cluster” pattern doesn’t happen. It definitely does, especially when you have external collaborators. And a lot of secure sites also maintain smaller “open” systems with Internet connections to enable this. But even the “open” systems tend to have slow connections, again due to the bias towards software that doesn’t require the Internet as part of its operation.

        (Security can also be a concern! But that gets even more complicated and depends on exactly what you’re working on. The data-movement and workflow problems are a bit more general.)

    1. 1

      I want this database too, though not badly enough to write it myself.

      Since people are asking “why would you want this?” - I want to have (and to write) applications that store data locally - because as a user and as a developer I don’t want to have to set up and maintain a persistent server, and it would be nice to have control over my own data - but which can be used from multiple devices. Right now, the solutions for that suck.

      • You could write a file and sync it with Dropbox, but then you’re stuck writing your own reconciliation layer (or worse, forcing that on the user) when they get out of sync, and you’re exposed to all of the jankiness of file systems. Don’t forget an fsync!
      • You could use a sqlite database local to each device, but then you’re stuck writing your own reconciliation layer and your own syncing layer.
      • I guess you could try using Sqlite inside Dropbox, but that seems… unsupported and risky. Who knows whether Dropbox’s syncing might mangle your database or something.

      These options suck even if you’re only concerned about full Windows/Linux/Mac PCs, but if you want to have an Android or iPhone app too you’re really stuck with - at best - a self-hosted server that you have to maintain.

      1. 12

        I currently use MyFitnessPal for calorie-tracking and BigOven for recipe storage, and I cordially detest them both. They’re both buggy, slow, lacking a lot of features that I’d like to have, and “unmaintained” in that special SaaS way where vendors just stop fixing bugs or adding features once they have cash flow going. They also both cover like 80% of the same ground - BigOven has a way to calculate the nutrition numbers for a recipe but no daily calorie log, while MFP has no way to store recipes as anything more than a list of ingredients.

        I want to replace the pair of them with a lightning-fast local-first app, but I just never seem to get around to it.

        1. 2

          We have Fitatu here and it seems to do both, but yeah, it’s local really.

          1. 1

            I second detesting MFP, but I really haven’t found anything better. It’s one of the few services I use where the mobile app is really the only way to use it (they have a web app, which is completely unusable IMO). Also very frustrating that they don’t have a public API. I spent some time reverse engineering their mobile sync API, but gave up after a while…

            I did some research into making something similar, and found https://world.openfoodfacts.org/ as an interesting data source, but haven’t had the time/motivation to build anything yet.

            1. 1

              I’ve tried a whole bunch of MFP alternatives and I keep coming back to MFP (which I also do not like) because it just has more stuff in its database - I can scan almost anything I buy (in the UK) and MFP will know the nutritional details.

          1. 66

            So, I love Rust, and all of the nice things they say about Rust are true. Having said that, I’m now going to completely ignore the Rust angle and focus on something else that occurred to me.

            To summarize Discord’s problem - after extensively optimizing a Go service to produce minimal garbage, they found that the garbage collector was still triggering every two minutes (which appears to be a hard minimum frequency) regardless of the lack of garbage produced. Further, each GC sweep was expensive because it had to walk the entire heap full of live objects.

            The interesting point to me is that this use case (latency-sensitive service with extremely low rates of garbage production) was pathological for a tracing GC, and that optimizing it to produce less garbage made it even more so. Tracing collectors operate on every live object and ignore dead objects, so a heap full of live objects and very few dead ones is a bad fit for a tracing collector. They solved their problem by switching to a reference counting system (well, “reference counting” where everything has exactly one owner and so you don’t actually need to count). Reference counting ignores live objects and operates on dead ones, so of course it would be a better fit for this service. If Go had a collector based on reference counting they probably could have gotten much of the same benefit without rewriting.

            This reminded me of “A Unified Theory of Garbage Collection” by Bacon et. al, but it hadn’t occurred to me before how optimizing the app to produce less garbage could make the GC’s job harder in some ways. It’s still better to reduce garbage production than to not do so, but it may not give as much benefit as one might expect because of this.

            1. 3

              They solved their problem by switching to a reference counting system (well, “reference counting” where everything has exactly one owner and so you don’t actually need to count). Reference counting ignores live objects and operates on dead ones, so of course it would be a better fit for this service.

              Aside from your wider point, it’s a little more subtle than that, because of abstractions like Rc which give a counted reference to a value, meaning multiple references. There’s also Arc which is an atomic reference counter for use in multiple threads. The first simple Rust program I wrote, I was guided to using Rc, so it’s not even uncommon. Without seeing their code, I’m willing to bet there are plenty of such cases in their code.

              1. 6

                The first simple Rust program I wrote, I was guided to using Rc, so it’s not even uncommon.

                Do you mind sharing what you were trying to do? I’ve been writing Rust for a long time now, and I can count on one hand the number of times I’ve needed Rc. I’ve used Arc a fair number of times though. Still, I’d probably call both pretty uncommon. But there are certainly types of programs where they may be more common.

                1. 4

                  I’m currently making a game engine in Rust (rewriting my old Idris stuff) and I use it all the time, from day one. Some of it may be due to the problem at hand necessitating it, but some of it is surely my lack of experience in Rust. I think some of the problems might be solved with a more refined use of lifetimes… but I’ve been burned by structs+lifetimes before so I’d rather opt for something I have a better grasp of even if it’s more inelegant a solution.

                  For example, my game has a Timeline object, which is basically the central source of truth about important game data (stuff that has to be saved). But it’s not a regular field, it’s an Rc, because I need to share it with Scene objects (which actually run the game logic). I could make a complex messaging system to telegraph the state changes between Server and multiple Scenes but again… I don’t really wanna.

                  1. 2

                    Yeah I’ve never made a game engine, so it’s hard for me to know whether Rc is truly beneficial there. In any case, I’m mostly just trying to push back against the notion that reference counting is common in Rust code. (And specifically, Rc.) I was just very curious about the “first simple Rust program” that someone wrote where they were guided towards using Rc.

                    This is important because if reference counting were very common, then that would diminish the usefulness of the borrow checker. e.g., “What good is the borrow checker if you wind up needing to use reference counting so much?” Well, you don’t wind up needing to use reference counting a lot. There are of course many cases where reference counting is very useful, but that doesn’t mean it’s common among the entire body of Rust code.

                  2. 1

                    Just as an off-hand example from my experience: you basically can’t get anything done with GTK and Rust without Rc. Cf. https://github.com/bitemyapp/boxcar-willie/blob/master/src/main.rs#L108

                    I wrote boxcar-willie with assistance from the gtk-rs people.

                    Some common web-app stuff will force you into that too.

                    There are other situations and libraries that force it but these are the ones that come to mind from my own background. GUI apps and web apps already touches >80% of programmers.

                    1. 2

                      What part of web apps use Rc in Rust? There is more nuance to this. A better metric might be “of all the types you define in your project, what proportion of them use reference counting?” If you have to have one reference counted type among dozens of other non-reference counting types, then I’d say it’s pretty uncommon. For example, if most web apps have a database handle and then database handle uses an Arc to be efficiently shared between multiple threads simultaneously, and since database handles are pretty common in web apps, would you then conclude that “reference counting is common” in Rust? I don’t think I would. Because it’s doesn’t pervade and infect everything else in your code. There’s still going to be a lot of other stuff that doesn’t use reference counting at all.

                      The GTK case is indeed known, and was on my mind when writing the above comments. But it’s not clear to me that this is a GTK problem or whether it generalizes to “GUI apps.”

                      1. 1

                        Well usually it’d be an Arc, particularly in cases where the framework doesn’t provide a way to share data between request handlers.

                        I was just proffering where I’d run into it. I’m not trying to make some kind of polemical point. I rather like using Rust.

                        then database handle uses an Arc to be efficiently shared between multiple threads simultaneously, and since database handles are pretty common in web apps, would you then conclude that “reference counting is common” in Rust?

                        I’m speaking to peoples’ subjective experience of it and how they’re going to react to your characterization of it being rare. We’re not taking a pointer head-count here. You get someone comfortable with but new to Rust and have them spin up a few typical projects they’re going to say, “but I kept running into situations where I needed ${X}” and it doesn’t feel rare because it occurred at least a couple times per project. I’m personally very comfortable and happy with the performance implications of a handful of reference-counted pointers and everything else being automatically allocated/de-allocated on the stack or heap. That being said, if you use the wording like you used above, you’re going to continue to elicit this reaction if you don’t qualify the statement.

                        Edited follow-up thought: I think part of what’s needed here perhaps is an education push about Rc/Arc, their frequency in Rust programs, when and why it’s okay, and how it isn’t going to ruin the performance of your program if a few are floating around.

                        1. 2

                          My initial reaction was to the use of Rc. If they had said Arc, I probably would not have responded at all.

                          1. 1

                            I apologize for communicating and interpreting imprecisely. I mentally glob them together.

                            I think GTK is in fact the only time I’ve really used Rc. Everything else has been Arc I’m pretty sure!

                2. 1

                  The interesting point to me is that this use case (latency-sensitive service with extremely low rates of garbage production) was pathological for a tracing GC, and that optimizing it to produce less garbage made it even more so. Tracing collectors operate on every live object and ignore dead objects, so a heap full of live objects and very few dead ones is a bad fit for a tracing collector.

                  I wouldn’t draw a general conclusion from the behavior of the Go garbage collector.

                  Optimizing a system to produce less garbage is a standard optimization technique for the JVM and .NET.
                  It is effective on these platforms because they both use generational garbage collectors.
                  Long-lived or large objects are traced rarely or not at all.
                  The LMAX Disruptor, for example, allocates all memory at startup.

                  This technique isn’t effective for Go because the Go garbage collector forces a collection every 2 minutes.

                  Go uses a conservative non-generational GC.
                  Here are some of the tradeoffs of this design:

                  • Conservative - objects are never moved in memory and the heap is not compacted.
                    Interoperability with C is easier but heap fragmentation is a potential risk.
                    Memory usage is lower than with a generational GC.
                  • Non-generational - Generational garbage collectors can scan only recently allocated objects while ignoring old large objects. Most objects die young so this is often beneficial.
                  • Pause times may be lower than a generational GC.
                  • Lower implementation complexity.

                  Neither design is right or wrong but I would be leery of using Go for a high performance system.

                1. 16

                  Oof, I can relate to this. I’ve had the same loss of interest on some of my open source projects. I’ve been trying to power through it by making it a habit to at least check and respond to issues and pull requests. It’s helped, but not by all that much.

                  Sadly, the developer’s 6-week release schedule doesn’t seem to have worked, or at least not forever. exa made it to 0.9.0, but as of when I’m writing this comment there hasn’t been a commit for about six months.

                  1. 1

                    Tangent: I and my coworkers are all big fans of exa and have all aliased ls to it. Thanks!

                    1. 1

                      I’m glad you like exa (I use it as well) but I haven’t contributed to it myself.

                  1. 2

                    Tech-wise I’m at an odd place where I’m already pretty good at all the things that I do regularly and there isn’t an obvious next thing to learn. It’s hard to muster the energy to learn anything without any clear plans to apply it. There’s lots of things I could learn - GPGPU programming (more in-depth, I already know the basics), machine learning, formal methods, graphics, cryptography all seem interesting - but nothing stands out above the rest. So, nothing currently planned.

                    Outside of tech I hope to continue developing my cooking skills in general, and specifically I want to learn to make chocolates. I also want to play around with Scott Young’s ideas on Ultralearning so I’ll probably do both at once by practicing chocolatiering Ultralearning-style.

                    1. 17

                      Do not delete the path part of that URL, yikes.

                      Anyway, what is “Suckless”? That’s what I was trying to see, and instead got an image of a naked man holding a bottle of wine.

                      1. 16

                        For Suckless, see https://suckless.org/, not the users subdomain.

                        It’s a project/group related to cat-v and classical-unix/plan9 advocacy, rejecting tools that “suck” and wanting to replace them with “simpler” alternatives (dwm for window managment, st for terminals, dmenu for reading keyboard input, …). This often entails that configurations have to be applied pre-compilation and that the default distributions of various tools and projects are pretty lean – hence additional features are collected as patches, which are listed here, showing which can be successfully applied, and which can’t.

                        1. 4

                          I can report that dwm and st are great tools.

                          The only hitch is recompiling them after modifying their configuration files, which are written in C. Many people don’t like this. Some, like myself, don’t mind.

                          1. 3

                            I used st (off and on) for a while (~1yr), and for me the biggest annoyance was having to rebase some patches when multiple patches modify similar lines of code. Once that headache was resolved, it was generally OK unless some st commits triggered rebasing some stuff again. Basically it was all the fun of maintaining your own branch of st with patches someone else wrote.

                        2. 13

                          Suckless was in its heyday around the time of the systemd eruption, as far as I know. This would be around 2010. Slightly prior was this one weird viral video of an artist named Gunther, a self-styled “sex prophet,” who made the rounds with a (completely SFW in the most technical of senses, though apparently not germane to your sensibilities, bheisler, which is fine with me, thus this explanatory note to lessen the blow of freakishness herein) music video called “Ding Ding Dong.” Pop music beats, euro summer beach ditzy style. Not amazing, but pretty good, definitely unique. The naked man is that same gunther. Just wanted to clear that up, because this is a clear case of an overreaction to a misunderstood joke. As far as I know, the suckless community was and is to the extent that it still exists, pretty insular. Probably didn’t anticipate being posted on an HN style board

                          1. 7

                            Probably didn’t anticipate being posted on an HN style board

                            Lobste.rs has even “suckless developer” hat used by several people. Not quite buying the unanticipated part.

                            1. 1

                              Reasonable.

                              Would you, however, admit that Gunther, the individual who presumably is the man behind gunther.suckless org, is not the OP of this link?

                              In admitting this, if you do admit this, are you not therefore forced to agree with me that the post we’re discussing was not intentionally put forth as a display of nudity to eyes averse to that same nudity?

                              If a list of patches to utilities and other programs is hosted at a path of a subdomain which contains the image a naked man holding a vertical wine bottle (with suggestive verticality) is posted without awareness of the suggestive verticality of said bottle, then can’t we conclude that the proximate nature of that suggestively vertical bottle to said list of patches to utilities and programs is in some sense accidental, and therefore unanticipated?

                              By this argument, I intend to demonstrate that your claim, while seemingly reasonable, is eliding the quite clear nature of the circumstances, in an effort to maintain that all suckless developers and subdomain holders should be aware of all possible audiences for their online “speech” (or however you wish to define what the image is), when in fact it is absurd to believe that all speech of all suckless developers would be anticipated to agree with all possible audiences. I’m afraid that, unless Gunther appears to justify his position, we’ll have to remain in a misunderstanding silence regarding the reason why a suggestively vertical bottle and naked man are so closely associated with this list of patches.

                              I tried to explain it, because it seemed necessary to explain, to me. Perhaps one day, your doubt regarding this explanation will itself be exposed to the eyes of someone on a far away news site, and they will be as horrified as if they had seen a vertical and suggestively placed bottle.

                              1. 2

                                @varjag simply wanted to inform you that @FRIGN not only has an account here, but also has the [suckess.org developer] hat. So a lot of the community knows about Suckless (presumably not @bheisler, who asked the question in the first place).

                                I must confess to be in the same position as @bheisler. I knew of suckless, but had no idea what the linked page meant in context of that project.

                            2. 3

                              So the guy probably thought since he had the same name as this weirdo that for internet reasons (remember when memes were cool and unique signifiers of in-group identification?) it would naturally follow to have him around on the ol’ personal page

                              1. 2

                                Sorry for the long-winded explanation, but I miss the old web, and I am not even old! Would you, Herr heisler, have been hip to a tidy game of Flash-powered Sandspiel, even if it were on a subdomain of ebaumsworld?

                            3. 8

                              The suckless project makes and maintains a bunch of Unix programs that meet their definition of “sucking less” - http://suckless.org/philosophy/

                              I’ve been caught off guard by them offering personal subdomains on their site before, too - suckless.org is SFW, but any individual subdomain?

                              I use and like dwm when I can.

                              1. 17

                                They like to send mail from hosts with names like wolfsschanze. You can also see FRIGN’s opinion about diversity as shared on lobsters. Or the time someone pointed out there are torchlit marches at suckless conferences and someone else asked FRIGN to clarify and he basically admitted to being a white nationalist, complete with dogwhistles like “cultural marxism”?

                                I’m not saying that suckless is definitely a white nationalist organization but I am saying someone would have to do a lot of work to convince me otherwise.

                                1. 4

                                  Must we do this everytime someone posts something suckless related? Can we please just talk about technology instead of all this political nonsense and random accusations?

                                  1. 13

                                    Look, for every person who thinks this is “political nonsense and random accusations,” there’s at least one person who thinks this is so damning that they want literally nothing to do with suckless ever again.

                                    And despite Lobster’s general “politics is off-topic” policy, this thread is literally someone asking “what is ‘Suckless’?”, so if it’s on-topic anywhere, it’s here.

                                    1. 2

                                      Please see my reply above.

                                      1. 5

                                        Um. Welcome to lobsters? A couple of words to a wise guy:

                                        1. Your previous comment is not “above” this one. The whole tree gets reordered based on upvotes.
                                        2. That stream-of-consciousness-wall-of-text style may play well wherever @enkiv2 invited you from, but it’s gauche here. At least, I find it exhausting more than amusing.
                                        3. For heaven’s sake, please don’t feed the trolls! No matter how many big buckets of troll slop you may have handy.
                                        1. 0

                                          Thank you, minimax! – for your welcome, since it is utterly welcoming. A couple more words in response, and whether they contain a wisdom equivalent to my similar and apparently inherent quality of same is entirely your determination. I am so grateful to have run into an authority on these matters. Perhaps you can finally solve the trolley problem for us all, and divide good people from bad ones, as you scry into your palantir of forum posts.

                                          To wit -

                                          (1) My previous comment is in a tree of comments.

                                          (a) What is the precise and preferred nomenclature, such that an ignoramus could understand?

                                          (b) In the sense that a tree (such as this comment tree) goes from a single node to plenty of nodes, is it entirely inappropriate to say “above” in order to indicate, where n is the depth indicated away from the origin, trunk, root, or base of the tree, the position n - 1? I understand if your perspective is like the protagonist of Ender’s game, and you feel like n-1 compared to n is down, not up, but Ender held that of his enemies, and I am not yours. Are you mine?

                                          (2) I don’t care. Actually, like a total four-year-old, I feel an evil glee.

                                          (a) When you say, “stream-of-consciousness-wall-of-text,” you are committing a grammatical error by hypenating between “chunks” of words. One noun is “stream-of-consciousness” and the other is “wall-of-text,” and, while neither necessitates hyphens, it is an elegant stylistic choice, and redounds back upon my usage of “implied-by-you.” But the nouns you connected simply don’t need to be joined. In fact, they should be separated by a comma. I’m running out of breath just looking at it.

                                          (b) Gauche – what is the meaning of this word in the sense you’re applying?

                                          (b, cont.) John Ohno is no concern of yours in this regard, is he? What are you, a partisan of webbiness that wants to condemn hypertext? What beef could you possibly have with the guy? How do you even go from his proto-post-communism on the one hand and quasi-Ludditic radically conservative ideals of “small computing” on the other, to me? Am I to consider you as thinking that my response, “below,” (in opposition to ngoldbaum’s unfair condemnation of an entire ideal of technical practice in contemporary FOSS on the basis of his own flawed reasoning, equating cultural marxism, which predates the ilk whom ngoldbaum is, in abject ignorance, confusingly attempting to condemn, by about 45 years) the same as enkiv2’s opinions?

                                          (b, cont.) That you find it exhausting to read: good for you. :)

                                          (3) This would be humorless, except it is meaningless.

                                          Please, oh minimax, solve the trolley problem, since you know how to identify trolls and can give advice to the gauche. I am happy to lay on the tracks if you want to flip that switch to experimentally determine once and for all whether it is worth saving some arbitrary group of people as opposed to me. Regarding the basic subject matter at hand, which is suckless, and someone’s unfair-in-my-opinion (see how that’s grammatical?) condemnation of suckless, I should say that I find a policy of opposition to affirmative action intolerant. I support techne, and it follows that I support suckless. It does not therefore follow that I support what ngoldbaum very confusedly understands to be a persecution of the Jews by FRIGN. This seems absurd to have to point out, but here we are. Again: I find intolerance disgusting. I also find vendettas disgusting. Lastly, I find hubris disgusting. I am painfully aware that I, too, sadly lack the cleanliness that would come with an absence of this very quality. However, you have to admit, your hubris in judging me is incomparably greater than my hubris in defending myself against your allegations of . . .

                                          1. Being a “wise guy.”
                                          2. Having a “gauche” “style.”
                                          3. Having an exhausting and unamusing style.
                                          4. Feeding the trolls, in contradiction to the “sake of heaven.”
                                          5. Having handy “troll slop.”

                                          Your welcome is most welcome.

                                          And you’re welcome.

                                          Regards,

                                          Myself

                                          P.S.: “A couple of words” is merely a figure of speech! And you don’t have to type “um,” even if you habitually say it!

                                          1. 4

                                            This sardonic flippancy is tedious and unwelcome. Please treat others better than this.

                                            1. 2

                                              Noted

                                            2. 1

                                              (a) What is the precise and preferred nomenclature, such that an ignoramus could understand?

                                              I prefer to simply provide a link to the comment.

                                              (2) I don’t care. Actually, like a total four-year-old, I feel an evil glee.

                                              This is not a good attitude to have on Lobste.rs.

                                              (b) Gauche – what is the meaning of this word in the sense you’re applying?

                                              I’m not @minimax, but I would read it as “socially awkward”.

                                              (b, cont.) John Ohno is no concern of yours in this regard, is he?

                                              Actually he is, as he invited you and has a certain responsibility for that invitation.

                                              1. 2

                                                Yeah, um, @lettucehead, please don’t get yourself banned. I would not have invited you if I didn’t expect you to acknowledge community norms & practices.

                                                1. 0

                                                  I just saw your reply to this thread, and I want to thank you again for the invite, and assure you that I won’t be a troll or otherwise possess sardonic flippancy in the future. Well I will try to tone it down. A lot.

                                                  I still have all my questions from this thread (how the heck can somebody using the words “cultural Marxism” to discuss radical forms of Marxism having to do with culture, which are genuine phenomena, be considered an anti-Semitic “dogwhistle?” Why was I considered a troll for pointing out this exhausting and unfair absurdity? Will pushcx ever change his mind about my sardonic flippancy, and see it for the charmingly wonderful firehose of Furby-faced unicorns it really is? Like the center of a Tootsie Pop’s per-lick depth scalar, the world may never know)… Thus I have decided to just let it go. Or maybe I’ll start a tech blog and collect $20 from Drew DeVault.

                                                  I just wanted to make a splash. I will certainly be more careful moving fwd, and not imperil your reputation. Any further than you yourself do all the time with all the “small computing” heresies I hear you’ve been spreading among the faithful, turning Microsoft customers into the reprobate worshippers of Alan Kay. Tsk, tsk. Cheers

                                    2. 1

                                      Hey, because minimax decided to play mod with my “gauche style,” and I suspect he just disagrees with what he believes to be my assumptions about what you said, I have some further, legitimate, serious questions. What can you say to substantiate your reduction of the “stream-of-consciousness, wall-of-text style” (to use minimax’s phrase with my improvement) post by which FRIGN “[clarified,] and … basically admitted to being a white nationalist,” in the torchlit marches link, above?

                                      I’m honestly confused, I just don’t see how you get that from what he said. Can you, please, substantiate your reduction of what he actually said, to what you said he said?

                                      Or, can you remove your unnecessarily politicizing post, in violation of pushcx’s general wishes for this forum? I will happily delete (or respect the deletion of) my replies to it, so that we’re “even.” But let it be known, I do wish substantive answers because I am sincerely curious about your opinion and understanding, and would rather not have the kabosh put on a polite and principled discussion. We’re all crustaceans here, instead of denizens of the orange site, because the discussion is of a much higher quality. At least, that’s what I’m here for, and I care deeply about that.

                                      I should also add that I never would have been aware of any rift between certain members of this community were it not for one of your posts on almost the exact same subject several months ago, and while I have picked on specific points of contention regarding the “dogwhistles,” I was glad to receive the intelligence represented by your… saintly screeds… in this regard, both initially and now.

                                  1. 3

                                    Sounds like it doesn’t try to avoid redoing redundant work. Is this right?

                                    1. 2

                                      That’s right; just isn’t a replacement for make, it’s a replacement for those little pseudo-scripts I used to keep in my shell history.

                                      1. 1

                                        Does that mean that you’ll need make to build the project, and then just to run commands?

                                        1. 2

                                          In the Further Ramblings section at the end of the README, the author suggests using just to trigger all commands, including build commands, in a language-agnostic way. They link to just’s justfile, which has a build command that runs cargo build. So yes, if you are writing code in an ecosystem for which Makefiles are the best, you might end up using just to call make.

                                          But if you don’t like that pattern, you could use just only for small projects that don’t need building (e.g. ones written in Ruby or Python). Or you can run all your commands with make by defining .PHONY targets in your Makefile.

                                    1. 14

                                      I for one would be fascinated by a more extensive treatment of the subject.

                                      1. 4

                                        I’ll second that. I love reading about clever trickery to make code go fast, and I’ve just recently gotten interested in GPGPU stuff and this seems like both.

                                        1. 1

                                          Same, I would love reading about this. I’ve just begun dabbling in GPGPU (and SIMD) and reading about the journey and though process of others is very enlightening.

                                          If you end up writing this post, I’d like to request that you include some of your mistakes/dead paths as well. Reading about how others have failed helps me to learn.

                                        1. 3

                                          Writing a blog post that attempts to answer the question “how much can you trust benchmark results from cloud-CI pipelines like Travis?” (eg. as suggested by this post by BeachApe).

                                          Intuitively, you might think “not much”. Well, it turns out the answer is… “not much” - but I have numbers to prove it. Benchmark results from Travis-CI are substantially noisier than equivalent benchmarks taken from a regular desktop PC. Disappointingly obvious, but it’s nice to put some data behind the intuitive answer anyway.

                                          It does get me thinking about whether a sufficiently-smart benchmark harness (potentially some future version of Criterion.rs, the Rust benchmarking library that I maintain) could mitigate the effects of this noise and give reliable-ish numbers even in a cloud-CI environment though.

                                          1. 2
                                            • Left my old job doing line-of-business Java stuff for satellite communications companies and found a new one doing machine learning software for circuit designers. Quite enjoying myself so far.
                                            • Wrote a toy raytracer in Rust: https://github.com/bheisler/raytracer
                                            • Improved the JIT compiler in my NES emulator: https://github.com/bheisler/Corrosion
                                            • Started blogging at https://bheisler.github.io/
                                            • Took over maintenance and development of a statistics-driven benchmarking library in Rust called Criterion.rs. It’s a great tool but it was never officially released until I got to it a few months ago. I’ve learned a lot about community management and open source, partly by trial and error and partly by asking other project maintainers.
                                            1. 18

                                              Except the intermediate values are stack-allocated in Rust and C as well. This article claims that stack-allocated data is faster than heap-allocated as well, which is dubious without further clarification. malloc is indeed slower than pushing to the stack, and the stack will almost certainly be in cache, but this program is small enough that its working set will always be in cache so there should be minimal difference.

                                              I’m curious what the modular function is doing in Rust - the C implementation just uses a simple (n % 2) == 0 while the Rust code does ((n % 2) + 2) % 2 and it’s not clear why.

                                              1. 7

                                                ((n % 2) + 2) % 2 properly handles negatives, though it shouldn’t matter here.