Threads for jrc

  1. 14

    I’ve learned, about myself anyway, that “frustrated” and “annoyed” are nice-sounding synonyms for degrees of anger, which in turn is always rooted in an inability to control something I want to control.

    I notice that sometimes I feel the same way about a programming task as I have about chess or ranked Starcraft. I haven’t the least doubt I can do it, but it’s so mentally taxing it’s not fun, it’s stressful.

    1. 1

      I feel like monospaced fonts are not optimized for long-form writing and reading. Monospace makes sense for code because of its structural characteristics/common need for alignment.

      1. 6

        I am certain that this is a topic that is a matter of individual taste and preference rather than objective superiority.

        i will also note that deciding that you need a proportional font severely limits your choice of editor, and if you don’t like those choices, word processors are the next step.

      1. 7

        I wonder if this is a backport of refactoring work done for Fleet. I kind of got the impression they were planning on eventually migrating all their editors’ features to Fleet so it could replace them all.

        https://www.jetbrains.com/fleet/

        1. 1

          As the article gets into the end of the story where the team inspires great new CI best practices, I found myself thinking- wait, can we still refactor MySQL?

          1. 5

            sys admins back in the day would always try to do as much as they could through PowerShell

            I was like.. huh? I still think of PowerShell as new. Time flies.

            1. 5

              Yes it matters.

              At least with C++ developers can slowly learn the more arcane part of the language language while they use it. A bit more difficult with Rust.

              Furthermore, it might be possible to implement some form of borrow checking for existing languages.

              Any language should be easy to learn. That’s true for C and python. Language popularity is highly correlated with ease of learning. And this is true for all the new languages out there that try to do fancy things: most developers do not care.

              Personally, all I would ever want, is something mostly like C/C++, with pythonic features, easier to read and use, faster to compile, without a GC, statically compiled, without sophisticated things.

              1. 17

                I wouldn’t call C easy to learn. It probably has less essential complexity than Rust has, but there’s still a lot of fiddly details to learn that wouldn’t come up in languages created decades later with garbage collection and better tooling and syntactic defaults.

                1. 9

                  A couple issues I found when wanting to learn C is all of the variation because of its history. What tooling should I use? Which conventions should I follow? Which version is the current version?

                  The various C standards are not conveniently discoverable and even when you map them out, they’re written in reference to past standards. So to get the set of rules you have to mentally diff K&R C with a handful of other standards published over 40 years, etc. Starting completely from no knowledge and trying to figure out “What are the complete set of rules for the most modern version of C?” is nearly impossible. At least that has been my experience and biggest struggle when trying to get started with C multiple times over the years.

                  Then I constantly see veteran C programmers arguing with each other about correct form, there seems to be far less consensus than with modern languages.

                  1. 5

                    I’d say C is easy to learn but hard to master. But that could be said about a lot of languages.

                    1. 2

                      I think there is a big difference to what is the absolute minimum you can learn.

                      You can “learn” C with programs that compile and run the happy path mostly correctly. The probably have tons of bugs and security issues but you are using the language.

                      Rust forces you to handle these issues up front. This does make the minimal learning longer but the total learning to be a “production ready coder” is probably actually shorter.

                    2. 15

                      Man, I was terrified when I was learning C++. I would stick to the parts I was “comfortable” with, but when I would call someone else’s code (or a library) I couldn’t reliably know how the features they used would intersect with mine. And the consequences very often were debugging core dumps for hours. I’m no Rust fanboy, but if you’re going to have a language as complicated as Rust or C++, I’d rather learn with one that slaps my hand when doing something I probably oughtn’t do.

                      1. 11

                        So, Nim once ARC lands?

                        1. 3

                          Is that not the case already ? I unfortunately do not use Nim often these days so I might be out of touch, but if I recall correctly arc/orc are available but not the default.

                          EDIT: Yeah, It seems to use ref counting by default currently but the doc advise to use orc for newly written code Cf: https://nim-lang.github.io/Nim/mm.html

                        2. 8

                          Any language should be easy to learn. That’s true for C and python. Language popularity is highly correlated with ease of learning.

                          All other things being equal, yes, ease of learning is good. But at some point one may have to sacrifice ease of learning to make the expert’s work easier or more reliable or faster or leaner. Sometimes that’s what has to be done to reach the level of quality we require.

                          If it means some programmers can’t use it, so be it. It’s okay to keep the incompetents out.

                          1. 8

                            I was mostly with you, but “incompetents” is harsh.

                            1. 4

                              Can we at least agree that there is such a thing as incompetent programmers? I’m all for inclusivity, but at some point the job has to get done. Also, people can learn. It’s not always easy, but it’s rarely impossible.

                              1. 4

                                There are, but generally they’re not going to be successful whether they use Rust or another language. There are inexperienced developers who aren’t incompetent but just haven’t learned yet who will have an easier time learning some languages than Rust, and there are also experienced programmers who simply don’t know Rust who will also have an easier time learning other languages than Rust. Since the incompetent programmers will fail with or without Rust, it seemed like you were referring to the other groups as incompetent.

                                1. 5

                                  Ah, the permanent connotation of “incompetent” eluded me. I was including people who are not competent yet. You only want to keep them out until they become competent.

                                  My original point was the hypothesis that sometimes, being expert friendly means being beginner hostile to some extent. While it is possible (and desirable) to lower the learning curve as much as we reasonably can, it’s rarely possible to flatten it down to zero, and in some cases, it just has to be steep.

                                  Take oscilloscopes for instance. The ones I was exposed to in high school were very simple. But the modern stuff I see now is just pouring buttons all over the place like a freaking airliner! That makes them much scarier to me, who have very little skill in electronics. But I also suspect all these buttons are actually valuable to experts, who may have lots of ways to test a wide variety of circuits. And those button give them a more direct access to all that goodness.

                                  In the end, the question is, are steep learning curve worth it? I believe that in some cases, they are.

                                  1. 3

                                    That makes sense. Thanks for clarifying. I don’t know if I have a strong opinion, but I do believe that there are cases that require extreme performance and that often requires expertise. Moreover, having been a C++ programmer for a time, I’m grateful that where C++ would accept a broken program, Rust slaps my hand.

                            2. 2

                              True. Ada Programming language easy to learn but not widely accepted or used

                            3. 4

                              At least with C++ developers can slowly learn the more arcane part of the language language while they use it. A bit more difficult with Rust.

                              I’m not sure what parts of Rust you consider “arcane”. The tough parts to learn, borrow checking and lifetimes, aren’t “arcane” parts of Rust; they are basically it’s raison d’être.

                              Any language should be easy to learn.

                              Ideally languages would be as simple/easy as they can be to meet their goals. But a language might be the easiest-to-learn expression of a particular set of goals and still be tough to learn – it depends on the goals. Some goals might have a lot of inherent complexity.

                              1. 3

                                If carefully aware of escape analyses as a programmer, you might realize that with Go, and, while programming Go for several years, I’m by no means a Go fanboy.

                                In particular, I conjecture that you could write a program in Go that does not use GC, unless the standard library functions you use themselves use GC.

                                I need to learn Rust, i realize, having written that prior sentence, and having been originally a C fan.

                                1. 6

                                  Personally, I would strongly recommend the O’Reilly “Programming Rust, 2nd ed.” For me it was a breakthrough that finally allowed me to write Rust and not get stuck. It may not be “perfectly shiny” what I write, but before that, I often stumbled into some situations I just couldn’t get out of. Now I understand enough to be able to at least find some workaround - ugly or not, but it lets me go on writing.

                                  Also, coming from Go (with a history of C++ long ago beforehand), one thing I had to get over and understand “philosophically” was the apparent lack of simplicity in Rust. For this, my “a ha” moment was realizing, that the two languages make different choices in a priorities triangle of: simplicity vs. performance vs. security. Go does value all 3, but chooses simplicity as the highest among them (thus GC, nulls, etc; but super approachable lang spec and stdlib APIs and docs). Rust does value all 3 too, but chooses performance AND security as the highest. Thus simplicity necessarily is just forced to the back-seat, with a “sorry, man; yes, we do care about you, but now just please stay there for a sec and let us carry out the quarrel we’re having here; we’ll come back to you soon and really try to look into what you’d like us to hear.” And notably the “AND” here is IMO a rather amazing feat, where before I’d assume it just has to often be an “or”. Also this theory rather nicely explains to me the sparking and heated arguments around the use of unsafe in the community - it would appear to happen around the lines where the “AND” is, or looks like it is, kind of stretching/cracking.

                                2. 2

                                  Personally, all I would ever want, is something mostly like C/C++, with pythonic features, easier to read and use, faster to compile, without a GC, statically compiled, without sophisticated things.

                                  I think you’re looking for Myddin (still WIP) or possibly Hare. Whether they’re “pythonic” is debatable though.

                                  1. 1

                                    Any language should be easy to learn.

                                    Not only easy to run. Easy. Because why would one make it difficult if it clearly can be made easy? The whole point of programming languages is providing simoler alternatives to the targets of their compilers.

                                  1. 22

                                    I’ve been complaining to banks for over a decade that they train people to fall for this kind of scam. They cold call their customers and require the customer to authenticate by providing information about the account, before the bank will tell you anything. At the start of the conversation, neither party knows that the other party is who they claim to be but the bank has a bit higher confidence because they’ve called a number that’s on file. The customer has absolutely know information in the other direction: they have the caller ID number, which can be forged, and absolutely nothing else. The burden should be on the bank to prove that they are the bank, at the start of the conversation.

                                    In the last year, Barclays has finally started doing something about it. The people that cold call you are now able to send a secure message through the app. If they call you, you log into the app, and see a message saying ‘hello, I am {person} from Barclays, I am talking to you on the phone’ then you know that one of the following is true:

                                    • They are from the bank.
                                    • They have compromised the bank’s back-end system.
                                    • They have compromised the device that you’re running the app on.

                                    Of these, the first is probably a safe assumption. If it’s the second, you’re completely screwed anyway in the short term, but it’s definitely the bank’s liability. If it’s the third then they have probably compromised the app to the extent that they could also instruct it to make transactions on your behalf, so there’s not much of a downside to talking to them.

                                    1. 5

                                      A few years back, a friend of mine was at the bank when he received a phone call from the corporate call centre of that same bank. He did trust the unsolicited call, so he turned it over the the assistant branch manager he was currently speaking with to confirm that this wasn’t a scam.

                                      Several weeks later, he got a call back from the branch manager confirming that it had been a legitimate call. It had taken their own security team that long to figure out whether or not their own calls were legit.

                                      1. 5

                                        My company just switched to SAP Concur for expense reporting. Soon after, I got an email asking me to complete my profile. The link went to “http://links.concurtechnologies.mkt7817.com/els/v2/XXXXXXXXX”. Going to mkt7817.com showed a generic Anti-Spam and Privacy statement. Nothing to do with SAP Concur, although there’s an “abuse@silverpop.com” email listed; silverpop.com gets bounced to “acoustic.com”, which talks about “Curating the Banking Experience.” Despite all appearances, it was a legitimate email.

                                        I have no clue why a purportedly experienced and professional company would think this is OK.

                                        1. 5

                                          100%. I just got a call from my local Chase branch the other day: “Hi this is Jack from Chase, I wanted to discuss your account.” A google of the phone number didn’t even link back to the bank. I told him I needed some verification.

                                          He sent me an email from his Chase email account that was verifiable, but I remember having the same feeling like, given the scams that are ongoing why would Chase communicate with customers like this as a policy?

                                          1. 4

                                            He sent me an email from his Chase email account that was verifiable

                                            How was it verifiable? I bet most Chase customers aren’t able to verify DKIM signatures reliably…

                                            1. 2

                                              Most are not, I’m a security engineer so it’s not a big deal for me. Actually I have Thunderbird set to verify DKIM automatically.

                                          2. 3

                                            The banks here have been doing electronic ID for about 20 years and I don’t recall getting a single call ever.

                                            I wonder what the scams here are like.

                                            1. 1

                                              Here it’s phishing email. The banks I’m with have clear communications, strong paper-based auth since before apps, and perpetual warnings about frauds everywhere.

                                              Their problems are with UX and shitlisting rooted androids/Sailfish’s android support, but scams are easy to pick up on cuz it’s all email.

                                              Or I’ve been lucky and only received those “support” calls from “Microsoft”.

                                            2. 2

                                              I’m not sure my banks have a phone number for me. If they tried to call me they would only get voicemail.

                                            1. 2

                                              What I’ve wanted to make for a long time is a kernel extension that given some config, makes any directories or files not in an exception list that are found to match ~/.* automatically appear to reside in ~/.config/.*

                                              I’ve given up all hope that my home directory’s hidden files will ever appear to be organized any other way. I’m not a systems programmer but from what I gleaned in “The Design of the Unix Operating System” this should be possible.

                                              1. 2

                                                You could do that with FUSE. I’m not sure what you gain, but it’s probably not too hard.

                                                1. 2

                                                  It drives me crazy when I see a file listing for my home directory and 80% of the entries are dotfiles that should be in .config, and 80% of those are dotfiles for programs that I need very rarely. These dotfiles obfuscate the important entries in my home directory that I’m constantly using. It’s not the end of the world but it’s very annoying, especially after many years.

                                              1. 1

                                                I’m surprised no one forked PHP and cleaned it up. You can’t beat PHP for web pages.

                                                1. 7

                                                  That happened! https://hacklang.org/

                                                  It seems like it’s mainly used at Facebook though …

                                                  1. 4

                                                    PHP is bad for webpages because it’s not a suitable HTML templating language and it uses file based routing. A suitable templating language is safe by default. Even the cool new PHP things all end up using some other safer language for templating. File based routing can be okay if it’s smart routing, like there’s some parsing of route info, a la Next.js, but PHP file based routing is dumb URL → page and you need to use Apache or whatever to make the routing acceptable. I guess someone could fork PHP to fix those issues, but that would just be Laravel, no?

                                                    What PHP has going for it is that it is very easy to get something to production quickly. This is a very important quality, perhaps even the most important for many uses. Still, for most new users today my recommendation is to just make a static site and host it on Netlify so you can collect form inputs or use Airtable for forms.

                                                    1. 2

                                                      it’s not a suitable HTML templating language

                                                      In light of laravel and symfony I don’t think that is true at all.

                                                      1. 3

                                                        Laravel has Blade, which is a superset of PHP because PHP is not a suitable templating language.

                                                        Symphony has https://github.com/symfony/templating which I guess is closer to pure PHP, but it sucks because you have to manually escape things.

                                                        1. 4

                                                          FYI the templating URL you’re linking to is Symfony’s templating language framework, not something intended to be used as-is. The actual templating language symfony and Drupal use is Twig, which is escaped by default.

                                                          1. 1

                                                            Thanks. I thought it was a mustache-like but Duck Duck Go failed me.

                                                          2. 2

                                                            And laravel is totally fine for me, it’s not like people started inventing Mustache, jinja and frameworks like Vue,React etc out of fun.

                                                        2. 1

                                                          it uses file based routing

                                                          Most serious projects use PHP frameworks that do not use file-based routing, it’s there at the lower level but that’s not really part of your development experience. You define routes very similar to the way you would in e.g. popular JavaScript frameworks.

                                                          1. 1

                                                            and you need to use Apache or whatever to make the routing acceptable.

                                                            That’s what I said.

                                                            1. 1

                                                              I guess I’m not understanding your point on how PHP’s native routing makes it bad for web pages. I’m guessing I disagree with you on something here but I’m not even sure what that is :) File-based routing is fine for very simple sites, and if you’re doing something more complex you have a framework that gives you more power. Isn’t this exactly the same as HTML+JS? Web servers use file-based routing too (unless you’re doing something fancy with JS) so it’s not really a weakness of PHP, that’s just how the web works.

                                                              1. 1

                                                                No, you want to separate routes from controllers in any kind of practical system. It doesn’t have to be a regex (although those are nice to have), but eg it should be easy to do /page/:id. In PHP, to do that, you have to leave PHP, go to your web server, configure that to send pages to index.php but include the original URL as a query parameter or something, go back to PHP and add code to unpack the information from the router, then do the actual routing. None of that is impossible, but it’s not the easy path, and the easy path should include /page/:id because that’s a minimum for a dynamic web server. If you only need static routing, just use a static site generator.

                                                                1. 1

                                                                  you want to separate routes from controllers in any kind of practical system

                                                                  I agree with you, and there is a case here that PHP could have some native routing support that would make the framework implementations of this simpler. But I would still say, the process you describe doesn’t really matter as a PHP dev because all of that is invisible and handled for you by any popular framework (routes and controllers are decoupled). Stuff like /page/:id I’m pretty sure I’ve been able to manage just through mod_rewrite e.g. /foo/id/3 gets matched to foo.php?id=3 – although forgive me if PHP did require something to make that work and I just forgot, I haven’t needed to set that up in a long time.

                                                                  1. 1

                                                                    Go back to the beginning:

                                                                    I’m surprised no one forked PHP and cleaned it up. You can’t beat PHP for web pages.

                                                                    The idea of this comment, as I understand it, is not “the PHP ecosystem is good” or “there are strong PHP frameworks”. It’s “PHP the language is really nice and convenient for making a dynamic website, and if someone could just go back and fix all the weird naming issues with the standard library, it would be perfect.” I disagree with that. My disagreement isn’t that good frameworks can’t be written in PHP. Laravel is very cool! It’s that the core language and standard library, even if you went back and fixed the inconsistent naming stuff, aren’t good enough to make a dynamic website for two reasons: 1. the templating is unsafe and you need Twig or something to fix it and 2. you need non-file based routing, or at least dynamic file routing, and to do that in PHP, you need to coordinate some hand off with your webserver.

                                                                    1. 1

                                                                      I think I understand the point better, thank you for clarifying.

                                                                      To that I would still say though, “good” must at some point be relative. Every language (that I’m aware of anyway) when used for the web, is primarily used with a framework. At least for any non-trivial project, which is arguably the use case that matters the most.

                                                                      By the standard and reasoning I’m taking away from this criticism, there are /no/ languages that are good at dynamic websites because if they were, none of them would need frameworks. Express.js and Django exist because JavaScript and Python aren’t perfect for web apps out of the box. In that sense this criticism of PHP seems tautological.

                                                                      1. 1

                                                                        Go’s standard library has an adequate templating library and router. It’s very common to use it without a “framework” although you will probably end up using some kind of third party packages for things like databases and sessions. I don’t think it’s unreasonable to think that “a cleaned up PHP” would come with a decent router and templating language.

                                                        3. 2

                                                          How so? Most web frameworks have a templated language that is the same form as PHP (erb, etc).

                                                          1. 1

                                                            Hm, what most web frameworks have server modules for Apache or nginx like php modules?

                                                          2. 1

                                                            It would be cool if someone forked it to a very small binary with a very aggressive strip. With things like auto loading or even OOP support removed. Something that could be used to build quick and dirty web interfaces. Perhaps even in microcontrolers.

                                                            The template capabilities are still, IMO, the easiest to use of any template engine out there. Because they just use the language constructs the programmer already knows.

                                                          1. 7

                                                            PHP got better, but JavaScript got amazing. I don’t think PHP will ever overtake JS as a language, so even though I think Laravel has some very cool ideas, I can’t imagine ever using it for a new project again.

                                                            1. 4

                                                              I think you may be overlooking Wordpress and similar solutions.

                                                              1. 8

                                                                WordPress is a very good way to make a site to hand off a site to semi-technical people who then mostly leave it alone for several years. If you are an actual web developer, it is a terrible experience.

                                                                1. 3

                                                                  make a site to hand off a site to semi-technical people who then mostly leave it alone for several years.

                                                                  It was this week when a friend contacted me that their Wordpress site made unexpected redirects to some bitcoin or pharmacy scam sites. They had auto updates activated and ran the latest Wordpress version, which is 5.9.2, but still their website got infected with malware, likely through some plugin though. I tried to run their site locally using docker-compose but Wordpress just died without any logs, only an error screen. In short, I always think that PHP is okayish until I have to use it. Giving non-technical people a wordpress makes them to administrators, if they want or not. Instead, they would be better off with something like a headless CMS (Jamstack) where they don’t have to fear getting infiltrated with malware.

                                                                  1. 4

                                                                    There’s not a lot that comes close to the delight of resurrecting someone’s crashed Wordpress site. The joys of having to wade through broken MySQL tables, getting a PHP setup that functions and digging through crash logs, yay!

                                                                    The only thing worse than that is trying to resurrect a broken custom PHP project that uses a framework that hasn’t been updated in a gazillion years and got broken due to a long-overdue PHP upgrade by the hosting provider, which now breaks because the ancient framework doesn’t support modern PHP.

                                                                    1. 3

                                                                      I got to rescue one of my favorite old comics from a botched PHP upgrade. :-) http://www.alessonislearned.com/ The site was borked so I emailed the creator and he gave me FTP access. I forget the details, but it was probably the PHP 7 MySQL thing.

                                                                    2. 1

                                                                      Yes, I think essentially no one but WordPress developers should self-host WordPress. It’s just not worth it. They all get hacked. Use one of the professional WP hosts and make it their problem.

                                                                    3. 0

                                                                      I’m not enough of a concurrency expert to debate your feelings around Python’s async and await, although I will say a tremendous amount of work is being done there and the community has embraced it with open arms.

                                                                      There’s a whole new wave of ‘modern’ Python projects that are async and type aware out of box.

                                                                      Again, NOT trying to harsh your JS buzz, just hoping for accuracy and transparency around where Python is at with this stuff.

                                                                      1. 3

                                                                        In JS, it’s trivial to take a callback based API and convert it to a Promise API.

                                                                        function promiseEventListener(el, action) {
                                                                          return new Promise(resolve => {
                                                                            el.addEventListener(action, resolve, {once: true})
                                                                          });
                                                                        }
                                                                        
                                                                        // elsewhere; this will block until someone clicks on it
                                                                        let event = await promiseEventListener(el, "click");
                                                                        

                                                                        Doing the equivalent in Python is non-trivial because you have to find the event loop, hope there are no other threads screwing things up, workaround the fact that Python first implemented a failed yield based API before the async APIs, workaround the lack of anonymous callbacks in Python… Async in JavaScript is just a quality of life improvement that you can opt into whenever you feel like writing a 3 line adaptor. Async in Python is an entirely different paradigm that has bad APIs.

                                                                        1. 3

                                                                          To be pedantic, you usually don’t need to be too worried about other threads screwing things up in the event loop. But that said you’re spot on. Concurrency in Python is a bit of an after-thought and something you very much have to opt-into. JS is effortlessly concurrent in a way that makes me jealous when I use Python.

                                                                          1. 1

                                                                            Been thinking about this a bit, and I see where you’re coming from here.

                                                                            One IMO interesting thing I’ll note and it MAY support your point WRT Python - what we’re seeing is a ton of library authors embracing async and abstracting away all those details, so users/developers don’t have to care.

                                                                            Like, FastAPI is async, and all its dependencies are async, but all the developer knows is their API is crazy pants fast, because the abstractions IT offers are really good.

                                                                            Also back to Javascript - I have kind of a hard time dis-associating any given programming language from the uses it can be put to. That may be a failure of imagination on my part.

                                                                            1. 2

                                                                              I have kind of a hard time dis-associating any given programming language from the uses it can be put to.

                                                                              Yeah, that’s kind of the silly thing about arguing about programming languages online. 99% of the time the choice of language is dictated either by a) the software that already exists at the company or b) the ecosystem that already exists in the world. There are usually some experimental things on the margin, but if you want to write something for domain X there will only be a handful of practical choices, maybe even only one or two.

                                                                    4. 5

                                                                      I’ve been writing JavaScript for 25 years and, I don’t want to say I “hate” it but… where to start.

                                                                      I don’t like the turtles-all-the-way-down thing going on with its objects, how almost none of your muscle memory is transferable for how objects vs classes work from almost all other OO languages, and just in general I find it very unpredictable. I find the execution model unpredictable, the scoping rules. No matter how many years go by my development method with it remains, write code and see what nuance of the language I either don’t know or forgot.

                                                                      I’ve had this conversation with other developers and they say, well it’s not fair to project your expectations from other languages on JavaScript, which I agree. I’m not saying the way it works is objectively bad, just that for me personally, I’m writing JavaScript to get my work done. I’m not having fun learning a new paradigm where the concept of OO is flipped on its head. That’s just slowing me down.

                                                                      Just a latest example, there’s some problem accessing this inside arrow functions. There’s some reason for that fine, but the bottom line is it’s not intuitive and that’s just 1 out of countless examples from over the years that I can’t remember.

                                                                      1. 1

                                                                        JavaScript’s rules for this were confusing and bad, and the solution is the arrow function, which fixes them. Similarly, scoping was idiosyncratic (function wide and hoisted) and let fixed it. (Const is dumb though, lol.) Basically all of the problems with ES5 have a good solution in ES6+.

                                                                      2. 3

                                                                        Which changes do you find particularly amazing?

                                                                        Been trying to feel the Javascript love of late and not succeeding very well outside of interactive in browser stuff where I can see it’s pretty expressive and fit to task.

                                                                        1. 4

                                                                          Every feature listed in the article is a feature of that JS had first. JS also has a very good system for async (unlike Python). I don’t really like Node or JS on the backend, but as a language, it has gotten quite good.

                                                                          1. 5

                                                                            I thought I was crazy, but I checked and it doesn’t look like all of these features are in js.

                                                                            Specifically:

                                                                            Matching and enums I’ve grown to especially miss (and if we’re making comparisons to python, python does have both).

                                                                            Still definitely a lot of features I’ve missed have come to javascript, but idk if I’m ready to say amazing yet.

                                                                            1. 3

                                                                              I am pretty sure TypeScript has most of those features, but yes, that is different than JS.

                                                                              1. 4

                                                                                If, one day, typescript is not something you have to bolt on top of existing frameworks (or use stuff like deno for in-runtime support), we can start talking about typescript as JS.

                                                                                1. 1

                                                                                  Typescript has sum types, enums, and constructor parameters, but doesn’t have multiple catch, match expression, or spaceship.

                                                                        1. 23

                                                                          Is a language good because it has many features? My current thesis is that adding features to languages can open up new ways to encode entire classes of bugs, but adding features cannot remove buggy possibilities.

                                                                          1. 23

                                                                            If you have a foot-gun in your arsenal and you add a new safe-gun, sure, technically that’s just one more way you can shoot yourself in the foot, but that’s missing the point of having a safe-gun.

                                                                            Many features can be used as less bug prone alternatives to old constructs. E.g., match expression instead of a switch statement where you could forget the assignment or forget a break and get unintentional fall-through. Same way features like unique_ptr in C++ can help reduce bugs compared to using bare pointers.

                                                                            1. 12

                                                                              Another thing worth mentioning is that PHP has also grown some good linters that keep you away from the unsafe footguns. I believe it’s gotten really good over the years.

                                                                              1. 7

                                                                                Just to fill this out:

                                                                                Psalm

                                                                                PHPStan

                                                                                EA Inspections Extended

                                                                                Sonar

                                                                                I actually run all of these. Obviously no linter is perfect and you can still have bugs but if you’re passing all of these with strict types enabled, you’re not writing the bad amateur code that got PHP it’s reputation from the “bad old days”. PHP’s not perfect but it’s no more ridiculous than, say, JavaScript, which curiously doesn’t suffer from the same street cred problems.

                                                                                1. 6

                                                                                  …JavaScript, which curiously doesn’t suffer from the same street cred problems.

                                                                                  I see what you’re saying, but JS actually does kinda have serious street cred problems. I mean, there are a ton of people who basically view JS programmers as second-class or less “talented”. And JS as a language is constantly mocked. I think the difference is that JS just happens to be the built-in language for the most widely deployed application delivery mechanism of all time: the web browser.

                                                                              2. 1

                                                                                It’s not as if match replaced switch; and why did it have default falkthrough to begin with, whilst match doesn’t?

                                                                                1. 2

                                                                                  It’s probably just taken verbatim from C. It’s funny because PHP seems to have taken some things from Perl, which curiously does not have this flaw (it does allow a fallthrough with the next keyword, so you get the best of both worlds).

                                                                                  1. 1

                                                                                    Switch has been in PHP since at least version 3.0 which is from the 1990s. Match doesn’t replace switch in the language but it can replace switch in your own code, making it better.

                                                                                2. 15

                                                                                  I disagree. People saying this usually have C++ on their mind, but I’d say C++ is an unusual exception in a class of its own. Every other language I’ve seen evolving has got substantially better over time: Java, C#, PHP, JS, Rust. Apart from Rust, these are old languages, that kept adding features for decades, and still haven’t jumped the shark.

                                                                                  PHP has actually completely removed many of its worst footguns like magic quotes or include over HTTP, and established patterns/frameworks that keep people away from the bad parts. They haven’t removed issues like inconsistent naming of functions, because frankly that’s a cosmetic issue that doesn’t get in the way of writing software. It’s very objectionable to people who don’t use PHP. PHP users have higher-priority higher-impact wishes for the language, and PHP keeps addressing these.

                                                                                  1. 2

                                                                                    removed many of its worst footguns

                                                                                    or the infamous mysql API (that was replaced by mysqli)

                                                                                    edit: Also I like that the OOP vs functional interfaces keep existing. My old code just runs and I get the choice between OOP and functional stuff (and I can switch as I like)

                                                                                    1. 1

                                                                                      I liked the original mysql api. Was the easiest to use with proper documentation back then. A footgun is good analogy. A gun can be used in a perfectly safe manner. Of course if you eyeball the barrel or have no regard for basic safety rules about it being loaded or where it is pointed to at any time, then yeah, things are going to go south sooner or later.

                                                                                      Likewise, the old functional mysql api was perfectly usable and I never felt any worry about being hacked through sql injection. If you are going to pass numbers as string parameters or rely on things like auto-escape, then just like in the gun example, things are not going to end well. But let’s all be honest, at the point it is expected to be hacked.

                                                                                      1. 1

                                                                                        I haven’t been around the PHP community in any serious capacity for probably 17 years now, but “with proper documentation” was a double edged sword. The main php.net website was a fantastic documentation reference, except for the part where lots of people posted really terrible solutions to problems on the same page as the official documentation. As I grew as a developer, I learned where a lot of the footguns were, but starting out the easy path was to just grab the solution in the comments on the page and use it, with all of the accompanying downfalls.

                                                                                        1. 1

                                                                                          Already back in the day, it baffled me that the site even had comments, let alone people relying on them.nI would never blindly trust anything in the comments.

                                                                                  2. 8

                                                                                    There is only one way of modifying a language that works in practice: add new features. As one of my colleagues likes to say, you can’t take piss out of a swimming pool. Once a feature is in a language, you can’t remove it without breaking things. You can; however, follow this sequence:

                                                                                    1. Add new feature.
                                                                                    2. Recommend against using old feature.
                                                                                    3. Refactor your codebase to avoid the old feature.
                                                                                    4. Add static analysis checks to CI that you aren’t using the old feature.
                                                                                    5. Provide compiler options to make use of the old features a hard error.

                                                                                    At this point, the old feature technically exists in the language, but not in your codebase and not in new code. I’ve seen this sequence (1-4, at least) used a lot in C++, where unsafe things from C++98 were gradually refactored into modern C++ (C++11 and later), things like the C++ Core Guidelines were written to recommend against the older idioms, then integrated into static analysers and used in CI, so you the old usages gradually fade.

                                                                                    If you manage to get to step 5, then you can completely ignore the fact that the language still has the old warts.

                                                                                    1. 6

                                                                                      I thought I was going crazy. Needed validation as no one would state the obvious.

                                                                                      None of these features is a game changer for PHP. And even less so is all the composer and laravel craze that pretty much boils down to a silly explosion of javaesque boilerplate code.

                                                                                      Heck, even the introduction of a new object model back in PHP 5 had marginal impact on the language at best.

                                                                                      PHP’s killer features were:

                                                                                      • Place script in location to deploy and map a URL to it
                                                                                      • Out of the box support MySQL. Easy to use alternatives were payed back then, and connecting to MySQL or PostgreSQL was a PITA in most languages.
                                                                                      • A robust template engine. It still is among the best and most intuitive to use our there. Although alternatives exist for every language.
                                                                                      • Affordable availability on shared hosting with proper performance. This blew the options out of the water, with alternatives coating up to three orders of magnitude more for a minimum setup.

                                                                                      These things are not killer features anymore. Writing a simple webapp with a Sinatra-like framework it’s easier than setting up PHP. The whole drop file to deploy only made sense in the days of expensive shared servers. It is counterproductive in the $3 vps era.

                                                                                      I would prefer if the language would:

                                                                                      1. Ship a robust production grade http server to use with the language instead of the whole mess it requires to be used via third party web servers

                                                                                      2. Even better. Drop the whole http request and response as default input/output. It makes no sense nowadays. It is just a cute reliq from past decades. Which is more a source of trouble than a nicety.

                                                                                      1. 1

                                                                                        Place script in location to deploy and map a URL to it

                                                                                        Which was possible for years before PHP via CGI and is no longer possible for PHP in many setups. PHP != mod_php

                                                                                        1. 6

                                                                                          Which was possible for years before PHP via CGI

                                                                                          mod_php did this better than CGI did at the time.

                                                                                          1. From what I remember from trying out this stuff at the time, the .htaccess boilerplate for mod_cgi was more hassle and harder to understand.
                                                                                          2. CGI got a rep for being slow. fork/exec on every request costs a little, starting a new Perl interpreter or whatever on every request cost a lot. (and CGI in C was a productivity disaster)
                                                                                          3. PHP had features like parsing query strings and form bodies for you right out of the box. No need to even write import cgi.

                                                                                          Overall the barrier to entry to start getting something interactive happening in PHP was much lower.

                                                                                          From what I remember the documentation you could find online was much more tutorial shaped for PHP than what you could find online for CGI.

                                                                                          PHP != mod_php

                                                                                          Sure now, but pm is discussing the past. PHP == mod_php was de facto true during the period of time in which PHP’s ubiquity was skyrocketing. Where pm above describes what PHP’s killer features “were”, this is the time period they are describing.

                                                                                          1. 4

                                                                                            mod_php did this better than CGI did at the time.

                                                                                            It also did it much worse. With CGI, the web browser would fork, setuid to the owner of the public_html directory, and then execve the script. This had some overhead. In contrast, mod_php would run the PHP interpreter in-process. This meant that it had read access to all of the files that the web server had access to. If you had database passwords in your PHP scripts, then you’d better make sure that you trust all of the other users on the system, because they can write a PHP script that reads files from your ~/public_html and sends them to the requesting client. A lot of PHP scripts had vulnerabilities that let them dump the contents of any file that the PHP interpreter could read and this became any file the web server could read when deployed with mod_php. I recall one system I was using being compromised because the web server could read the shadow password file, someone was able to dump it, and then they were able to do an offline attack (back then, passwords were hashed with MD5 and an MD5 rainbow table for a particular salt was something that was plausible to generate) and find the root password. They then had root access on the system.

                                                                                            This is part of where the PHP hate came from: ‘PHP is fast’ was the claim, and the small print was ‘as long as you don’t want any security’.

                                                                                            1. 1

                                                                                              This is completely irrelevant to the onboarding experience.

                                                                                              Either way, empirically, people didn’t actually care all that much about the fact that their php webhosts were getting broken into.

                                                                                              1. 1

                                                                                                This is completely irrelevant to the onboarding experience.

                                                                                                It mattered for the people who had their database credentials stolen because mod_php gave everyone else on their shared host read access to the file containing them. You’re right that it didn’t seem to harm PHP adoption though.

                                                                                          2. 2

                                                                                            Not to the same extent at all. CGI would spawn a process on the operative system per request. It was practically impossible to keep safe. PHP outsourced the request lifecycle out of the developer’s concern. And did so with a huge performance gain compared to CGI. While in theory you could to “the same” with CGI, in practice,.it was just not viable. When PHP4 arrived, CGi was already in a downwards spiral already, with most hosting providers disabling access to it. While Microsoft and Sun microsystems followed PHP philosophy by offering ASP and JSP, which had their own share of popularity.

                                                                                            PHP is, by and large, mod_php and nowadays fpm. The manual introductory tutorial even assumes such usage. Had they packaged it early on as a regular programming language, with its primary default interpreter hooked up to standard streams, it might have been forgotten today. Although personally I think they should have made that switch long ago.

                                                                                        2. 4

                                                                                          “Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary.”

                                                                                          https://schemers.org/Documents/Standards/R5RS/HTML/

                                                                                          1. 1

                                                                                            I think it’s the same principle as with source code: you want as little as possible while keeping things readable and correct

                                                                                          1. 6

                                                                                            “Eventually, I realized that my favorite everyday “software calculator” was simply the Google search engine, its major drawback being the requirement for an Internet access.”

                                                                                            Aside from the Numerical Truth issues and such the author details and focusing just on user experience, Has the author considered notepad-style text calculators like calca.io or parsify desktop? I found myself rather devoted to calca and recently been trying parsify after switching to Linux.

                                                                                            1. 5

                                                                                              My favorite app for this is Soulver on macOS https://soulver.app/

                                                                                              1. 3

                                                                                                I was a bit surprised to not see soulver mentioned.

                                                                                              2. 4
                                                                                                  1. 1

                                                                                                    Numbr shows the same value for “1.001”, “1,001”, and “1001”. That’s not cool.

                                                                                                    1. 1

                                                                                                      Does not do this for me.

                                                                                                      1. 2

                                                                                                        It does so here because the locale on my pc uses a period as thousands separator. The author has just acknowleged that it is a bug that will be corrected.

                                                                                                    2. 1

                                                                                                      I also found this one: https://bbodi.github.io/notecalc3/

                                                                                                  1. 45

                                                                                                    This is a very…. non-nuanced title. But hey, who am I to disagree. Anyway, shoot if you have questions :)

                                                                                                    1. 27

                                                                                                      My dream is that I fire up Firefox and it doesn’t make a single network request until I click a bookmark or type a URL and hit enter. Do you think there’s any hope of getting that as an option? As it is I’ve found it’s impossible to configure this behavior without external tools.

                                                                                                      1. 19

                                                                                                        Unfortunately not. There are many things we can’t do out of the box, like Netflix (DRM), OpenH264(5?). We’ll also need updated info for intermediate certificates and revocations and then updates for the browser itself and addons. I could go on.

                                                                                                        Surely it’s technically feasible to invent a pref and put all of those checks behind this pref. But there’s no point in shipping a not-very-usable browser from our perspective. Conway’s law further dictates that every team needs their own switch and config and backend. :) :(

                                                                                                        1. 9

                                                                                                          Why do DRM and OpenH264 require network connections on startup?

                                                                                                          I also don’t see how adding an option would render the browser not-very-usable, perhaps you meant something else?

                                                                                                          1. 9

                                                                                                            Why do DRM and OpenH264 require network connections on startup?

                                                                                                            AFAIK it’s a legal work-around: Mozilla can’t distribute an H264 decoder themselves so they have users (automatically) download one from Cisco’s website on their own machine. Sure, you could download it on demand when the user first encounters an H264 stream … but it would put Firefox at an even greater disadvantage compared to browsers willing to pay the MPEG extortion fee.

                                                                                                            I also don’t see how adding an option would render the browser not-very-usable, perhaps you meant something else?

                                                                                                            Obligatory Coding Horror link ; ). What you are looking for should be possible with proxies on Firefox (but not Chrome last I checked). I would suggest checking out the Tor browser fork and the extension API.

                                                                                                            1. 3

                                                                                                              it’s a legal work-around: Mozilla can’t distribute an H264 decoder themselves so they have users (automatically) download one from Cisco’s website on their own machine.

                                                                                                              Wouldn’t Firefox download it whenever it updates itself? Not every time it starts up?

                                                                                                              Obligatory Coding Horror link ; ). What you are looking for should be possible with proxies on Firefox (but not Chrome last I checked). I would suggest checking out the Tor browser fork and the extension API.

                                                                                                              I am not the one who asked for this feature, but I’m sure they would be fine with an option in about:config. Failing that, a series of options to disable features that make unprompted requests would at least get them closer (some of the aforementioned features already have that).

                                                                                                              1. 1

                                                                                                                Wouldn’t Firefox download it whenever it updates itself? Not every time it starts up?

                                                                                                                That’s as far as I know and I’m too lazy to find out more 😝. Maybe the OP was talking about first launch?

                                                                                                                Regardless of the exact legal and technical rationale, a web browser’s job is to display content to the user as fast as possible and pre-fetching resources eliminates lag. Whether that is checking for OpenH264 updates or simple dns-prefetching, the improvement in UX is what justifies the minimal privacy leakage from preemptively downloading oft-used resources. Or, at least that is what I think the OP was trying to get across : )

                                                                                                                … I’m sure they would be fine with an option in about:config. Failing that, a series of options to disable features that make unprompted requests would at least get them closer (some of the aforementioned features already have that).

                                                                                                                It could work as an about:config option, but you would still have to convince someone to spend resources to get it mainlined. Hence why I suggested checking the extension API : )

                                                                                                                Given Tor’s threat model, I would assume they would have already done a much more thorough job at eliminating network requests that would compromise privacy. And if not, they would have the organizational capacity and motivation to implement and upstream such a feature. The Tor Browser can be used as a normal browser by disabling Onion routing via an about:config setting.

                                                                                                                1. 1

                                                                                                                  Regardless of the exact legal and technical rationale, a web browser’s job is to display content to the user as fast as possible and pre-fetching resources eliminates lag. Whether that is checking for OpenH264 updates or simple dns-prefetching, the improvement in UX is what justifies the minimal privacy leakage from preemptively downloading oft-used resources. Or, at least that is what I think the OP was trying to get across : )

                                                                                                                  Pre-fetching sometimes eliminates lag and sometimes causes it by taking bandwidth from more important things. Maybe OP meant to argue that these concerns are negligible and not deserving of a configuration option, but it’s hard to infer it from what they wrote.

                                                                                                                2. 1

                                                                                                                  Wouldn’t Firefox download it whenever it updates itself? Not every time it starts up?

                                                                                                                  Not being privy to the details myself; I could see that count as “distribution” where download on boot does not. #NotALawyer

                                                                                                                  1. 1

                                                                                                                    My guess is that the Mozilla guy didn’t answer the question directly and it probably doesn’t actually download it with every start up as he seemed to imply.

                                                                                                            2. 3

                                                                                                              I think it would be fair to include an option to allow power users to pull these updates rather than have these pushed. In the absence of this option, Mozilla is, or is capable of, collecting telemetry on my use of Firefox without my consent and violating the privacy ethos it espouses so much in its marketing.

                                                                                                              If you proxy Firefox on launch (on Mac I use CharlesProxy) you can see the huge amount of phoning home it does at launch, even with every available update setting in Firefox set to manual/not-automatic.

                                                                                                            3. 9

                                                                                                              Mozilla seems to be running in the opposite direction with sponsored links showing up now in the new tab page, etc. I could be wrong though…

                                                                                                            4. 11

                                                                                                              Serious question: What do you think could Firefox learn from Chrome security? For example, where does Chrome better?

                                                                                                              1. 26

                                                                                                                This is from the top of my head. There are many differences. But here’s an interesting tradeoff:

                                                                                                                Their UI has a native implementation which makes sandboxing and privilege separation easier. We have opted to implement our UI in HTML and JavaScript which is great for shared goals in accessibility, performance improvements, community contributions, and extensibility. But it also means that our most privileged process contains a full HTML rendering engine with JavaScript and JIT and all.

                                                                                                                1. 2

                                                                                                                  Has there been any consideration of tools like Caja to sandbox the JS that runs in that process?

                                                                                                                  1. 6

                                                                                                                    Caja is for JS<>JS isolation, but the main threat here is in JS escaping to native code (e.g. through a JIT bug), where Caja has no power.

                                                                                                                    1. 5

                                                                                                                      We’ve been using several restrictions in terms of what our UI code can do and where it can and cannot come from. E.g., script elements can’t point to the web but rather inside the Firefox package (e.g., the about URL scheme). We’ve also implemented static analysis checks for obvious XSS bugs and are using CSP. We’ve summarized our mitigation in this fine blog post here: https://blog.mozilla.org/attack-and-defense/2020/07/07/hardening-firefox-against-injection-attacks-the-technical-details/

                                                                                                                2. 5

                                                                                                                  Well, if not the most secure web browser on the market, then definitely the second most secure! (never mind that there are only two)

                                                                                                                  1. 2

                                                                                                                    I’m really glad to see this kind of partitioning being done!

                                                                                                                    1. 1

                                                                                                                      What percentage of the browser do you expect to be able to sandbox in this way? Isn’t there work going on to implement shared memory between WASM modules?

                                                                                                                    1. 3
                                                                                                                      1. 2

                                                                                                                        Yes, your page helped me build a mental model of the workflow. Thanks! :-)

                                                                                                                      1. 1

                                                                                                                        An adjacent problem I’d like to see solved (or, please, if you have a better solution!) Is when my request parameters to the server are a deeply nested data structure rather than a single layer (i.e. x=1&y=2&z=3). Right now I’m stringify()ing JSON+base64 to get this between client and API but it’s cumbersome and not standardized.

                                                                                                                        1. 6

                                                                                                                          Although it sometimes feels like a bag full of sharp edges, I’m glad that there’s still life in the Thunderbird project.

                                                                                                                          Personally pleased that CardDAV address book support has arrived. One of those things that I had assumed Thunderbird had until I tried to find it a few months ago.

                                                                                                                          1. 1

                                                                                                                            bag full of sharp edges

                                                                                                                            how so ?

                                                                                                                            1. 5

                                                                                                                              This is just one bug, but maybe an example – Thunderbird sets its own timezone in its configs, and sets a default to Pacific while ignoring the timezone on the OS (?) Then shows calendar invites with no time zone indication! It’s as if it was engineered to get people to miss meetings. Those bugs, with many others, are sitting in the bug tracker and have been there a long time.

                                                                                                                              1. 1

                                                                                                                                that’s something I never noticed, but I’m using it primarily for email

                                                                                                                              2. 3

                                                                                                                                Just to add to the list of issues: I have a workflow in Thunderbird where I will sort by sender and triage my e-mail, often repeatedly hitting the ‘a’ key to archive a bunch of keys from the same sender. This works great, but obviously you sometimes end up archiving a mail you didn’t mean to this way. That’s fine, Thunderbird has a shortcut ctrl+z to undo archiving an e-mail. But after you hit that shortcut, it takes a pretty long time for the e-mail to show up in the e-mail list again. You would expect the e-mail to just immediately appear again when you undo archiving it, but no. I suspect the way it works is that there’s a disconnect between the UI and the data model; in the model, the e-mail is immediately un-archived, but the change to the model doesn’t immediately update the UI to reflect that.

                                                                                                                                1. 3

                                                                                                                                  I suppose a general feeling of jank and lack of polish, especially when it comes to the calendar and address book. It feels like different parts of the app have been developed at very different paces (which is true) so there’s less consistency to the interfaces than you might expect and it can be hard to find where one toggle this particular setting etc.

                                                                                                                                  As an example, I mentioned how I’m pleased at the introduction of CardDAV support but have so far been unable to find where exactly it lives…

                                                                                                                                  1. 1

                                                                                                                                    I’m using it for email mostly, but I did switch away to kmail on linux after it killed its own search index every second day 3 years ago, leading to glitchy search results. And I’ve had it once on a system that the imap account didn’t have any trash bin anymore, which leads to the issue that you actually can’t delete anything anymore. But these are just two issues that I’ve had once in 8 years.

                                                                                                                                    1. 1

                                                                                                                                      Thunderbird’s search is unreliable/incomplete though. For searches I use the web client of our mail host. Otherwise I often won’t find what I’m looking for.

                                                                                                                                      1. 2

                                                                                                                                        The quick filter is the only usable search in Thunderbird.

                                                                                                                                  2. 2

                                                                                                                                    On Windows, the UI will freeze for several seconds in the middle of typing and when it resumes it will sometimes randomly move focus to another window before processing the rest of the input buffer. Normally this is mildly annoying but the main window binds some keystrokes without modifiers to actions, so it consumes some text that you’ve typed and does some things to your mailbox.

                                                                                                                                    1. 2

                                                                                                                                      I’ve never had any freezes for typing some mail, only very slow reactions when you’re moving a lot of mail.

                                                                                                                                      1. 1

                                                                                                                                        I’ve had these freezes on linux, mostly when thunderbird has been running for a month or more. I tried to investigate and found out that in my case, they were caused by garbage collection. The code causing the allocations seemed very bad (objects were being duplicated because the original object had a patched prototype, but the code needed to have access to a patch-free prototype at some point) but I couldn’t figure out how to fix it.

                                                                                                                                        1. 1

                                                                                                                                          How large are your mailboxes? It is probably related to that, since it got less common when I switched to Maildir (it’s basically unusable with mbox). I suspect it’s something to do with the on-demand virus scanner and blocking I/O.

                                                                                                                                          1. 1

                                                                                                                                            Is mbox even available as an option for new accounts? That seems like a terrible idea…

                                                                                                                                            1. 1

                                                                                                                                              Unless it’s changed in the last few months, it’s the default.

                                                                                                                                  1. 1

                                                                                                                                    Related, if you want a FOSS streaming tool for existing hardware/OS check out Icecast: https://en.wikipedia.org/wiki/Icecast

                                                                                                                                    I set it up so I could use a command to hand-off audio between my laptop and phone when listening to long-form podcasts.

                                                                                                                                    1. 1

                                                                                                                                      Can you talk more about your setup? What’s the workflow?

                                                                                                                                      1. 2

                                                                                                                                        It was a while back so I don’t remember exactly. It was an ungodly rube goldberg machine involving coreaudio, soundflower, icecast, and an iOS app called FStream. I’ll take a rough shot at it: I think soundflower redirected the audio to a device available to icecast, when then broadcasted the computer’s current audio output signal over the network. FStream was pointed to the computer’s IP and the icecast port. Something like that. So I could be listening to a podcast on my laptop, hit the command, then hit the app on my phone and walk away while continuing the audio stream.

                                                                                                                                    1. 4

                                                                                                                                      Does cowsay count?

                                                                                                                                      1. 4

                                                                                                                                        This is a little tangential but, I often fantasize about an alternate timeline where a LISP-style language got popular instead of PHP or especially where something like ClojureScript took JavaScript’s place in our timeline, and how much more enthusiastic I would be about modern software development had that happened. It’s sort of like, at least for the type of software I’d be developing, all roads lead to JavaScript and although I’ve been using it for 20 years I (hate?) it and I don’t see that changing.

                                                                                                                                        1. 5

                                                                                                                                          We could have lived in the alternative universe where JavaScript was still Mocha/LiveScript, had Lisp syntax, and was exactly the same language love to hate otherwise. Surprisingly plausible.

                                                                                                                                          1. 2

                                                                                                                                            Also if you just ignore the warts of JS-the-language I’m not sure that JS-the-ecosystem would’ve looked a lot better. I mean, we could hope, but I think it’s been a victim of its success and many solutions have been thought out by people without a lot of experience (because it’s so beginner friendly, which is good) and it’s basically the same thing as with PHP back then. Easy entry -> many beginners -> bad libraries get traction -> etc.pp

                                                                                                                                          2. 3

                                                                                                                                            Imagine if some exec at Mozilla didn’t insist that JavaScript had to have C style syntax to be familiar. Lisp would’ve been the most commonly used language today.

                                                                                                                                            1. 5

                                                                                                                                              Just because it’d be a Lisp doesn’t mean it’d be a good Lisp. (See: Emacs)

                                                                                                                                              1. 2

                                                                                                                                                Sure, but the syntax would’ve certainly been cleaner and less confusing than C inspired syntax with Lisp semantics. Js would’ve also introduced a lot of programmers to s-expressions which would’ve likely led to more s-expression based languages in the wild. Finally, we could’ve had a single unified syntax for markup, styling, and logic leveraging s-expressions.

                                                                                                                                              2. 4

                                                                                                                                                Exec at Netscape, not Mozilla.

                                                                                                                                            1. 8

                                                                                                                                              There’s this weird disparity, where: on one hand I’ve spent decades studying every computing technique I can get my hands on, including 1NF, 3NF, etc. Then on the other hand, almost any time I’ve gotten my hands on the backend schema of a big database including from multibillion dollar companies, the design is horrendous. I’m not talking a design that contemplated trade offs and compromises – I mean schemas that made me shudder. What I’ve learned is that in some cases you can get REALLY far in business without caring one lick about technical correctness, as much as that may bother me.