Threads for whjms

  1. 24

    Can we have a snarky version, to replace n-gate.com?

    1. 36

      I tried few-shot training GPT-3 by copying 4-5 HN headlines and their n-gate summaries into the prompt. Then I pasted some headlines from HN’s frontpage today:


      Microsoft Windows is prohibited at Gitlab

      Gitlab (business model: “Uber for Git”) has decided that it will no longer support Microsoft Windows (business model: “Uber for proprietary software”). Hackernews, who have all been using Macs for the past ten years and have never even heard of Windows, are shocked and appalled that anyone would use such a terrible operating system. They spend the next few hours patting themselves on the back for making the right choice, and then get into a heated argument over which text editor is the best.


      Bringing back the golden days of Bell Labs

      A New York Times article (business model: “Uber for articles about the good old days”) about an attempt to recreate Bell Labs (business model: “Uber for the telephone”) in Silicon Valley. Hackernews, most of whom are too young to remember the good old days, bemoan the fact that everything was better back then and that the world is going to shit. A few Hackernews try to explain to the others that the world has always been going to shit, and that things were never as good as they seem in retrospect.


      Alex Jones must pay $4m in damages for Sandy Hook hoax claims

      Alex Jones (business model: “Uber for bullshit”) has been ordered to pay $4 million in damages for claiming that the Sandy Hook massacre was a hoax. Hackernews, who have never heard of Alex Jones or Sandy Hook, spend the next few hours trying to figure out what a hoax is.


      Is DALL-E 2 ‘gluing things together’ without understanding their relationships?

      OpenAI (business model: “Uber for AI”) releases a new version of its DALL-E image-generation algorithm, which is able to generate images from textual descriptions. Hackernews, who are not sure what an algorithm is, spends the next few hours trying to figure out what an image is.

      1. 20

        A New York Times article (business model: “Uber for articles about the good old days”)

        Hackernews, most of whom are too young to remember the good old days, bemoan the fact that everything was better back then and that the world is going to shit.

        Alex Jones (business model: “Uber for bullshit”)

        Okay, I think it’s safe to say that GPT-3 just passed the Turing test with flying colours :-D

        1. 9

          This is pretty much perfect!

          1. 5

            This would be the only weekly newsletter I would subscribe to, awesome.

            1. 1

              These are so good that I’m almost tempted to ask for evidence that you actually ran these through GPT-3 instead of writing them yourself.

              I wonder how far are we from a Netflix comedy special that’s entirely performed live by an AI…

              1. 1

                I wonder how far are we from a Netflix comedy special that’s entirely performed live by an AI…

                We’re already there!

                Seriously though, these systems seem pretty nifty for brainstorming, but the extreme cost of re-training makes it difficult to generate something topical. Even OpenAI’s newest, biggest, most expensive text model (text-davinci-002) is running a year behind on training data.

            2. 2

              I tried replacing the GPT-3 prompt with:

              "Write a snarky one-sentence summary of the following article: %s\n\n"
              

              Here is the result. Not particularly snarky. Maybe GPT-3 needs to be shown an example of the tone in order to maintain it.

              1. 10

                Tried “Write a dark-humorous one-sentence summary of the following article:\n%s\n\n” on gpt-3 playground (using text-davinci-002) for the first few lines of https://github.com/hackergrrl/art-of-readme, and I got this:

                A dark-humorous one-sentence summary of the article would be: “The README file is a long-standing tradition of developers trying to be helpful, but really just annoying users.”

                1. 2

                  Please @nathell provide different toned variants like this!

            1. 2

              This was kind of mind-blowing. I’ll definitely be thinking about it next time I try charting/investigating metrics at work.

              1. 21

                This post has a worrying tendency to refer to “messages”, as in

                If I send() a message, I have no guarantees that the other machine will recv() it

                which may indicate the author is making a really bad newbie error: thinking that TCP honors write boundaries. It doesn’t. TCP doesn’t transmit messages, it transmits byte streams. The fact that you sent a particular string of bytes in one call doesn’t mean the receiver will read that same string in one call.

                What makes this conceptual error nasty is that during development TCP will often appear to work this way, because it’s common for each send() or write() to result in one packet if the two peers are on the same machine or same LAN and thus have very high bandwidth and low latency. (And assuming of course that your writes are smaller than an Ethernet frame.) Then you try your program across a longer distance and it breaks horribly.

                Even if you know better, this can cause problems, because over a LAN the code that decodes frames often isn’t being completely exercised, so you only test the “easy” case where you read complete frames… Then later on you find that your code doesn’t handle reassemble partial frames correctly. I’ve been bitten by this before.

                The more I work with networking code, the more I feel that no app developer should use the C socket APIs directly. They look straightforward, and you can build a trivial app without much fuss, but there are so many subtle behaviors and edge cases and platform variations that make it quite difficult to get solid shippable code.

                I totally made that mistake as recently as three years ago. I looked at libUV and said “ugh, this looks big and complex, I don’t need all that for my purposes”, and started rolling my own C++ code. I really wish I hadn’t. ☠️

                1. 8

                  I worked with a warehouse automation vendor who had operated with this misconception for decades. We asked them to implement a JSON protocol that resulted in messages bigger than 1500 bytes, and the ensuing back and forth trying to get them to understand you have to call read() in a loop was one of the most frustrating technical conversations I’ve ever had! They thought TCP was message-oriented, but didn’t even have the vocabulary to say that.

                  1. 4

                    The more I work with networking code, the more I feel that no app developer should use the C socket APIs directly.

                    I don’t mean to jump on this as I appreciate the sentiment. I think I’m just easily triggered by more and more areas coming under the “don’t roll your own crypto” banner. Of course: you really shouldn’t roll your own crypto. But do write your own implementation of well-defined systems so you can understand exactly how complicated it all is. And do write networking code using the C APIs, maybe even use raw sockets and see if you’re up to putting the various protocols’ headers together too. Don’t for goodness’ sake deploy it into production …

                    We need to keep practising these arts in some safe space so that we can learn where the sharp edges are.

                    1. 1

                      Yeah, I’m implicitly assuming ‘the reader’ wants to build something serious. Of course you can and should play with whatever APIs you want!

                      Personally, learning and using the C socket APIs is not something I’d do for fun. I did it because I was being paid to design and build a cross-platform product with a small footprint and the higher level libraries looked too big (and I think I was wrong there.)

                      Ideally we get rid of these APIs someday in favor of better ones, but Unix APIs seem to be damn near immortal unfortunately.

                    2. 2

                      Thanks for your advice. I wish these man pages came with this sort of info as well. It’s really quite impossible to write decent code where you cover all your bases.

                      1. 2

                        Let me recommend “Unix Network Programming”, a book I wish I’d had when I started working on this stuff — partly because it probably would have convinced me not to DIY. It makes a great doorstop too.

                        Oh, and FYI things get even more “fun” when you try to integrate TLS. Obviously you’d grab an existing library, probably OpenSSL, but it’s quite confusing to integrate into your own socket code. (Plus there are good reasons to use a platform’s integrated TLS lib instead, like Apple’s SecureTransport, because it’s tied into things like the device’s root-cert list and cert revocation. So that gives you multiple APIs to figure out…)

                      2. 2

                        I’ve seen a few systems that didn’t behave well when I synthetically flushed bytes to them one at a time.
                        In practice they seem to work more reliably. If you disable nagles algorithm, and your message fits within the TCP segment size, I think you can get relatively reliable message semantics.
                        That said, I haven’t written an application myself that relies on such behavior. Systems with strange maximum segment size settings might break things.

                        1. 1

                          I hacked together a webserver in C recently by following beej’s networking guide, and the level of appreciation I have for libraries that handle all the open/recv/select stuff for me increased immensely.

                        1. 18

                          I really don’t understand these things. A few of the online conferences during the pandemic had 3D things and they were vastly less efficient than a simple menu to navigate. I really liked GatherTown, but it explicitly gave a 2D top-down (8-bit Zelda-like) experience, which let me see a lot more of the environment than an immersive environment. The great thing about virtual environments is that they’re not limited to the constraints of real space.

                          Jef Raskin wrote that games are, by design, bad UIs. The simplest UI for an interactive game is a button that you press and then win. The point of a game interface is to hide that from you and make you do things that are more difficult to accomplish your task. Any time someone designs a UI that looks like a game, there’s a good chance that I’m in for a bad experience (even with GatherTown, I’ve managed to get lost in the environment and not be able to find the room I’m supposed to go to, which wouldn’t happen with a simple hyperlinked list of meeting rooms).

                          1. 7

                            I have to agree (not having used this interfaces tho!) IF people go to conferences, is trying to find the next room really what they want to replicate? Same with “3d offices” where avatars sit in meetings. Why would anyone want to replicate this experience?

                            In a few years we will see the “metaverse” (and other 3d envs) as the culmination of the low-interest rate twenty-teens exuberance. Along with fintech and NFTs.

                            1. 4

                              In a few years we will see the “metaverse” (and other 3d envs) as the culmination of the low-interest rate twenty-teens exuberance. Along with fintech and NFTs.

                              People have been playing MMORPGs and games like Minecraft for decades. World of Warcraft has been hugely popular and folks met lifelong friends and partners there. I think the ship has sailed on the 3d env part. NFTs and Fintech are not related to the post, but if you’re trying to be a cynical tech snarker, be my guest, that’s certainly not going away on the internet.

                              1. 2

                                I agree on games, I love games myself (but I don’t play MMORPGs). That’s daved_chisnall’s point too, game 3d works in games well, but games != work for the most part. 3D in games is not going away.

                                I think Meta would be more successful marketing 3d to Facebook - where people hang out after work (unlike our cynical set, people love Facebook! it’s where their friends are) but instead they needed to show “growth potential” and highlighted a dystopian 3d workplace. And the press dutifully reported it as “the future of work”. Just like they reported NFTs to be “the future of finance”.

                                I am not cynical by nature but it is obvious at lot of the mainstream press has been hijacked by people who are very very good at marketing bullshit.

                                1. 2

                                  I think Meta would be more successful marketing 3d to Facebook - where people hang out after work (unlike our cynical set, people love Facebook! it’s where their friends are) but instead they needed to show “growth potential” and highlighted a dystopian 3d workplace. And the press dutifully reported it as “the future of work”. Just like they reported NFTs to be “the future of finance”.

                                  But this has nothing to do with Meta. This is Mozilla Hubs, a 3D room project designed to run in the browser. Mozilla started on the project before Facebook rebranded to Meta. The project is FOSS and unlike Meta’s product or VRChat, is completely usable in the browser, and works well without a VR headset, even on your smartphone!

                                  I hate to ask, but did you go to the posted link? I really don’t see how criticisms of corporate marketing are relevant here unless you’re more interested in trying to make a point than read the link. From what I’ve seen most uses of Hubs has been for classroom experiences or social experiences, vanishingly little for work related ones.

                                  1. 1

                                    I was replying about the use of 3d in conferences and work in general and the difference between work and games. I agree discussing marketing is not on topic!

                            2. 6

                              Have you played something like Half Life Alyx? During one of my playthroughs, one of those spidery headcrabs of yore came swooping by. Instantly and as if through sheer instinct, I grabbed it mid flight and held it hanging by one of its legs. It looked seriously annoyed by the whole affair.

                              Swinging it around as if imitating the rotor blades of a helicopter worked just fine (albeit not with the desired woosh-woosh sound). Putting the crab inside of a bucket, and putting the bucket upside down on the ground had the crab-bucket crawl away. Experiences like that ‘sold’ VR as HCI for me. Nowhere in the process did I think of a ‘press G to grab’ or ‘F to pay respects’ like setup - “I” was the input, the ‘living data’ the interface.

                              One of the many demos I held here for poor unsuspecting chums, was via Valve ‘the lab’. It has this one part with a little robot dog running around being adorable. You could throw objects and it would scurry after them, return and placing them at your feet. Anyhow, for a lark someone kneeled down and tried to pet it. It rolled over and got some belly scratches. The person subsequently removed the HMD and snuck away for a crying session. Former dog owner.

                              Another chumette took a deep sea dive via ‘The deep’, where the schene of a sea floor slumbering whale skeleton transitioned into a starry underwater sky of glowing jellyfish. The person froze and shook in horror. Trypophobia apparently, who knew.

                              My point is that the right mix of these things can strike at something unguarded and primal; possibly also tap into cognition that sees deeper patterns in ongoing computing for inferences previously unheard of. What Hubs is doing here has the potential of doing none of that. Excel fame ‘The Hall of Tortured Souls’ meets VRML.

                              1. 6

                                For conferences i agree that an accessible top-down 2d design might be the way to go. But for groups of people just hanging around, expressing themselves, the extra degrees of freedom afforded by 3D VR spaces are invaluable. There is a reason people flock to VRChat: body language.

                                1. 2

                                  yeah it’s fun to shoot the shit with people you know in VR. the ability to see in 3D or grab virtual objects didn’t wow me, but seeing someone talk and gesture in VRChat (and being able to do the same) blew my mind.

                                  1. 1

                                    I think this is especially true for groups of people who have become familiar with each other’s physical presence in other venues, be it work in an office, meet-ups, or past conferences. Hard to scale any experience to large groups but not every technology has to scale to large groups to be a tool worthy of our use.

                                  2. 3

                                    Jef Raskin wrote that games are, by design, bad UIs. The simplest UI for an interactive game is a button that you press and then win.

                                    I wonder what he would think of things like Cookie Clicker…

                                    1. 1

                                      Or Progress Quest! http://progressquest.com/

                                    2. 1

                                      The great thing about virtual environments is that they’re not limited to the constraints of real space.

                                      We just have different constraints instead. When I’m in a shared space working on things, I can often walk over and start chatting with a friend. Some of my favorite experiences playing games or working on projects with friends has been the ability to just casually start a conversation. Yeah sometimes it meant that the project went nowhere and we went to beers, but that was a valuable, enjoyable experience. When I’m in a VC, there’s no such thing. I’m either broadcasting to the entire room or I’m not talking. Breakout rooms or sub-channels or whatever you want to call them just aren’t the same, you can’t form organic connection that way. On the other hand I have fond memories of chatting with a random person (eventual friend) at a personal hackathon about LaTeX even though most of the rest of the group had never used LaTeX for much at all.

                                      even with GatherTown, I’ve managed to get lost in the environment and not be able to find the room I’m supposed to go to, which wouldn’t happen with a simple hyperlinked list of meeting rooms

                                      Folks in XR/Metaverse/3D spaces talk about offering “cues” in rooms/scenes to help folks congregate, so this is a known pain point. Humans spend their whole lives in physical spaces and humans have been creating physical spaces for almost our entire history, so we know how this works very well. In metaverse, not so much. Also, this depends on the context. If efficiency is the goal, then sure, there’s no point getting lost. And perhaps when you’re working with someone for a large employer where your only point of union is that you are paid by the same large employer then sure, you want to get your work done and go home to your family/friends, so you just want to get into a meeting room and get done with it. But if encouraging serendipity of community is the goal, then getting lost in the environment is probably a bit more of a feature than a bug.

                                      Some of this I suspect is a personality thing. Some people treat digital spaces as specific places where they want to get things done; they want to make some progress on some code they’ve written, get their finances in order, watch the video they’re searching for. Others perhaps want to simply “roam” digitally. These folks are going to be the ones roaming around in MMORPGs or Minecraft worlds.

                                      Personally, working in the fully remote era of COVID has become quite alienating. In the past I met friends even partners through coworkers at work. Now, we see each other as talking heads or sources of audio, exchange some links, and get done with it. And having had a bout of COVID, I realize there are times when I want to be with friends of mine but travel is just not feasible. Chats and VCs are just not the same.

                                      I might be in the minority though. And yeah if you’re the “My life is rich enough with just my close friends and family” type, then virtual socializing probably will never be for you.

                                      1. 2

                                        Some of my favorite experiences playing games or working on projects with friends has been the ability to just casually start a conversation

                                        GatherTown, which I mentioned above, does this very well. As your avatar approaches someone, you hear their audio. As you get closer, you see their video. You can transition from this into a full video conferencing mode, or just have their video feed above.

                                        1. 1

                                          Yup I’ve used GatherTown and I’m a fan! I did find the 2D-ness of the thing a bit disorienting, but for work conference events I really enjoy it. I attended a pandemic birthday party in GatherTown and I enjoyed it quite a bit also.

                                    1. 1

                                      Impressive! Are you still using your OpenAI free credits? I like playing with it, but their fees add up quickly.

                                      1. 2

                                        I ran out of free credits - I spent $7.77 in June and $4.46 so far in July.

                                      1. 4

                                        I have used the c920 on a mac for years, and it has always been overexposed. I’m not sure whether it’s Logitech or Apple or both to blame here. The solution for me is to install the app “Webcam Settings” from the Apple store (yeah it’s a generic name), which lets you tweak many settings on webcams and save profiles for them. It’s not perfect, but I already have the camera and it’s significantly easier to work with than hooking my DSLR up.

                                        1. 5

                                          The equivalent to “Webcam Settings” on Linux is guvcview. I have a Microsoft LifeCam Studio and have to use this tool to adjust the exposure when I plug it into a new machine. Thereafter it persists… somehow.

                                          1. 6

                                            Or qv4l2, depending on your taste — but one advantage of qv4l2 is that it lets you set the controls even while another app has the camera open, whereas guvcview wants the camera for its own preview window, and will decline to work at all if it can’t get the video stream.

                                            1. 3

                                              Oh very nice, qv4l2 is exactly what I needed to adjust focus during a meeting. Thank you!

                                              1. 2

                                                update: someone anon-emailed me out of the blue to mention that guvcview has a -z or --control-panel option that will open the control panel without the preview window, letting you do the same thing as qv4l2. So use the one that makes you happy.

                                            2. 3

                                              Congrats, you are working around a hardware problem with a software patch.

                                              Me, I don’t care enough to spend the effort to get the software working. My audio input is an analog mixer, my audio output the same, and eventually my camera will be a DSLR because that way I don’t twiddle with software for something that really should just work on all my machines without me caring.

                                              Different tradeoffs in different environments.

                                              1. 8

                                                It’s a driver settings tool, not a patch. It doesn’t do post-processing. Every OS just fails to provide this tool, not sure why, possibly because webcam support is spotty and they don’t want to deal with user complaints. Some software (like Teams) include an interface for the settings. Changing it in Teams will make system wide changes. Others (like Zoom) only have post-processing effects, and these are applied after the changes you made in Teams.

                                                1. 2

                                                  I can confirm this tool definitely affects the camera hardware’s exposure setting. I’ve used it for adjusting a camera that was pointed at a screen on a remote system I needed to debug. The surrounding room was dark (yay timezones!) so with automatic exposure settings it was just an overexposed white blur on a dark background. This tool fixed it. There’s no way this would have been possible with just post-processing.

                                                  (No, VNC or similar would not have helped, as it was an incompatibility specific to the connected display, so I needed to see the physical output. And by “remote” I mean about 9000km away.)

                                                  1. 4

                                                    a camera that was pointed at a screen on a remote system

                                                    Sounds like you had some fun

                                                    1. 1

                                                      That’s definitely one way of describing it! Not necessarily my choice of words at the time.

                                                  2. 1

                                                    Oh, Teams can do this? Thanks, I’ll have to check that out as an alternative.

                                                  3. 6

                                                    The DSLR/mirrorless ILC (interchangeable lens camera) route is great for quality but it has its risks. I started off with a $200 entry level kit and now I’ve got two bodies, a dozen lenses, 40,000 pictures, and a creatively fulfilling hobby.

                                                    1. 2

                                                      don’t forget the tripod! I like landscape photography, and a good tripod was surprisingly (> $200) expensive.

                                                      1. 2

                                                        So the risks are spending too much money?

                                                      2. 1

                                                        I fail to see how you’re going to use a DSLR as a webcam without “twiddling with software”. Sure, you’ll have a much better sensor, lens and resulting image quality. But I’ve yet to see a setup (at least with my Canon) that doesn’t require multiple pieces of software to make even work as a webcam. Perhaps other brands have a smoother experience. I still question how this won’t require at least as much software as my route.

                                                        There’s also the physical footprint that matters to me. A webcam sits out of the way on top of my monitor with a single cable that plugs into the USB on the monitor. A DSLR is obviously nowhere near this simple in wiring or physical space. It also has a pretty decent pair of microphones that work perfectly for my quiet home office.

                                                        Are either the audio or video studio quality? Nope, but that’s completely fine for my use case interacting with some coworkers on video calls.

                                                        1. 1

                                                          My perception has been a DSLR with HDMI output gives you the ability to capture HDMI and just shove that as a webcam line.

                                                          The other things that a camera does can be tweaked with knobs instead of software.

                                                    1. 3

                                                      Thank you for sharing! I highly recommend that anyone looking for a critical view of AI systems read this paper. The cited works are also a good source of criticism.

                                                      Some random thoughts:

                                                      1. 32

                                                        Wheat is an advocacy post about pirating music doing on lobsters?

                                                        If you want to discover obscure new music, use Bandcamp instead of abusing some megacorporate streaming site.

                                                        1. 14

                                                          Wheat is an advocacy post about pirating music doing on lobsters?

                                                          While I’d agree it is a very bad look to be advertising music piracy in 2022, I’m not sure it is off topic. If the blog is giving the technical way the author moves bits of one form from one place to another and syncs it to a third, that would seem to generally be on topic for lobsters. While I would view that as theft if the original music was copyrighted, it seems the author would not (or at least does not care about it, if they do). They might also be looking for music that is in the public domain on Youtube, which would be more of a TOS violation than actual piracy.

                                                          You might compare this to the lobsters posts wherein Signal discovered vulnerabilities in Cellebrite’s software. That almost certainly violated the terms of service for the equipment and their reference to potentially including code that would exploit the vulnerability is extremely questionable, regardless of if you liked their reversing write-up (which I did).

                                                          Ultimately, what you and I view as wrong, the author might not care that they are publicly associated with, or they might be being very careful to avoid any actual copyright infringement. As long as their blog post focuses on the programming aspects, it would seem to be on topic. Somewhat ironically, looking at the author’s invitation tree, his grandparent is Napster (no relation to the software, just… found it ironic)).

                                                          1. 8

                                                            While I’d agree it is a very bad look to be advertising music piracy in 2022

                                                            The copyright mafia was very effective in its PR.

                                                            1. 5

                                                              While I’d agree it is a very bad look to be advertising music piracy in 2022

                                                              WTF does $CURRENT_YEAR have to do with anything?

                                                              1. 6

                                                                I could be wrong, but my sense is there was a lot more cultural acceptance of copying music and videos in the late 90’s/early 2000’s. That has since shifted to more of a desire to positively support artists ala Bandcamp (as other sibling comments are pointing to). I don’t see the same sort of cultural intrigue nowadays for youtube-dl as Napster got back then, for example.

                                                                Again, I could be wrong, but that’s why I included $CURRENT_YEAR as if it was meaningful.

                                                                1. 5

                                                                  There are many ways you can cheaply acquire music today, more than ever. There are fewer reasonable excuses for pirating.

                                                                  At peak Napster a song would cost $30 (inflation adjusted), cause you’d have to buy the whole CD, and a drive to a store.

                                                                  Even just 5 years ago you were less likely to find everything on Spotify. Today it’s just a given.

                                                                  1. 7

                                                                    Spotify is both DRM and lossy. Hardly a real option

                                                                    1. 5

                                                                      I think the popularity of Spotify/YouTube (and relative unpopularity) of products like Pono and Tidal has shown that most people don’t care about having lossy music. As someone who can’t tell the difference between MP3 at 320kpbs and lossless, I agree 🤷‍♀️

                                                                      1. 4

                                                                        People like to brag about their hearing capabilities, but in reality even lower bitrates than that are indistinguishable for even those people.

                                                                        Me and a few friends set up a blind test at a studio a few of us worked at. We all a good laugh and no one took it personally. But the myth of “maybe you don’t notice the difference, but I do” was burried that day.

                                                                        1. 1

                                                                          For me it’s not about if I can “hear the difference” it’s a principle. I can buy a CD and get lossless, so even if it “sounds the same” paying for an inferior product feels wrong.

                                                                          1. 3

                                                                            But the sound in the cd is digitally sampled with a cutoff frequency of 22khz and a limit of amplitude resolution of 16 bits. It is also lossy in the sense that is not the original physical sound. Those values were chosen based on the limits of human perception, much the same way as mp3.

                                                                            When CDs were created, it wasn’t technologically possible to cram a compression algorithm in a sound format.

                                                                            1. 1

                                                                              Sure. If they sold something less sampled I’d buy that instead I suppose

                                                                        2. 1

                                                                          I’ll listen to lossy music, but if I’m gonna pay why pay for the lossy one?

                                                                          1. 4

                                                                            If you’re going to completely ignore the entire content of the comment you’re replying to, why reply?

                                                                            1. 1

                                                                              I don’t mind paying for lossy music cause good music gets me vibing regardless of bitrate

                                                                        3. 4

                                                                          Even just 5 years ago you were less likely to find everything on Spotify. Today it’s just a given.

                                                                          Not at all. I found fairly little of what I looked for on Spotify. YouTube Music does a better job for my tastes, but I’m still carting around the dozens of GB of ogg files I ripped my collection into back in the 1990’s.

                                                                          1. 3

                                                                            Spotify doesn’t have 50% of the things I want to listen. Even if you listen to popular artists with millions of records sold all over the world, they rarely have their own collection available.

                                                                            Their catalogue was far more complete in their first five years or so. At that time, if an artist was featured there, it would have their whole catalogue down to obscure semi bootlegged releases. And small artists from all over the world would be included due to small local affiliations of local labels with with multinational ones.

                                                                            As soon as it started to became clear that services were the future of comercial music. The stakes got real and labels started making non-neglectible monetary demands. It is a commercial service, it will never offer that grassroots semi-clandestine source that real music afficionados like.

                                                                      2. 18

                                                                        Wheat is actually a grass.

                                                                        1. 7

                                                                          Downloading a private copy of stuff (for example on youtube) is a valid thing in germany. We pay a fee for each storage medium to the music industry for that.

                                                                          1. 4

                                                                            Nothing in the post os advocating piracy. It is you that are making the assumption that the author does not have the legal right to save the songs he finds on YouTube. But you have no way to make such assertion. You can’t assume that is the case just because it often is.

                                                                            If the technical procedure in the post could be used for piracy, that is off topic, and frankly a rather boring/old remark that less and less people care about at this day and age.

                                                                            I know it is not intentional , but you are unconsciently making a moral judgement based on arbitrary morals that you take as absolute and never questioned. Who defines what is piracy and why is it piracy? Why does such legal concept exist and to which extent does it make sense? Would you agree to pay a fee each time you sing in the shower?

                                                                            My parents need to pay a special tax to use a lighter “because matches manufacturing also had the right to be payed”. We find that ridiculous and outrageous today. But using a lighter was piracy back then.

                                                                            1. 7

                                                                              What is moral policing doing in a thread about transferring data? Flag: off-topic

                                                                              P.S. There’s an “archive” link under every post. Read the room.

                                                                              1. 1

                                                                                snej has the most highly upvoted comment, significantly more upvoted than the original article. Further “unkind” is a flag on lobste.rs. I would say you are the one who needs to read the room.

                                                                                1. 5

                                                                                  snej has the most highly upvoted comment, significantly more upvoted than the original article

                                                                                  The whole existence of lobste.rs was motivated specifically by a will to defy such flawed logic.

                                                                                  This site was set up so people couöd discuss things without the dictatorship of reading the room..so yeah, none of you should read the room. Fucos on the subject in discussion instead.

                                                                                  But I’ll agree with GP that moral policing is annoying and its presence in here is at least questionable. Regardless of how many people agree with it.

                                                                            1. 5

                                                                              For as much mud that gets thrown at Spotify, I’ve discovered an incredible amount of new music on it, which in turn has caused me to buy that music on Bandcamp.

                                                                              With that being said, if Bandcamp actually had the ability to create playlists, I’d drop Spotify in a second.

                                                                              1. 3

                                                                                yeah, I use both. spotify => track/follow new artists, bandcamp/itunes/… => actually buy music

                                                                                1. 1

                                                                                  The Bandcamp mobile app fairly recently gained the ability to create playlists (maybe only of purchased music?). I don’t think it’s great, and I don’t think their app is great as a player overall, but it is there.

                                                                                  1. 1

                                                                                    Huh, maybe I’m totally missing where, but I don’t see this. I see the option to play my purchased music or add it to the queue, but not organize into playlists.

                                                                                    1. 1

                                                                                      Ah, maybe it was just the queue I was remembering. I stopped using the app because it was kind of useless.

                                                                                1. 3

                                                                                  One thing that stands out to me about Morrowind is its dialogue. The game had some voiced lines, but most NPC dialogue was exposed via an old-school text system. This allowed the writers to stuff the game with lore for cheap, and IMO, it added a lot to the ambience.

                                                                                  Modern games do this with codex systems, but it feels cooler to just walk up to an NPC and ask them about the lore.

                                                                                  1. 3

                                                                                    Absolutely! It came at a perfect time. Fully voiced everything ended up happening almost right after, and that set expectations for AAA games going forward. Another side effect of fully voiced content was that making quest/narrative based mods was much more difficult in the later TES titles.

                                                                                  1. 1

                                                                                    For people who like vertical tab trees, I’d like to throw in a vote for Sideberry. It’s similar to tree-style-tab except configuration and UI is (IMO) simpler. unfortunately it seems to have issues persisting the tree structure between browser restarts, I’m not sure if this is just my machine being weird though.

                                                                                    1. 10

                                                                                      There are two things that get in the way of blogging: not having an inspiration on what to write, and having too many steps between wanting to write and publishing.

                                                                                      Static site generators are just automation to reduce the number of steps that you have to take. My current system (Pelican) reduces the steps to

                                                                                      • make newpost NAME=sometitle which opens a new text file in the right place with all the headers set up

                                                                                      • make rsync which commits it to the blog

                                                                                      Now all the hard part is between those two steps…

                                                                                      1. 7

                                                                                        I like SSGs, but the number of steps is not one of the reasons. Dynamic sites like WordPress have already got it down to

                                                                                        1. Go to your New Post page and type stuff
                                                                                        2. Press the Publish button

                                                                                        Oh, and as a recovering former feed-reader developer, I shuddered when the author described hand-editing the RSS feed. HTML is forgiving, XML isn’t.

                                                                                        1. 2

                                                                                          But WordPress also has these two steps:

                                                                                          1. Worry about the security and performance of your installation…
                                                                                          2. Go back to 1 a couple times per day.

                                                                                          With static site generation #2 drops to “repeat once per year” maybe.

                                                                                          1. 1

                                                                                            Totally! Which is why I dumped my WordPress installation years ago.

                                                                                          2. 2

                                                                                            I’ve found just using WordPress reduced the ceremony I was going through that made me less likely to write.

                                                                                            Unfortunately, WordPress is a full time job, but we decided to amortize the cost of running it by sharing a single instance between friends.

                                                                                          3. 3

                                                                                            yeah, it’s a lot easier for me to mess around with HTML/CSS etc. instead of writing stuff. given that I barely write things anyways I haven’t bothered looking into changing how my site is deployed in a long time.

                                                                                            1. 1

                                                                                              That sounds like as many steps as for any of the Jekyll installs I’ve used, if not more. To add a new entry to a Jeykll blog, I create a new text file in my favourite text editor with the correct name and I commit and push it with git. A post-receive hook rebuilds the blog. Generally I run jekyll serve locally for previews so that I notice if I’ve messed up the markup. I presume other static site generators use a similar model.

                                                                                              1. 5

                                                                                                To be clear, the ‘hard part between those steps’ is writing the post. Yes, all SSGs are approximately the same, or can be.

                                                                                            1. 25

                                                                                              Yeah yeah, mention Rust. Rust is too complicated to implement by one person.

                                                                                              I’m not sure that’s a practical metric by which to judge a tool. The C compilers that provide a practical foundation for modern software development were not implemented by one person either.

                                                                                              In general Turing completeness is necessary but not sufficient: it’s just one facet of what makes a language practically useful. There are many other properties that end up resulting in costs someone has to pay to use a language; e.g., is it memory safe, or will engineers and users alike be on the hook for an unknown number of egregious memory safety bugs?

                                                                                              1. 12

                                                                                                Also mrustc has been implemented mostly by one person.

                                                                                                1. 2

                                                                                                  I knew this would be brought up; you know the effort they’ve had to do to achieve this? An incredible amount.

                                                                                                  1. 8

                                                                                                    It’s 100K lines of code, and majority of it was developed over a 2-3 year period (with ongoing development to catch up with evolution of Rust). The number of commits and lines of code happens to be close to TCC:

                                                                                                    It does take a couple of shortcuts: it’s a Rust-to-C compiler (no machine code generation) and it doesn’t perform borrow checking (the Rust language is carefully designed to make it optional. Lifetimes are purely a compile-time lint, and don’t affect generated code or its behavior).

                                                                                                    I think overall in terms of implementation difficulty Rust is somewhere between C and C++. Parsing of Rust is much simpler than C++, and Rust has fewer crufty language features than C++ (there’s one way to initialize a variable), but some features are big-ish (borrow checker, type inference).

                                                                                                    How hard it is to implement mainly depends on how good quality of implementation you want to have. For example, LLVM is 85× larger than mrustc and tcc, with over 130× more commits. It’s a 20-year collaborative effort, likely not possible to do by a single person. The main rustc project is also maximalist like that, because it isn’t merely an effort to get Rust working, but to make it fast, efficient, user-friendly, well-documented, reliable, portable, etc., so much much more work went into it beyond just the language implementation.

                                                                                                    1. 2

                                                                                                      I cannot speak for mrustc, but 100k loc for tcc is bullshit. Just counting sources and headers in the top level, I get 55k loc (the remainder is taken up by tests and win32 headers). Close to 40k is taken up by target-specific code. The core compiler is about 10k loc.

                                                                                                      1. 1

                                                                                                        openhub stats I’ve quoted are for the whole repo, and I see 57K .c and 38K .h in there. This includes tests, so it’s indeed more than just the compiler.

                                                                                                        1. 2

                                                                                                          If I run a word count on everything in the ‘src’ directory of mrustc, I get about 130k loc. I therefore conclude that mrustc’s rust compiler is approximately 10x larger and more complex than tcc’s c compiler. Recall that tcc also includes assemblers and linkers, and supports many targets.

                                                                                                      2. 0

                                                                                                        I mean if 3 years is not a lot of effort then cheers to you! You must be an absolute coding beast.

                                                                                                        1. 15

                                                                                                          I feel like this is a fairly disingenuous and dismissive argument - your original post stated that “Rust is too complicated to implement by one person.” The comment you were responding to was making the point that not only is there an implementation of Rust by primarily one person, but a single-contributor C implementation is a comparable size and would theoretically take a similar amount of effort to implement. People here aren’t trying say it’s not a lot of effort, but that it does exist and you may be trivializing the amount of effort needed for a C implementation.

                                                                                                          1. 3

                                                                                                            Sorry, I didn’t mean to dismiss anything! Isn’t the statement still true if it’s been mentioned they still got help?… Regardless the general sentiment is right. I should have said instead that it’s not reasonable!

                                                                                                            I may very well be trivializing the effort for a C implementation. In my mind C’s type system, lack of borrow checker, and other features make its implementation maybe a magnitude easier. I could be completely wrong though and please elaborate if that’s the case!

                                                                                                            1. 4

                                                                                                              A non-optimizing C89 or C90 compiler is relatively simple to implement, with only minor inconveniences from the messy preprocessor, bitfields, parsing ambiguities of dangling else and typedef (did you know it can be scoped and nested and this affects syntax around it!?). The aren’t any things that are hard per-se, mostly just tedious and laborious, because there’s a lot of small quirks underneath the surface (e.g. arrays don’t always decay to pointers, sizeof evaluates things differently, there are rules around “sequence points”).

                                                                                                              There are corners of C that most users don’t use, but compiler in theory needs to support, e.g. case doesn’t have to be at the top level of switch, but can be nested inside other arbitrary code. C can generate “irreducible” control flow, which is hard to reason about and hard to optimize. In fact, a lot of optimization is pretty hard due to aliasing, broken const, and the labyrinth of what is and isn’t UB described in the spec.

                                                                                                              1. 3

                                                                                                                There are corners of C that most users don’t use, but compiler in theory needs to support, e.g. case doesn’t have to be at the top level of switch, but can be nested inside other arbitrary code

                                                                                                                It’s worth noting that, since you said ‘non-optimising’ these things are generally very easy in a non-optimising compiler. You can compile C more or less one statement at a time, including case statements, as long as you are able to insert labels after you insert a jump to them (which you can with most assembly languages). Similarly, sequence points matter only if you’re doing more than just evaluating expressions as you parse them.

                                                                                                                The original C compiler ran on a computer that didn’t have enough memory for a full parsed AST and so the language had to support incremental code generation from a single-pass compiler.

                                                                                                  2. 9

                                                                                                    LLVM was originally just Chris Latner. I think the question isn’t “Can one person build it?” It’s “Can one person build it to the point where it has enough value for other people to work on it too?”

                                                                                                    1. 5

                                                                                                      LLVM was originally just Chris Latner

                                                                                                      Several of the folks in / formerly in Vikram Adve’s group at UIUC would be quite surprised to learn that.

                                                                                                      1. 1

                                                                                                        I actually looked at Wikipedia first before my comment, but that made it seems like it was Latner’s project under Adve’s mentorship. I’ll take your word for it that it was a group effort from the start.

                                                                                                    2. 3

                                                                                                      This was my first thought as well. There are a lot of very useful things that are too complicated to be implemented by one person - the current state of Linux probably falls into that category, and I know that at least I wouldn’t want to go back to even a version from 5 years ago, much less back to a version that could have been implemented by a single person.

                                                                                                      1. 2

                                                                                                        …And there are a lot of useful things that are simple enough for one person to implement! :D

                                                                                                        1. 3

                                                                                                          Ha, I agree with that, was mostly just highlighting that I don’t feel like “too complicated to implement by one person” is a good reason to dismiss Rust’s potential usefulness.

                                                                                                          For myself, I originally got frustrated with Rust not allowing me to do things; eventually, I realized that it was statically removing bad habits that I’d built in the past. Now I love when it yells at me :)

                                                                                                      2. 1

                                                                                                        [Tool] is too complicated to implement by one person.

                                                                                                        I’m not sure that’s a practical metric by which to judge a tool

                                                                                                        I am. Short term, that means the tool will cost much less: less time to make, fewer bugs, more opportunities for improvement. Long term it means other people will be able to rebuild it from scratch if they need to. At a lower cost.

                                                                                                        1. 4

                                                                                                          The flip side of this is that the tool will do much less. A wooden hammer is a tool that a single person can make. A hammer with a steel head that can drive in nails requires a lot more infrastructure (smelting the ore and casting the head are probably large enough tasks that you’ll need multiple people before you even get to adding a wooden handle). An electric screwdriver requires many different parts made in different factories. If I want to fix two pieces of wood together than a screw driven by an electric screwdriver is both easier to use and produces a much better result than a nail driven by a wooden hammer.

                                                                                                          1. 1

                                                                                                            Obviously I was limiting my analysis to software tools, where the ability of a single person to make it is directly tied to its complexity.

                                                                                                            One fair point you do have is how much infrastructure the tool sits upon. Something written in Forth needs almost nothing besides the hardware itself. Something written in Haskell is a very different story. Then you need to chose what pieces of infrastructure you want to depend on. For instance, when I wrote my crypto library I chose C because of it’s ubiquity. It’s also a guarantee of fairly extreme stability. There’s a good chance that the code I write now will still work several decades from now. If I wanted to maximise safety instead, I would probably have picked Rust.

                                                                                                            1. 7

                                                                                                              Obviously I was limiting my analysis to software tools, where the ability of a single person to make it is directly tied to its complexity.

                                                                                                              My point still applies. A complex software tool allows me to do more. In the case of a programming language, a more complex compiler allows me to write fewer bugs or more features. The number of bugs in the compiler may be lower for a compiler written by a single person but I would be willing to bet that the number of bugs in the ecosystem is significantly higher.

                                                                                                              The compiler and standard library are among the best places for complexity in an ecosystem because the cost is amortised across a great many users and the benefits are shared similarly. If physical tools were, like software, zero marginal cost goods, then nail guns, pillar drills, band saws, and so on would all be ubiquitous. If you tried to make the argument that you prefer a manual screwdriver to an electric one because you could build one yourself if you needed then you’d be laughed at.

                                                                                                              For instance, when I wrote my crypto library I chose C because of it’s ubiquity. It’s also a guarantee of fairly extreme stability

                                                                                                              It also gives you absolutely no help in writing constant-time code, whereas a language such as Low* allows you to prove constant-time properties at the source level. The low* compiler probably depends on at least a hundred person-years of engineering but I’d consider it very likely that the EverCrypt implementations of the same algorithms would be safer to use than your C versions.

                                                                                                              1. 2

                                                                                                                I reckon amortized cost is a strong argument. In a world where something is build once and used a gazillion times the cost analysis is very different from something that only has a couple users. Which is why by the way I have a very different outlook for Oberon and Go: the former were used in a single system, and the cost of a more powerful compiler could easily outweigh the benefits across the rest of the system; while Go set out to be used by a gazillion semi-competent programmers, and the benefit of some conspicuously absent features would be multiplied accordingly.

                                                                                                                Honestly, I’m not sure where I stand. For the things I make, I like to keep it very very simple. On the other hand, If I’m being honest with myself I have little qualms sitting on a mountain of complexity, provided such foundation is solid enough.

                                                                                                                Do you have a link to Low*? My search engine is failing me.

                                                                                                                1. 2

                                                                                                                  Do you have a link to Low*? My search engine is failing me.

                                                                                                                  This paper is probably the best place to start

                                                                                                        2. 1

                                                                                                          The C compilers that provide a practical foundation for modern software development were not implemented by one person either.

                                                                                                          Right but there are many C compilers which were written by one person and still work. To me, that’s the important part. Thank you for your thoughts!

                                                                                                          1. 2

                                                                                                            Why is that important?

                                                                                                            1. 1

                                                                                                              It’s important because fast forward 300 years and no one uses your language anymore. It must be reasonable the future humans can write a compiler on their own if they want to run your program.

                                                                                                              I’m really trying to encourage people thinking beyond their lives in the software realm lately, just as we need to do the same for the ecosystem.

                                                                                                              1. 3

                                                                                                                trying to build software to last 300 years seems like it would limit hardware development
                                                                                                                and everyone implements C compatibility in their new hardware so that people will use it
                                                                                                                if people can figure out quantum computers and computers not based on binary, they’ll probably need to figure out what the next C will be for that new architecture
                                                                                                                if you want your software to last 300 years, write it in the most readable and easy-to-understand manner, and preserve it’s source so people can port it in the future

                                                                                                                1. 3

                                                                                                                  And this is why C is not good for longevity, but languages which are more abstracted. Thank you for that! Completely agree with what you’re thinking here.

                                                                                                                  1. 3

                                                                                                                    i don’t think the biggest blockers to software longevity is language choices or even hardware, it’s the economy/politics of it… long lasting anything doesn’t fit in well with our throw-away society, and since it can’t be monetized, the capitalist society snubs it’s nose at it

                                                                                                                    1. 2

                                                                                                                      Hehe, an interesting thread of thought we could travel down here. I’ll just say I agree to a degree.

                                                                                                                2. 3

                                                                                                                  Today’s humans were able to create Rust, so I don’t see why future humans wouldn’t. Future humans will probably just ask GPT-3000 to generate the compiler for them.

                                                                                                                  If you’re thinking about some post-apocalyptic scenario with a lone survivor rebuilding the civilisation, then our computing is already way beyond that. In the 1960’s you were able to hand-stitch RAM, but to even hold source code of modern software, let alone compile and run it, you need more technology than a single person can figure out.

                                                                                                                  C may be your point of reference, because it’s simple by contemporary standards, but it wasn’t a simple language back when the hardware was possible to comprehend by a single person. K&R C and single-pass C compilers for PDP-11 are unusable for any contemporary C programs, and C is too complex and bloated for 8-bit era computers.

                                                                                                                  1. 1

                                                                                                                    If GPT can do that for us then hey, I will gladly gladly welcome it. I’m not thinking about a post-apocalyptic scenario but I can see the relationship to it.

                                                                                                                  2. 3

                                                                                                                    It’s important because fast forward 300 years and no one uses your language anymore. It must be reasonable the future humans can write a compiler on their own if they want to run your program.

                                                                                                                    If you’re considering a person 300 years in the future then you should also consider that they will have tools 300 years more advanced than ours. 30 years ago, writing a simple game like space invaders was weeks worth of programming, now it’s something that you can do in an afternoon, with significantly better graphics. In the same time, parser generators have improved hugely, reusable back ends are common, and so on. In 300 years, it seems entirely feasible that you’d be able to generate a formal specification for a language from a spoken description and synthesise an optimising compiler directly from the operational semantics.

                                                                                                                    1. 1

                                                                                                                      You’re right, I haven’t considered this! I don’t know what to say immediately other than I think this is very important to think about. I’d like to see what others have to comment on this aspect too…!

                                                                                                                      1. 1

                                                                                                                        you should also consider that they will have tools 300 years more advanced than ours.

                                                                                                                        Unless there has been a collapse in between. With climate change and peak oil, we have some serious trouble ahead of us.

                                                                                                                        1. 5

                                                                                                                          In which case, implementing the compiler is one of the easiest parts of the problem. I could build a simple mechanical computer that could execute one instruction every few seconds out of the kind of materials that a society with a Victorian level of technology could produce, but that society existed only because coal was readily accessible. I’ve seen one assessment that said that if the Victorians had needed to use wood instead of coal to power their technology they’d have completely deforested Britain in a year. You can smelt metals with charcoal, but the total cost is significantly higher than with coal (ignoring all of the climate-related externalities).

                                                                                                                          Going from there to a transistor is pretty hard. A thermionic valve is easier, but it requires a lot of glass blowing (which, in turn, requires an energy-dense fuel source such as coal to reach the right temperatures) and the rest of a ‘50s-era computer required fairly pure copper, which has similar requirements. Maybe a post-collapse civilisation would be lucky here because there’s likely to be fairly pure copper lying around in various places.

                                                                                                                          Doping silicon to produce integrated circuits requires a lot of chemical infrastructure. Once you can do that, the step up to something on the complexity of a 4004 is pretty easy but getting lithography to the point where you can produce an IC powerful enough to run even a fairly simple C program is nontrivial. Remember that C has a separate preprocessor, compiler (which traditionally had a separate assembler), and linker because it was designed for computers that couldn’t fit more than one of those in RAM at a time. Even those computers were the result of many billions of dollars of investment from a society that already had mass production, mass mining, and large-scale chemistry infrastructure.

                                                                                                                          C code today tends to assume megabytes of RAM, at a minimum. Magnetic core storage could do something like 1 KiB in something the size of a wardrobe. Scaling up production to the point where 1 MiB is readily available requires ICs, so any non-trivial C program is going to have a dependency on at least ’80s-era computing hardware.

                                                                                                                          TL;DR: If a society has collapsed and recovered to the point where it’s rediscovering computers, writing a compiler for a fairly complex language is going to be very low cost in comparison to building the hardware that the compiler can target.

                                                                                                                          1. 1

                                                                                                                            Well, I wasn’t anticipating such a hard collapse. I was imagining a situation where salvage is still a thing, or where technology doesn’t regress that far. Still, you’re making a good point.

                                                                                                                            1. 4

                                                                                                                              That’s an interesting middle ground. It’s hard for me to imagine a scenario in which computers are salvageable but storage is all lost to the point where a working compiler is impossible to find. At the moment, flash loses its ability to hold charge if not powered for a few years but spinning rust is still fine, as is magnetic tape, for a much longer period, so you’d need something else to be responsible for destroying them. Cheap optical storage degrades quite quickly but there are archive-quality disks that are rated for decades. If anything, processors and storage are more fragile.

                                                                                                                              In the event of a collapse of society, I think it’s a lot more likely that copies of V8 would survive longer than any computer capable of running them. The implicit assumption in the idea that the compiler would be a bottleneck recovering from a collapse of society is that information is more easily destroyed than physical artefacts. This ignore the fact that information is infinitely copyable, whereas the physical artefacts in question are incredibly complex and have very tight manufacturing tolerances.

                                                                                                                              Of course, this is assuming known threats. It’s possible that someone might create a worm that understands a sufficiently broad range of vulnerabilities that it propagates into all computers and erases all online data. If it also propagates into the control systems for data warehouses then it may successfully destroy a large proportion of backups. Maybe this could be combined with a mutated bacterium that ate something in optical disks and prevented recovering from backup DVDs or whatever. Possibly offline storage will completely go out of fashion and we’ll end up with all storage being some form of RAM that is susceptible to EMP and have all data erased by a solar flare.

                                                                                                                              1. 1

                                                                                                                                It really depends on what we can salvage, and what chips can withstand salvage operations. In a world where we stop manufacturing computers (or at least high-end chips), I’d expect chips to fail over the years, and the most complex ones will likely go first. And those that don’t will be harder to salvage for various reasons: how thin their connection pins are, ball arrays, multi-layer boards requirements, and the stupidly fast rise times that are sure to cause cross-talk and EMI problems with the hand made boards of a somewhat collapsed future.

                                                                                                                                In the end, many of us may be stuck with fairly low-end micro controllers and very limited static memory chips (forget about controlling DRAM, it’s impossible to do even now without a whole company behind you). In that environment, physical salvage is not that horrible, but we’d have lost enough computing power that we’ll need custom software for it. Systems that optimise for simplicity, like Oberon, might be much more survivable in this environment.

                                                                                                                                C code today tends to assume megabytes of RAM, at a minimum.

                                                                                                                                In this hypothetical future, that is relevant indeed. Also, I believe you. But then the first serious project I wrote in C, Monocypher, requires only a couple KB of stack memory (no heap allocation) for everything save password hashing. The compiled code itself fits requires less than 40KB of memory. Thing is, I optimised it for simplicity and speed, not for memory usage (well, I did curb memory use a bit when I’ve heard I had embedded users).

                                                                                                                                I suspect that when we optimise for simplicity, we also tend to use less resources as a side effect.


                                                                                                                                Now sure, those simple systems will take no time to rebuild from scratch… if we have the skills. In our world of bigger and faster computers with a tower of abstraction taller than the Everest, I feel most of us simply don’t have those skills.

                                                                                                                                1. 4

                                                                                                                                  Now sure, those simple systems will take no time to rebuild from scratch… if we have the skills. In our world of bigger and faster computers with a tower of abstraction taller than the Everest, I feel most of us simply don’t have those skills.

                                                                                                                                  While it’s an interesting thought exercise, but I think this really is the key point. The effort in salvaging a working compiler to be able to run some tuned C code in a post-apocalyptic future may be significantly higher than just rewriting it in assembly for whatever system you were able to salvage (and, if you can’t salvage an assembler, you can even assemble it by hand after writing it out on some paper. Assuming cheap paper survives - it was very expensive until a couple of hundred years ago).

                                                                                                                                  Most of us probably don’t have the skills to reproduce the massive towers of abstraction that we use today from scratch but my experience teaching children and young adults to program suggests that learning to write simple assembly routines is a skill that a large proportion of the population could pick up fairly easily if necessary. If anything, it’s easier to teach people to write assembly for microcontrollers than JavaScript for the web because they can easily build a mostly correct mental model of how everything works in the microcontroller.

                                                                                                                                  Perhaps more importantly, it’s unlikely that any software that you write now will solve an actual need for a subsistence level post-apocalyptic community. They’re likely to want computers for automating things like irrigation systems or monitoring intrusion sensors. Monocypher is a crypto library that implements cryptosystems that assume an adversary who had access to thousands of dedicated ASICs trying to crack your communications. A realistic adversary in this scenario would struggle to crack a five-wheel Enigma code and that would be something that you could implement in assembly in a few hours and then send the resulting messages in Morse code with an AM radio.

                                                                                                                                  1. 1

                                                                                                                                    Most of us probably don’t have the skills to reproduce the massive towers of abstraction that we use today from scratch but my experience teaching children and young adults to program suggests that learning to write simple assembly routines is a skill that a large proportion of the population could pick up fairly easily if necessary.

                                                                                                                                    I feel a little silly for not having thought of that. Feels obvious in retrospect. If people who have never programmed can play Human Resource Machine, they can probably learn enough assembly to be useful.

                                                                                                                                    Perhaps more importantly, it’s unlikely that any software that you write now will solve an actual need for a subsistence level post-apocalyptic community.

                                                                                                                                    Yeah, I have to agree there.

                                                                                                                      2. 2

                                                                                                                        But why one person? I think we’ll still write software in teams in 2322, if we write software at all by that point instead of flying spaceships and/or farming turnips in radioactive wastelands. The software was written by teams today, and I think, if it needs to be rewritten, it will be rewritten by teams in the future.

                                                                                                                        1. 1

                                                                                                                          I would also be careful about timespans here. computers haven’t been around for a century yet, so who knows what things will be like 100 years from now? I don’t even know if it’s possible to emulate an ENIAC and run old punch card code on modern hardware, that’s the sort of change we’ve seen in just 75y. maybe multicore x86 machines running windows/*nix/BSD will seem similarly arcane 300y from now.

                                                                                                                      3. 1

                                                                                                                        Wouldn’t a published standard be more important to future programmers? Go might be a wonderful language, but is there a standards document I can read from which an implementation can be written from?

                                                                                                                    1. 22

                                                                                                                      🌎👩‍🚀🔫👩‍🚀

                                                                                                                      1. 3

                                                                                                                        😂😂🤣

                                                                                                                        1. 2

                                                                                                                          Yep. Sorry :-(

                                                                                                                        1. 2

                                                                                                                          Deno should help solve a lot of that, its API is close to the Web API, which encourages code sharing and reuse between client and server.

                                                                                                                          1. 6

                                                                                                                            The degree to which this is appealing to people has always puzzled me a bit. What code are you looking to share across client and server?

                                                                                                                            With the caveat that I personally do very little frontend development, nearly all the web-based systems I’ve worked on had only a tiny number of things that I could see would be valuable to share between client and server. Wire formats and validation logic are the two categories that come to mind.

                                                                                                                            For wire formats, you can use OpenAPI or gRPC or Thrift or whatever to share across client and server without even requiring the two sides to be written in the same language, and some of those tools will give you API versioning and other features too.

                                                                                                                            Validation logic totally makes sense to want to share, but it’s usually not a lot of code and optimizing for sharing it seems like it has limited benefit.

                                                                                                                            What else?

                                                                                                                            1. 3

                                                                                                                              if you have an existing SPA you can render most of it on the server-side then shuffle it back to the browser for display. then the browser loads the rendered state from the server and starts pulling in any other dynamic bits from your API in the background.

                                                                                                                              the biggest appeal seems to be the ability to re-use your existing SPA without rearchitecting everything from scratch. that said, I agree with OP in that this makes things pretty complicated.

                                                                                                                              1. 1

                                                                                                                                My personal use case, for instance, is that I do a lot of prototyping in Observable, a JavaScript Web-based notebook editor. Over the years I accumulated quite a bit of code (see for instance my personal standard library https://observablehq.com/@sebastien/boilerplate), and would like to run it outside of the just the browser. I really like the fact that the code can run from any browser, but that with tools like Deno and a bit of glue code I can run my most my notebooks standalone. It gives a lot of freedom and the ability to better reuse code across application domains

                                                                                                                            1. 1

                                                                                                                              does anyone know what a ‘root browser’ is? the readme links to https://root.cern/doc/master/classTRootBrowser.html which doesn’t explain much.

                                                                                                                              1. 3

                                                                                                                                Opening the main page (https://root.cern/) and then clicking on “Learn more” reveals more:

                                                                                                                                ROOT is a framework for data processing, born at CERN, at the heart of the research on high-energy physics. Every day, thousands of physicists use ROOT applications to analyze their data or to perform simulations. With ROOT you can:

                                                                                                                                • Save data You can save your data (and any C++ object) in a compressed binary form in a ROOT file. The object format is also saved in the same file: the ROOT files are self-descriptive. Even in the case the source files describing the data model are not available, the information contained in a ROOT file is be always readable. ROOT provides a data structure, the tree, that is extremely powerful for fast access of huge amounts of data - orders of magnitude faster than accessing a normal file.
                                                                                                                                • […]

                                                                                                                                So, it seems that this framework enables outputting physics-adjacent data into a file that can then be viewed by other means. The framework’s own tool for doing this, I’m assuming from the class’ placement in the reference hierarchy, is a GUI, whereas the uproot-browser is a TUI.

                                                                                                                              1. 7

                                                                                                                                I don’t understand the ergonomics of this shape of thing. It doesn’t look comfortable to use hunched over it on a table or your knees, and it looks too bulky to hold like an iPad for a long session.

                                                                                                                                1. 7

                                                                                                                                  It looks cool, but it seems more like a movie prop than something you would actually want to hunch over and use.

                                                                                                                                  1. 2

                                                                                                                                    Yeah, make it look more like the Atari Portfolio and I’m in! As the leader of the human resistance once said, they’d make “Easy money.”

                                                                                                                                  2. 4

                                                                                                                                    All “cyberdecks” are modelled after the TRS-80 Model 100/Alphasmart Dana. Looks cool, will ruin your neck.

                                                                                                                                    1. 2

                                                                                                                                      yeah if the keyboard+display were hinged then I might consider buying it but even as a toy it seems uncomfortable to use.

                                                                                                                                    1. 3

                                                                                                                                      I’m curious why you say you want a client-side library but don’t want a SPA. Also why you call React a complicated “framework” (it’s a library, and it’s definitely the least complicated out of the major players by far - you can complicate it as much as you want, but you don’t need to at all).

                                                                                                                                      You don’t need “MVC” for this project at all. You can also do this stuff with vanilla JS but it’s not going to be any easier than using React if you want to use real modern JS / DOM methods.

                                                                                                                                      TypeScript is only going to get you bugfixes for typing issues which isn not likely to be an issue for you, especially since you’re making something that is so small.

                                                                                                                                      I would recommend writing this on the server and not using JS at all. If you really feel like you need to use JS, you’re either going to want to learn about ES modules + modern DOM or just go with React.

                                                                                                                                      FWIW, here is the basic gist of a React-style list of messages with a button that calls some server:

                                                                                                                                      // Button.js
                                                                                                                                      
                                                                                                                                      const handleClick = async () => {
                                                                                                                                        // hit some backend server
                                                                                                                                        const response = await fetch('/something');
                                                                                                                                       
                                                                                                                                        // now you can do whatever you want with the result
                                                                                                                                        console.log(response);
                                                                                                                                      };
                                                                                                                                      
                                                                                                                                      const Button = () => {
                                                                                                                                        return <button type="button" onClick={ handleClick }>Do something</button>;
                                                                                                                                      };
                                                                                                                                      
                                                                                                                                      export { Button };
                                                                                                                                      
                                                                                                                                      
                                                                                                                                      //-----------------------------------------
                                                                                                                                      
                                                                                                                                      // Message.js
                                                                                                                                      import { Button } from './Button';
                                                                                                                                      
                                                                                                                                      const Message = ({ text }) => {
                                                                                                                                        return <p>{ text } - <Button /></p>;
                                                                                                                                      };
                                                                                                                                      
                                                                                                                                      export { Message };
                                                                                                                                      
                                                                                                                                      
                                                                                                                                      //-----------------------------------------
                                                                                                                                      
                                                                                                                                      // MessageList.js
                                                                                                                                      import { useEffect, useState } from 'react';
                                                                                                                                      // assuming you slap all of these in one components folder 
                                                                                                                                      // (not best practice, but it won't matter on a small page)
                                                                                                                                      import { Message } from './Message'; 
                                                                                                                                      
                                                                                                                                      const MessageList = () => {
                                                                                                                                        // initialize the local state here with an empty list
                                                                                                                                        const [ messages, setMessages ] = useState([]); 
                                                                                                                                      
                                                                                                                                        const getMessages = async () => {
                                                                                                                                          try {
                                                                                                                                            setMessages(await fetch('/messages'));
                                                                                                                                          } catch (err) {
                                                                                                                                            console.error(err);
                                                                                                                                          }
                                                                                                                                        }
                                                                                                                                        
                                                                                                                                        // grab new messages when this component is rendered
                                                                                                                                        useEffect(() => {
                                                                                                                                          getMessages();
                                                                                                                                        }, []);
                                                                                                                                      
                                                                                                                                        return (
                                                                                                                                          <ol>
                                                                                                                                            { messages.map(message => ( <Message text={ message } /> ))  }
                                                                                                                                          </ol>
                                                                                                                                        );
                                                                                                                                      }
                                                                                                                                      
                                                                                                                                      export { MessageList };
                                                                                                                                      
                                                                                                                                      //-----------------------------------------
                                                                                                                                      
                                                                                                                                      // App.js (this is setup for you with create-react-app
                                                                                                                                      // other imports here
                                                                                                                                      import { MessageList } from './components/MessageList';
                                                                                                                                      
                                                                                                                                      const App = () => {
                                                                                                                                        return <MessageList />;
                                                                                                                                      };
                                                                                                                                      
                                                                                                                                      // any other CRA autogenerated stuff
                                                                                                                                      

                                                                                                                                      I did this in this comment box so there could be an error here or there. Also keep in mind that there are different ways to do these things. You could render the message text as a child of Message instead of using a prop. You could export the Components as default. If you want to do this with testing, you’ll likely want to put each component inside of its own folder (named the same) and add a test for it in the same folder. You might want global state at some point, which you can do with passing props, using providers, using vanilla JS event-based pub/sub, or even getting into more complicated libraries for state management (I would avoid Redux, go with something simple like zustand if you really want to try this).

                                                                                                                                      Good luck.

                                                                                                                                      1. 1

                                                                                                                                        I’m curious why you say you want a client-side library but don’t want a SPA.

                                                                                                                                        SPAs seem like a tradeoff that complicates your code in order to reduce latency and allow offline use. Whereas my all-local system already has near-zero latency and works offline.

                                                                                                                                        Also why you call React a complicated “framework” (it’s a library, and it’s definitely the least complicated out of the major players by far

                                                                                                                                        A framework (IMO) is something you fit your code into, i.e. it tends to dictate how you structure your code and it usually ends up calling you. Whereas a library is something you call. Admittedly this gets imprecise in the context of a browser, which is itself a framework, and where there can be many layers.

                                                                                                                                        Having not used React, I think I was influenced by reading various people’s negative opinions of its complexity. I freely admit I don’t know what I’m talking about! I did start reading docs for React Native over the weekend, and it looks like a very good way to grow up into actual native apps someday.

                                                                                                                                        1. 3

                                                                                                                                          React doesn’t dictate any structure around your code. You could just as easily call it using the underlying functions behind the JSX if you hated JSX for whatever reason. FWIW react-native is a bit more complex than regular react (because of the native part). Regular react can be even simpler than the example I gave above.

                                                                                                                                          I would be extremely careful about listening to what others say about any library (including me!) and try it out yourself. You can mess around with any JS stuff in codesandbox.com without having to add anything to your own system.

                                                                                                                                          1. 2

                                                                                                                                            I’d toss in another vote for React! if your app is going to be very small, then it’s pretty easy to integrate it, as you can directly include the react libraries on your page and call them directly: https://reactjs.org/docs/react-without-jsx.html

                                                                                                                                            however, if you feel you need routing (e.g. if the user clicks on /settings, show them a settings page without actually refreshing the page), then you may find yourself with more restrictions, as your application is no longer just rendering HTML to a specific div but also managing history and intercepting user navigation.

                                                                                                                                        1. 2

                                                                                                                                          Seems cool, but mp3? What year is it?

                                                                                                                                          1. 4

                                                                                                                                            My guess is that it utilizes itch’s JS functionality to preview albums, like bandcamp. As a result, your browser needs to play the files, and probably FLAC isn’t as widely supported as mp3? Guessing, though…

                                                                                                                                            1. 3

                                                                                                                                              MP3 is indeed more widely supported in browsers but by a very small margin.

                                                                                                                                              https://caniuse.com/flac : 94% of marketshare support https://caniuse.com/mp3 : 96.6% of marketshare support

                                                                                                                                            2. 1

                                                                                                                                              what codecs do you prefer?

                                                                                                                                              1. 1

                                                                                                                                                FLAC if I’m paying money for music.

                                                                                                                                                Otherwise Opus