1. 81

    I beg all my fellow crustaceans to please, please use Firefox. Not because you think it’s better, but because it needs our support. Technology only gets better with investment, and if we don’t invest in Firefox, we will lose the web to chrome.

    1. 59

      Not because you think it’s better

      But that certainly helps too. It is a great browser.

      • privacy stuff — the cookie container API for things like Facebook Container, built-in tracker blocker, various anti-fingerprinting things they’re backporting from the Tor Browser
      • honestly just the UI and the visual design! I strongly dislike the latest Chrome redesign >_<
      • nice devtools things — e.g. the CSS Grid inspector
      • more WebExtension APIs (nice example: only on Firefox can Signed Pages actually prevent the page from even loading when the signature check fails)
      • the fastest (IIRC) WASM engine (+ now in Nightly behind a pref: even better codegen backend based on Cranelift)
      • ongoing but already usable Wayland implementation (directly in the official tree now, not as a fork)
      • WebRender!!!
      1. 7

        On the other hand, WebSocket debugging (mostly frame inspection) is impossible in Firefox without an extension. I try not to install any extensions that I don’t absolutely need and Chrome has been treating me just fine in this regard[1].

        Whether or not I agree with Google’s direction is now a moot point. I need Chrome to do what I do with extensions.

        As soon as Firefox supports WebSocket debugging natively, I will be perfectly happy to switch.

        [1] I mostly oppose extensions because of questionable maintenance cycles. I allow uBlock and aXe because they have large communities backing them.

        1. 3

          Axe (https://www.deque.com/axe/) seems amazing. I know it wasn’t the focus of your post – but I somehow missed this when debugging an accessibility issue just recently, I wish I had stumbled onto it. Thanks!

          1. 1

            You’re welcome!

            At $work, we used aXe and NVDA to make our webcomponents AA compliant with WCAG. aXe was invaluable for things like contrast and missing role attributes.

          2. 3

            WebSocket debugging (mostly frame inspection) is impossible in Firefox without an extension

            Is it possible with an extension? I can’t seem to find one.

            1. 1

              I have never needed to debug WebSockets and see no reason for that functionality to bloat the basic browser for everybody. Too many extensions might not be a good thing but if you need specific functionality, there’s no reason to hold back. If it really bothers you, run separate profiles for web development and browsing. I have somewhat more than two extensions and haven’t had any problems.

              1. 1

                I do understand your sentiment, but the only extension that I see these days is marked “Experimental”.

                On the other hand, I don’t see how it would “bloat” a browser very much. (Disclaimer: I have never written a browser or contributed to any. I am open to being proved wrong.) I have written a WebSockets library myself, and it’s not a complex protocol. It can’t be too expensive to update a UI element on every (websocket) frame.

            2. 5

              Yes! I don’t know about you, but I love the fact that Firefox uses so much less ram than chrome.

              1. 2

                This was one of the major reasons I stuck with FF for a long time. It is still a pronounced difference.

              2. 3

                honestly just the UI and the visual design! I strongly dislike the latest Chrome redesign >_<

                Yeah, what’s the deal with the latest version of Chrome? All those bubbly menus feel very mid-2000’s. Everything old is new again.

                1. 3

                  I found a way to go back to the old ui from https://www.c0ffee.net/blog/openbsd-on-a-laptop/ (it was posted here a few weeks ago):

                  Also, set the following in chrome://flags:

                  • Smooth Scrolling: (personal preference)
                  • UI Layout for the browser’s top chrome: set to “Normal” to get the classic Chromium look back
                  • Identity consistency between browser and cookie jar: set to “Disabled” to keep Google from hijacking any Google > - login to sign you into Chrome
                  • SafeSearch URLs reporting: disabled

                  (emphasis mine)

                2. 1

                  The Wayland implementation is not usable quite yet, though, but it is close. I tried it under Sway, but it was crashy.

                  1. -3

                    Not really. Not to mention Pocked integration and recent vpn advertisement. Ah, and they have removed RSS support.

                    It’s just another product made by a for-profit corporation.

                    I think web got over-complicated. There are none usable truly independent browsers and probably will never be. It’s a read-only “opensource”.

                    1. 16

                      It’s just another product made by a for-profit corporation.

                      They (Mozilla) are actually a non-profit.

                      1. 2

                        There is also Mozilla corporation.

                        1. 12

                          …which is 100% owned by the Mozilla Foundation, and:

                          The Mozilla Corporation reinvests all of its profits back into the Mozilla projects.

                          Forming for-profit corporations is not uncommon for NGOs, because NGOs in many countries are severely legally limited in the amount of commercial activities they’re able to do.

                          1. 3

                            Adding to that, funding FOSS software development is not considered 501(c)3-eligible in the US.

                      2. 5

                        I had the same impression with that over-complication of JS into ES6. CSS is also looking more like a programming language. HTTP/2 is now a binary protocol. So to have a modern web platform, you need to support all of these, and none are trivial anymore. On the other hand, I find it amazing to be able to do netwroking, audio, video, 3d and highly customizable user interfaces with (relatively) few efforts at a pretty good speed. As a platform for creativity and experimentation, it is without equivalent.

                        1. 2

                          without equivalent.

                          Java applets - done right?

                          1. 3

                            Or Flash/Shockwave done openly and right?

                            1. 4

                              Both Java applets and Flash were actually more like trojan horses. See how Flash ( very good scenegraph at the time) became Air (ie. a tentative to take over the Web like Java) and thankfully died because Apple killed it with the iPhone. The intention was to run programs within a walled garden, not to interoperate with the Web at large. At least that’s how I read it.

                              1. 4

                                Good point on long-term risk. Do note I said Flash/Shockwave the tech. That was made by Macromedia, not Adobe. Macromedia was a company whose pricey tech was kick-ass but no attempt to be open or interoperate past maybe Dreamweaver. Catchy name many lay people could spell, too.

                                I think Adobe acquiring them made me drop some F-bombs, sigh a bit, eye rolls, and so on. I knew there would be short-term improvements before the large company FUBARed its value over time. Apple’s position sealed its fate.

                                1. 2

                                  Indeed, Macromedia had a much better stewardship than Adobe in this respect. What I find really ironic is that before the acquisition, Adobe was pushing SVG and SVG animations as an alternative to Flash, embracing and pushing the web standards. After the acquisition, everything stalled and it’s only with Apple creating the Canvas API and standardizing it through the newly created WHATWG that we started to catch up and be able to do so fast interactive graphics on the Web. What we lost, though, is one of the best tool to create vector animations with programmatic behaviour. One step ahead, two steps back some might say.

                              2. 3

                                I think the difference is that aplets and flash were supposed to extend the web experience, new technologies are replacing it. It’s convenient but dangerous as it promotes monoculture. I don’t know if there is a safe middle ground.

                                1. 5

                                  There is a lot being lost with the death of Flash. It was amazingly lightweight when it started out. You can take that Homestar Runner e-mail and the original Flash, resize it to 4k, and it will still render correctly and sharply. You can’t do that when you export animation to YouTube at a set resolution. Not to mention all the games that were made in Flash that we’ll loose soon.

                                  Adobe really butchered all the Macromedia stuff when they acquired that company. It’s pretty sad.

                          2. 2

                            What does “removes RSS support” mean? Was it possible to use it as a feed reader before?

                            1. 3

                              Yeah, it was called “Live Bookmarks” and basically made your RSS feed subs show up in your bookmarks bar (or accessible from a page). It actually looked really neat, but I only found about it when/because they removed it.

                              1. 10

                                “Live Bookmarks” still exist, in Firefox 63.0.3 released on Nov 15th, 2018. I use them. Go to any RSS feed in FF and they will pop up. I use them for multiple Discourse forums.

                                  1. 1

                                    Ah, sad times, thanks for the link!

                              2. -1

                                Sure, using live bookmarks and integrated reader. But RSS collided with the their new commercial and closed product namely Pocket.

                                1. 4

                                  That’s not completely fair. I’m not sure if anything has happened yet, but Mozilla does have plans to open-source Pocket:

                                  As a result of this strategic acquisition, Pocket will become a wholly owned subsidiary of Mozilla Corporation and will become part of the Mozilla open source project.

                          3. 16

                            I switched to Firefox last year, and I have to say I don’t miss Chrome in the slightest.

                            1. 13

                              And those with a little financial liberty, consider donating to Mozilla. They do a lot of important work free a free and open web.

                              1. 10

                                I recently came back to Firefox from Vivaldi. That’s another Chromium/Webkit based browser and it’s closed source to boot.

                                Firefox has improved greatly in speed as of late and I feel like we’re back in the era of the mid-2000s, asking people to chose Firefox over Chrome this time instead of IE.

                                1. 2

                                  I’d love to switch from Vivaldi, but it’s simply not an option given the current (terrible) state of vertical tab support in Firefox.

                                  1. 2

                                    How is it terrible? The hiding of the regular tab bar is not an API yet and you have to use CSS for that, sure, but there are some very good tree style tab webextensions.

                                    1. 2

                                      The extensions are all terrible – but what’s more important is that I lost the belief that any kind of vertical tab functionality has any chance of long-term survival. Even if support was added now, it would be a constant battle to keep it and I’m frankly not interested in such fights anymore.

                                      Mozilla is chasing their idealized “average user” and is determined to push everyone into their one-size-fits-all idea of user interface design – anyone not happy with that can screw off, if it was for Mozilla.

                                      It’s 2018 – I don’t see why I even have to argue for vertical tabs and mouse gestures anymore. I just pick a browser vendor which hasn’t been asleep on the wheel for the last 5 years and ships with these features out of the box.

                                      And if the web in the future ends up as some proprietary API defined by whatever Google Chrome implements, because Firefox went down, Mozilla has only itself to blame.

                                      1. 2

                                        The extensions are all terrible – but what’s more important is that I lost the belief that any kind of vertical tab functionality has any chance of long-term survival. Even if support was added now, it would be a constant battle to keep it and I’m frankly not interested in such fights anymore. The whole point of moving to WebExtensions was long term support. They couldn’t make significant changes without breaking a lot of the old extensions. The whole point was to unhook extensions from the internals so they can refactor around them and keep supporting them.

                                        1. 0

                                          That’s like a car manufacturer removing all electronics from a car – sure it makes the car easier to support … but now the car doesn’t even turn on anymore!

                                          Considering that cars are usually used for transportation, not for having them sit in the garage, you shouldn’t be surprised that customers buy other cars in the future.

                                          (And no, blaming “car enthusiasts” for having unrealistic expectations, like it happens in the case of browser users, doesn’t cut it.)

                                          1. 3

                                            So you’d rather they didn’t improve it at all? Or would you rather they broke most extensions every release?

                                            1. 3

                                              I’m not @soc, but I wish Firefox had delayed their disabling of old-style extensions in Firefox 57 until they had replicated more of the old functionality with the WebExtensions API – mainly functionality related to interface customization, tabs, and sessions.

                                              Yes, during the time of that delay, old-style extensions would continue to break with each release, but the maintainers of Tree Style Tabs and other powerful extensions had already been keeping up with each release by releasing fixed versions. They probably could have continued updating their extensions until WebExtensions supported their required functionality. And some users might prefer to run slightly-buggy older extensions for a bit instead of switching to the feature-lacking new extensions straight away – they should have that choice.

                                              1. 1

                                                What’s the improvement? The new API was so bad that they literally had to pull the plug on the existing API to force extension authors to migrate. That just doesn’t happen in cases where the API is “good”, developers are usually eager to adopt them and migrate their code.

                                                Let’s not accuse people you disagree with that they are “against improvements” – it’s just that the improvements have to actually exist, and in this case the API clearly wasn’t ready. This whole fiasco feels like another instance of CADT-driven development and the failure of management to reign in on it.

                                                1. 3

                                                  The old extension API provided direct access to the JavaScript context of both the chrome and the tab within a single thread, so installing an XUL extension was disabling multiprocess mode. Multiprocess mode seems like an improvement; in old Firefox, a misbehaving piece of JavaScript would lock up the browser for about a second before eventually popping up a dialog offering to kill it, whereas in a multiprocess browser, it should be possible to switch and close tabs no matter what the web page inside does. The fact that nobody notices when it works correctly seems to make it the opposite of Attention-Deficient-Driven-Design; it’s the “focus on quality of implementation, even at the expense of features” design that we should be encouraging.

                                                  The logical alternative to “WebExtension For The Future(tm)” would’ve been to just expose all of the relevant threads of execution directly to the XUL extensions. run-this-in-the-chome.xul and run-this-in-every-tab.xul and message pass between them. But at that point, we’re talking about having three different extension APIs in Firefox.

                                                  Which isn’t to say that I think you’re against improvement. I am saying that you’re thinking too much like a developer, and not enough like the poor sod who has to do QA and Support triage.

                                                  1. 2

                                                    Improving the actual core of Firefox. They’re basically ripping out and replacing large components every other release. This would break large amount of plugins constantly. Hell, plugins wouldn’t even work in Nightly. I do agree with @roryokane that they should have tried to improve it before cutting support. The new API is definitely missing many things but it was the right decision to make for the long term stability of Firefox.

                                                    1. 1

                                                      They could have made the decision to ax the old API after extension authors adopted it. That adoption failed so hard that they had to force developers to use the new API speaks for itself.

                                                      I’d rather have extension that I have to fix from time to time, than no working extensions at all.

                                            2. 1

                                              Why should Mozilla care that much about your niche use case? They already have a ton of stuff to deal with and barely enough funding.

                                              It’s open source, make your own VerticalTabFox fork :)

                                              1. 3

                                                Eh … WAT? Mozilla went the extra mile with their recent extension API changes to make things – that worked before – impossible to implement with a recent Firefox version. The current state of tab extensions is this terrible, because Mozilla explicitly made it this way.

                                                I used Firefox for more than 15 years – the only thing I wanted was to be left alone.

                                                It’s open source, make your own VerticalTabFox fork :)

                                                Feel free to read my comment above to understand why that doesn’t cut it.

                                                Also, Stuff that works >> open source. Sincerely, a happy Vivaldi user.

                                                1. 2

                                                  It’s one of the laws of the internet at this point: Every thread about Firefox is always bound to attract someone complaining about WebExtensions not supporting their pet feature that was possible with the awful and insecure old extension system.

                                                  If you’re care about “non terrible” (whatever that means — Tree Style Tab looks perfect to me) vertical tabs more than anything — sure, use a browser that has them.

                                                  But you seem really convinced that Firefox could “go down” because of not supporting these relatively obscure power user features well?? The “average user” they’re “chasing” is not “idealized”. The actual vast majority of people do not choose browsers based on vertical tabs and mouse gestures. 50% of Firefox users do not have a single extension installed, according to telemetry. The majority of the other 50% probably only have an ad blocker.

                                                  1. 3

                                                    If you’re care about “non terrible” (whatever that means — Tree Style Tab looks perfect to me) vertical tabs more than anything — sure, use a browser that has them.

                                                    If you compare the current state of the art of vertical tabs extensions, even Mozilla thinks they suck – just compare them to their own Tab Center experiment: https://testpilot.firefox.com/static/images/experiments/tab-center/details/tab-center-1.1957e169.jpg

                                                    Picking just one example: Having the navigation bar at a higher level of the visual hierarchy is just wrong – the tab panel isn’t owned by the navigation bar, the navigation bar belongs to a specific tab! Needless to say, all of the vertical tab extensions are forced to be wrong, because they lack the API do implement the UI correctly.

                                                    This is how my browser currently looks like, for comparison: https://i.imgur.com/5dTX8Do.png

                                                    But you seem really convinced that Firefox could “go down” because of not supporting these relatively obscure power user features well?? The “average user” they’re “chasing” is not “idealized”. The actual vast majority of people do not choose browsers based on vertical tabs and mouse gestures. 50% of Firefox users do not have a single extension installed, according to telemetry. The majority of the other 50% probably only have an ad blocker.

                                                    You can only go so far alienating the most loyal users that use Firefox for specific purposes until the stop installing/recommending it to their less technically-inclined friends and relatives.

                                                    Mozilla is so busy chasing after Chrome that it doesn’t even realize that most Chrome users will never switch. They use Chrome because “the internet” (www.google.com) told them so. As long as Mozilla can’t make Google recommend Firefox on their frontpage, this will not change.

                                                    Discarding their most loyal users while trying to get people to adopt Firefox who simply aren’t interested – this is a recipe for disaster.

                                                2. 1

                                                  and barely enough funding

                                                  Last I checked they pulled in half a billion in revenue (2016). Do you believe this is barely enough?

                                                  1. 2

                                                    For hundreds of millions users?

                                                    Yeah.

                                              2. 1

                                                At least with multi-row tabs in CSS you can’t dragndrop tabs. That’s about as bad as it gets.

                                              3. 2

                                                Are vertical tabs so essential?

                                                1. 3

                                                  Considering the change in screen ratios over the past ten years (displays get shorter and wider), yes, it absolutely is.

                                                  With vertical tabs I can get almost 30 full-width tabs on screen, with horizontal tabs I can start fishing for the right tab after about 15, as the tab width gets increasingly smaller.

                                                  Additionally, vertical tabs reduce the way of travel substantially when selecting a different tab.

                                                  1. 1

                                                    I still miss them, didn’t cripple me, but really hurt. The other thing about Tree (not just vertical) tabs that FF used to have was that the subtree was contextual to the parent tree. So, when you opened a link in a background tab, it was opened in a new tab that was a child of your current tab. For doing like documentation hunting / research it was amazing and I still haven’t found its peer.

                                                2. 1

                                                  It’s at least partially open source. They provide tarballs.

                                                  1. 4

                                                    https://help.vivaldi.com/article/is-vivaldi-open-source/

                                                    The chromium part is legally required to be open, the rest of their code is like readable source, don’t get me wrong that’s way better than unreadable source but it’s also very wut.

                                                    1. 2

                                                      Very wut. It’s a weird uneasy mix.

                                                      1. 1

                                                        that’s way better than unreadable source but it’s also very wut.

                                                        I wouldn’t be sure of that. It makes it auditable, but has legal ramifications should you want to build something like vivaldi, but free.

                                                  2. 8

                                                    firefox does not get better with investment, it gets worse.

                                                    the real solution is to use netsurf or dillo or mothra, so that webmasters have to come to us and write websites that work with browsers that are simple enough to be independently maintained.

                                                    1. 8

                                                      Good luck getting more than 1‰ adoption 😉

                                                      1. 5

                                                        good luck achieving independence from Google by using a browser funded by Google

                                                        1. 1

                                                          I can achieve independence from Google without using netsurf, dillo, or mothra; to be quite honest, those will never catch on.

                                                          1. 1

                                                            can you achieve independence from google in a way that will catch on?

                                                            1. 1

                                                              I don’t think we’ll ever get the majority of browser share back into the hands of a (relatively) sane organization like Mozilla—but we can at least get enough people to make supporting alternative browsers a priority. On the other hand, the chances that web devs will ever feel pressured to support the browsers you mentioned, is close to nil. (No pun intended.)

                                                              1. 0

                                                                what is the value of having an alternative, if that alternative is funded by google and sends data to google by default?

                                                                1. 1

                                                                  what is the value of having an alternative

                                                                  What would you like me to say, that Firefox’s existence is worthless? This is an absurd thing to insinuate.

                                                                  funded by google

                                                                  No. I’m not sure whether you’re speaking in hyperbole, misunderstood what I was saying, and/or altogether skipped reading what I wrote. But this is just not correct. If Google really had Mozilla by the balls as you suggest, they would coerce them to stop adding privacy features to their browser that, e.g., block Google Analytics on all sites.

                                                                  sends data to google by default

                                                                  Yes, though it seems they’ve been as careful as one could be about this. Also to be fair, if you’re browsing with DNT off, you’re likely to get tracked by Google at some point anyway. But the fact that extensions can’t block this does have me worried.

                                                                  1.  

                                                                    i’m sorry if i misread something you wrote. i’m just curious what benefit you expect to gain if more people start using firefox. if everyone switched to firefox, google could simply tighten their control over mozilla (continuing the trend of the past 10 years), and they would still have control over how people access the web.

                                                                    1.  

                                                                      It seems you’re using “control” in a very abstract sense, and I’m having trouble following. Maybe I’m just missing some context, but what concrete actions have Google taken over the past decade to control the whole of Mozilla?

                                                                      1.  

                                                                        Google has pushed through complex standards such as HTTP/2 and new rendering behaviors, which Mozilla implements in order to not “fall behind.” They are able implement and maintain such complexity due to funding they receive from Google, including their deal to make Google the default search engine in Firefox (as I said earlier, I couldn’t find any breakdown of what % of Mozilla’s funding comes from Google).

                                                                        For evidence of the influence this funding has, compare the existence of Mozilla’s Facebook Container to the non-existence of a Google Container.

                                                        2. 3

                                                          Just switch to Gopher.

                                                          1. 5

                                                            Just switch to Gopher

                                                            I know you were joking, but I do feel like there is something to be said for the simplicity of systems like gopher. The web is so complicated nowadays that building a fully functional web browser requires software engineering on a grand scale.

                                                            1. 3

                                                              yeah. i miss when the web was simpler.

                                                              1. 1

                                                                I was partially joking. I know there are new ActivityPub tools like Pleroma that support Gopher and I’ve though about adding support to generate/server gopher content for my own blog. I realize it’s still kinda a joke within the community, but you’re right about there being something simple about just having content without all the noise.

                                                          2. 1

                                                            Unless more than (rounded) 0% of people use it for Facebook, it won’t make a large enough blip for people to care. Also this is how IE was dominant, because so much only worked for them.

                                                            1. 1

                                                              yes, it would require masses of people. and yes it won’t happen, which is why the web is lost.

                                                          3. 2

                                                            I’ve relatively recently switched to FF, but still use Chrome for web dev. The dev tools still seem quite more advanced and the browser is much less likely to lock up completely if I have a JS issue that’s chewing CPU.

                                                            1. 2

                                                              I tried to use Firefox on my desktop. It was okay, not any better or worse than Chrome for casual browsing apart from private browsing Not Working The Way It Should relative to Chrome (certain cookies didn’t work across tabs in the same Firefox private window). I’d actually want to use Firefox if this was my entire Firefox experience.

                                                              I tried to use Firefox on my laptop. Site icons from bookmarks don’t sync for whatever reason (I looked up the ticket and it seems to be a policy problem where the perfect is the enemy of the kinda good enough), but it’s just a minor annoyance. The laptop is also pretty old and for that or whatever reason has hardware accelerated video decoding blacklisted in Firefox with no way to turn it back on (it used to work a few years ago with Firefox until it didn’t), so I can’t even play 720p YouTube videos at an acceptable framerate and noise level.

                                                              I tried to use Firefox on my Android phone. Bookmarks were completely useless with no way to organize them. I couldn’t even organize on a desktop Firefox and sync them over to the phone since they just came out in some random order with no way to sort them alphabetically. There was also something buggy with the history where clearing history didn’t quite clear history (pages didn’t show up in history, but links remained colored as visited if I opened the page again) unless I also exited the app, but I don’t remember the details exactly. At least I could use UBO.

                                                              This was all within the last month. I used to use Firefox before I used Chrome, but Chrome just works right now.

                                                              1. 6

                                                                I definitely understand that Chrome works better for many users and you gave some good examples of where firefox fails. My point was that people need to use and support firefox despite it being worse than chrome in many ways. I’m asking people to make sacrifices by taking a principled position. I also recognize most users might not do that, but certainly, tech people might!? But maybe I’m wrong here, maybe the new kids don’t care about an open internet.

                                                            1. 14

                                                              My problem with make is not that there is a bad design. It is not THAT bad when you look at things like CMake (oops, I did not put a troll disclaimer, sorry :P).

                                                              But it has only very large implementations that has a lot of extensions that all are not POSIX. So if you want a simple tool to build a simple project, you have to have a complex tool, with even more complexity than the project itself in many cases…

                                                              So a simple tool (redo), available with 2 implementations in shell script and 1 implementation in python does a lot of good!

                                                              There is also plan 9 mk(1) which support evaluating the output of a script as mk input (with the <| command syntax), which removes the need for a configure script (build ./linux.c on Linux, ./bsd.c on BSD…).

                                                              But then again, while we are at re-designing things, let’s simply not limit outself to the shortcomings of existing software.

                                                              The interesting part is that you can entirely build redo as a tiny tiny shell script (less than 4kb), that you can then ship along with the project !

                                                              There could then be a Makefile with only

                                                              all:
                                                                  ./redo
                                                              

                                                              So you would (1) have the simple build-system you want, (2) have it portable as it would be a simple shell portable shell script, (3) still have make build all the project.

                                                              You may make me switch to this… ;)

                                                                1. 1

                                                                  Nice! So 2 shell, 1 python and 1 C implementation.

                                                                  1. 5

                                                                    There is also an implementation in C++. That site also has a nice Introduction to redo.

                                                                    I haven’t used any redo implementation myself, but I’ve been wondering how they would perform on large code bases. They all seem to spawn several process for each file just to check whether it should be remade. The performance cost of that not a particularly fast operation might be prohibitive on larger projects. Does anyone happen to have experience with that?

                                                                    1. 1

                                                                      The performance cost of that not a particularly fast operation might be prohibitive on larger projects. Does anyone happen to have experience with that?

                                                                      No experience, but from the article:

                                                                      Dependencies are tracked in a persistent .redo database so that redo can check them later. If a file needs to be rebuilt, it re-executes the whatever.do script and regenerates the dependencies. If a file doesn’t need to be rebuilt, redo can calculate that just using its persistent .redo database, without re-running the script. And it can do that check just once right at the start of your project build.

                                                                      Since building the dependencies is usually done as part of building a target, I think this probably isn’t even a significant problem on initial build (where the time is going to be dominated by actual building). OTOH I seem to recall that traditional make variants do some optimisation where they run commands directly, rather than passing them via a shell, if they can determine that they do not actually use shell built-ins (not 100% sure this is correct, memory is fallible etc) - the cost of just launching the shell might be significant if you have to do it a lot, I guess.

                                                                  2. 3

                                                                    The biggest problem with Make (imo) is that it is almost impossible to write a large correct Makefile. It is too easy for a dependency to exist, but not be tracked by the Make rules, thus making stale artefacts a problem.

                                                                    1. 1

                                                                      I had given serious thought to using LD_PRELOAD hooks to detect all dependencies dynamically (and identify e.g. dependencies which hit the network), but never got around to trying it.

                                                                      Anyone heard of anything trying that approach?

                                                                    2. 2

                                                                      Why this obsession with “simple tools for simple projects” though? Why not have one scalable tool that works great for any project?

                                                                      (Yeah, CMake is not that tool. But Meson definitely is!)

                                                                      1. 3

                                                                        Because I wish all my projects to be kept simple. Then there is no need for very powerful tool to build them.

                                                                        On the other hand, if you already need a complex tool to do some job, having another simple tool sum up the complexity of both as you will now have to understand and maintain both !

                                                                        If we aim for the most simple tool that can cover all situations we face, this will end up with different tools according to what we expect.

                                                                        1. 3

                                                                          Meson isn’t a simple tool, it requires the whole Python runtime in order to even run --help.

                                                                          CMake is a lot more lightweight.

                                                                          1. 4

                                                                            Have you appreciated how huge CMake actually is? I know I had problems compiling it on an old machine since it required something like a gigabyte of memory to build. A two-stage build that took its precious time.

                                                                            CMake is not lightweight, and that’s not its strong suit. To the contrary, it’s good in having everything but the kitchen sink and being considerably flexible (unlike Meson, which has simplicity/rigidity as a goal).

                                                                            1. 2

                                                                              CMake is incredibly heavyweight.

                                                                            2. 1

                                                                              I would like to see how it would work out with different implementations and how “stable” meson as a language is.

                                                                              1. 1

                                                                                Meson is nice, but sadly not suitable for every project. It has limitations that prevent some from using it, limitations neither redo nor autotools have. Such as putting generated files in a subdirectory (sounds simple, right?).

                                                                            1. 12

                                                                              The two role models I think of immediately are Julia Evans and Simon Peyton Jones. They are both clearly extremely knowledgable, really good at explaining things and – perhaps most importantly – readily admit ignorance. I aspire to do that myself, too, and I suspect part of the reason that Julia and Simon seems to know so much is that they’ll say “I don’t know!”.

                                                                              I saw a talk by Simon Peyton Jones last month about linear types in Haskell, and someone from the audience asked “why is it called linear types?” to which Simon – without hesitation – replied something to the effect of “I don’t know!”. For some reason it was very nice seeing such a knowledgable person unabashedly admit ignorance on a topic close to his area of expertise.

                                                                              Some examples from Julia’s writing:

                                                                              I’m not going to go into how you read that info right now because frankly I don’t know.

                                                                              It’s not completely clear to me under what circumstances having swap on a computer at all even makes sense. It seems like swap has some role on desktop computers.

                                                                              I was going to say that this isn’t how it works on Linux. But! I went and looked at the docs and apparently there is a posix_spawn system call that does basically this. Shows what I know. Anyway, we’re not going to talk about that.

                                                                              1. 3

                                                                                I also look up to Simon, and exactly for those reasons. In that same talk he starts saying “I usually don’t understand types, I’m very bad with them”. That straightforward ignorance is something I strive to achieve.

                                                                              1. 6

                                                                                you have more opportunities to encounter a longer interval than to encounter a shorter interval. And so it makes sense that the average span of time experienced by riders will be longer than the average span of time between buses, because the longer spans are over-sampled.

                                                                                This is very obvious now that I read it, but I had never thought about it in that way before.

                                                                                1. 4

                                                                                  Happy to see that single-user mode is now the default on macOS. This means I won’t have to de-multi-user my nix installs anymore: https://gist.github.com/ehamberg/68ff4615f95c1acec8e7b6d83196d2b2 :)

                                                                                  1. 3

                                                                                    There are a number of benefits to using the daemon, even on a machine with one user. While I personally think it’s important that the default installation method is easy and straightforward for new users. Anybody how’s serious about nix and uses it for more than just installing cached builds from nixpkgs should probably be using the daemon.

                                                                                  1. 2

                                                                                    I have used iOS for 6–7 years now and I know about the feature, but on the few occasions I wanted to use it, I very carefully shook my phone from side to side, fearing that people around me would think I was crazy if I actually shook my phone.

                                                                                    Not sure I ever actually successfully triggered the undo action. :|

                                                                                    1. 4

                                                                                      What a curious way to announce this much awaited new Elm release. Does anyone here know more about the ideas behind that? I’d have expected some kind of public beta and a proper release announcement…

                                                                                      1. 4

                                                                                        Yeah, it’s a bit…different, but it looks like picking and highlighting one feature is what was done for previous releases as well: http://elm-lang.org/blog

                                                                                        1. 2

                                                                                          Especially given the “is Elm dead?” questions that have been popping up in the past few months. I guess it’s better to be head-down working on the next release, but I think just a little more communication or visibility into the project might have helped alleviate some of the concerns.

                                                                                          1. 3

                                                                                            This topic was addressed by Evan (creator of Elm) in his recent talk at Elm Europe 2018 titled: “What is success?”

                                                                                            1. 2

                                                                                              So I watched the video, and this is addressed around the 41 minute mark: “There’s pressure on me to be always be saying everything that’s going on with Elm development, and the trouble is that it’s not always very interesting… it’s like… ‘still working’”.

                                                                                              I think “still working” would have been better, though. I don’t think anyone expected weekly updates. Every 2 months updating the Github readme with “still working” would have been fine. And the fear that saying you’re working on X and then it doesn’t pan out, so better to not say anything at all, seems like the worse option.

                                                                                              I also think the talk is a little dismissive of Javascript, and the community. Sure, the number of packages is by no means the be-all of a good language ecosystem, but it says something about the platform and its viability. If nothing else, it means there are alternatives within the ecosystem. People have limited time, and very limited time to invest in learning brand new things, so they naturally look for some way to compare the opportunities they have. Is looking at numbers the ideal behaviour? Maybe not, but if I want to sell Elm to my boss and she asks me when the last release was and I say “18 months ago” and she asks if I know when the next one will be and I say “no”… that’s how languages don’t get adopted and ecosystems don’t grow.

                                                                                              As a complete outsider, but also as someone who wants Elm to succeed, I think community management is something they need to take really seriously. It seems like Evan really doesn’t want to do it, so fine, have someone else do it. You can dislike that there are persistent questions about the future of your project, but they’re best addressed at the time, not left unanswered.

                                                                                              1. 3

                                                                                                Personally, I’m not really convinced by those arguments.

                                                                                                I especially don’t understand why 18 months since last release, and no known date of new release, are arguments against adoption of the language. Take C or C++ — they rarely have new releases. Is this an argument against adoption? I don’t think so; actually, more like for adoption in my opinion! Slow pace of releases can mean that the languages are mature and stable. I’d be really surprised and annoyed by a boss who would think otherwise.

                                                                                                It now occurred to me, that maybe Lua is a good example of a language having a similar development mode as Elm. It’s also evolved behind super tightly closed doors. And new versions are usually dumped on the community out of the blue; though usually with public betas & RCs. But those are published only for fleshing out bugs; language design input is mostly not taken into account. AFAIK, the community is generally OK with this. And the language is totally used and relied upon in numerous niches in the industry (including a large one in game development)!

                                                                                                1. 5

                                                                                                  “Elm” includes the language specification and the compiler.

                                                                                                  The C language specification rarely has new releases, but the C compiler, gcc, has 4 releases per year. There would be major concern from the community and your boss if gcc activity was perceived as drying up.

                                                                                                  1. 1

                                                                                                    Ah; good one, never thought of it this way; big thanks for pointing this out to me!

                                                                                                  2. 2

                                                                                                    Take C or C++ — they rarely have new releases

                                                                                                    C and C++ have been mature and in very wide use for decades, where Elm is a very young language - just a few years old. Same with Lua, it’s been in widespread use for, what, 10 years or more? I think that’s the difference. Elm is still much more of an unknown quantity.

                                                                                                    Slow pace of releases can mean that the languages are mature and stable

                                                                                                    Sure - when the language is mature and stable. I don’t think anyone would consider Elm to be that way: this new release, if I understand correctly, breaks every package out there until they’re upgraded by their maintainer.

                                                                                                    1. 3

                                                                                                      Personally, after some initial usage, I currently actually have a surprising impression of Elm being in fact mature. It kinda feels to me as an island of sanity and stability in the ocean of JS ecosystem… (Again, strictly personal opinion, please forgive me should you find this offensive.) I didn’t realize this sentiment so strongly until writing these words here, so I’m also sincerely curious if this could be a sign of me not knowing Elm well enough to stumble upon some warts? Hmh, and for a somewhat more colourful angle, you know what they say: old doesn’t necessarily mean mature, and converse ;P

                                                                                                      And — by the way — notably, new releases of Lua actually do also infamously tend to break more or less every package out there :P Newbies tend to be aggravated by this, veterans AFAIU tend to accept it as a cost that enables major improvements to the language.

                                                                                                      That said, I think I’m starting to grasp what you’re trying to tell me. Especially the phrase about “unknown quantity”. Still, I think it’s rare for a language to become “corporate grade non-risky”. But then, as much as, say C++ is a “known quantity”, to me it’s especially “known” for being… finicky

                                                                                              2. 2

                                                                                                Yeah the last release was in Nov 2016.

                                                                                                1. 1

                                                                                                  The devs are active on https://discourse.elm-lang.org/, which might help people see the project activity.

                                                                                                2. 1

                                                                                                  since they recently disallowed using javascript in elm packages, it only makes sense that they’d lead with what that had won them, i.e. function level dead code elimination.

                                                                                                1. 6

                                                                                                  The Typeclassopedia is such a great resource!

                                                                                                  If anyone wants a PDF or EPUB version, I maintain a Pandoc markdown version at https://github.com/ehamberg/typeclassopedia-md (go to releases to download a ready-made PDF or EPUB file).

                                                                                                  1. 12

                                                                                                    I recommend the episode of DevOps Cafe with Kelsey Hightower discussing about this complexity.

                                                                                                    The whole idea is that in the enterprise world, processes and workloads are différents, no 2 différent companies have the same constraints, and k8s is answering this with much complexity and flexibility.

                                                                                                    In this episode, John Willis is wishing that something as simple as a docker compose file would be enough to describe applications, wish that Kelsey answers to with few examples of popular demands that cannot be expressed at all with a compose file.

                                                                                                    I strongly recommend the podcast and this episode.

                                                                                                    1. 13

                                                                                                      Link to the episode for the lazy: https://overcast.fm/+I_PQGD1c

                                                                                                    1. 4

                                                                                                      Isn’t this from 2002? If so that’s probably important context to be aware of. :)

                                                                                                      https://scholar.google.com/scholar?cluster=15142864505292191490

                                                                                                      There is a what happened? discussion from Reddit from five years ago here.

                                                                                                      1. 7

                                                                                                        Blink is a GPLv3-licensed SSH and Mosh client for iOS. It is pretty much what lets me travel light: With Blink I can travel without a laptop and use an iPad Pro with a smart keyboard to connect to and troubleshoot systems, or even do some limited development if it came to that. (The latter is more of a peace-of-mind thing, but it’s far from unpleasant.)

                                                                                                        Warmly recommended, and easily worth the price if you don’t want to compile it yourself.

                                                                                                        P.S: It’s almost embarrassing to say, but one of my favourite features is that it allows re-mapping caps lock to ctrl, which is usually not possible on iOS.

                                                                                                        1. 2

                                                                                                          Right now I use Prompt for ssh. Besides the fact that Blink has mosh support, is it better than Prompt?

                                                                                                          1. 1

                                                                                                            Blink also has more options for remapping certain keys on your keyboard, like “Caps as Esc”, “Shift as Esc”, etc. Although I have not purchased Prompt, since Mosh support for me is indispensable, these are other aspects people usually cite when comparing these two products.

                                                                                                            1. 1

                                                                                                              Prompt is also really, really good, and if you don’t need the Mosh support I don’t really see any big reasons to switch.

                                                                                                              1. 1

                                                                                                                I think the thing about Mosh support is that nobody thinks they need it until they get hooked in. :-)

                                                                                                          1. 10

                                                                                                            Don’t enter any passphrase, just press an ENTER key. You don’t want to provide it everytime you are trying to establish a connection, don’t you?

                                                                                                            That’s quite dangerous advice. You should still have a strong password on your private key file and use an agent to avoid having to type the password every time you use the key.

                                                                                                            1. 3

                                                                                                              Beyond dangerous. Completely ignorant.

                                                                                                            1. 17

                                                                                                              Another fun one:

                                                                                                              λ> let 2 + 2 = 5 in 2 + 2
                                                                                                              5
                                                                                                              

                                                                                                              (Plus a very stern non-exhaustiveness warning.)

                                                                                                              1. 12

                                                                                                                Is that a redefinition of infix + defined only on a left and right argument of 2? Terrifying.

                                                                                                                1. 5

                                                                                                                  It’s slightly less weird when you consider that operators in Haskell are just syntactic sugar for functions, and functions can be partially defined using pattern-matching on the LHS of the definition. For example, this trivial function returns True when its argument is 0, and False otherwise. You could of course trivially define it in one body too, but you can also use pattern-matching on arguments like this:

                                                                                                                  isZero 0 = True
                                                                                                                  isZero _ = False
                                                                                                                  

                                                                                                                  So you can partially shadow a function locally by defining it with a pattern-matching head: anything that matches the local definition will execute that, and anything that doesn’t continues to search bindings further out in scope.

                                                                                                                  1. 2

                                                                                                                    Yep! That’s exactly it. :)

                                                                                                                1. 2

                                                                                                                  So this creates the function code from the types? I don’t understand how that works.

                                                                                                                  If I have Int -> Int -> Int how would that know I want the function foo bar baz = bar + baz and not foo bar baz = bar - baz?

                                                                                                                  1. 10

                                                                                                                    It can’t. Your type is too general. Not sure what this specific plugin will do, but it will probably just come up with some expression that will have that type. Possibly the one you want – but probably not. :)

                                                                                                                    For example of types of functions where the types will only allow one, correct implementation, look up implementations of e.g. length-indexed vectors or red-black trees in dependently typed programming languages. It’s also interesting to look at the interactive modes for languages such as Agda and Idris where you can tell your editor “complete this expression” and it will do that (or tell you that it’s not able to, and what’s missing).

                                                                                                                    1. 2

                                                                                                                      I think it is relying on the free theorems guaranteed by parametricity.

                                                                                                                      See Philip Wadler’s paper Theorems for Free!

                                                                                                                      1. 1

                                                                                                                        I believe that these tools are not based on parametricity, merely on syntactic proof search (in essence, enumerating possible terms at this type, using techniques from the proof search literature). If you think about it, theorems-for-free does not actually help you generate code at arbitrary types.

                                                                                                                        1. 1

                                                                                                                          Ok, thanks.

                                                                                                                          But I think the fact that this is possible is a side effect of the free theorems granted by parametricity.

                                                                                                                          Which explains why it is not possible to do this with a concrete type signature, as per the original question.

                                                                                                                          1. 2

                                                                                                                            Abstract types and parametric polymorphism are a nice language feature that has several consequences. One is the existence of free theorems (technically, a nice denotational semantics in the categoy of relations), another is the possibility of having a restricted enough search space that blind proof search produces sensible/interesting program. Those two consequences are independent, I don’t think that you can claim that one is a “side effect” of the other.

                                                                                                                            “Theorem for free” is an interesting and thought-provoking and well-written research article, so people will easily share it and think about it. This is great! But it also result in some miscomprehensions (or at least exaggerations) about what the result says, which result in the article sometimes being cited in situations where it is not actually relevant (besides being in the same scientific domain as the work being discussed). I thought you may be interested a slightly more detailed picture of the technical details at play here.

                                                                                                                            1. 1

                                                                                                                              Thanks for the clarification. As you say, this is stuff I know exists, but do not work with it daily so do not understand the full implications and shortcomings.

                                                                                                                    1. 4

                                                                                                                      I simply leave out the email address from the global gitconfig file (that’s synced between computers), and will be prompted by git to provide it the first time I want to commit for every new project I clone.

                                                                                                                      1. 1

                                                                                                                        Seems to be fixed in macOS 10.13.2, too, with some refinements(?) coming in 10.13.3:

                                                                                                                        https://twitter.com/aionescu/status/948609809540046849

                                                                                                                        1. 1

                                                                                                                          Both are far too complicated for me. As a smarter person than I once said, “any command I cannot immediately remember might as well not exist.”

                                                                                                                          1. 2

                                                                                                                            typing tmux on a remote server beats having to restart a job when the network connection dies…

                                                                                                                            1. 1

                                                                                                                              That use case fell away for me when I started using mosh.

                                                                                                                              1. 2

                                                                                                                                Mosh is great, but it doesn’t solve the issue with client dying (e.g., due to logout or reboot) and doesn’t let you connect from multiple clients.

                                                                                                                          1. 0

                                                                                                                            My question is why you would want to pretend that programs don’t modify or have state. That seems like attempting to do welding without heating metal. Hot metal can cause problems and requires skill, but it’s kind of the point.

                                                                                                                            1. 5

                                                                                                                              I’m only talking for my self, of course, but I don’t pretend that programs don’t mutate state when I write code in a purely functional language. I know the compiler will do that behind the scenes. Having immutable state in the programming model is about eliminating some classes of bugs and making it easier to reason about.

                                                                                                                              I’m also really happy about having virtual memory even though I’m only “pretending” that I have large, contiguous blocks of memory in a suspiciously big memory space.

                                                                                                                              (Juggling [memory blocks] can cause problems and requires skill. ;)

                                                                                                                              1. 1

                                                                                                                                Good point, but all abstractions are tradeoffs. Even virtual memory is an abstraction with a cost. There is a compelling argument in favor of being able to mark functions or calculation as side effect free or purely functional, but it seems to me that e.g. trying to make I/O “functional” involves a lot of effort and complexity and no real advantage.

                                                                                                                                1. 3

                                                                                                                                  This is an area of active research, so I don’t expect that monad transformer stacks are the last word in handling effects. That said, in order to mark something as “side effect free” or “pure” requires that you have a way of encoding what is impure. That is, you can’t just say: “This is a pure function!” without knowing what “pure” means. Monads and monad transformer stacks are essentially ways of saying: “This thing handles impurity of a particular kind.” For example, Maybe handles the impurity of a result that may or may not happen; Reader handles the impurity of a configuration environment; Either handles the impurity of two potential branches of execution (i.e. errors).

                                                                                                                                  1. 1

                                                                                                                                    I’m restricting myself to “pure function” as “no side effects”. I have never understood the utility of monads - they seem to be complex ways of describing mundane operations.

                                                                                                                                    1. 4

                                                                                                                                      That’s what I’m saying, though: a “side effect” has to be codified somehow. If it isn’t captured in the type, then it looks fine to the compiler; printf returns an int, after all, so how is it to be marked as a side effect? That is the utility of monads. Maybe (or Result in Rust) is the most obvious example: your type is literally saying “Something may or may not come back,” and you then must deal with that either by passing that uncertainty “up the chain” or by dealing with the uncertainty at the point of origin. This is encoding the side effect of an uncertain return which, in more typical languages, is represented by null (None, nil, …).

                                                                                                                                      1. 1

                                                                                                                                        If your mechanism of capturing function semantics is restricted to the type or signature, you have to encode all sorts of things in the types. Alternatively, you could just have a keyword, as in D, for example. I’d like a compiler directive in C to designate a function as “pure” in that sense - it would allow many optimizations and perhaps discourage C compiler writers from coming up with stupid optimizations based on undefineds.

                                                                                                                                        Ok, I didn’t know that GCC/Clang both support “pure” attributes. So there.

                                                                                                                              1. 6

                                                                                                                                … and someone else expanded it to include DigitalOcean, Vultr, Linode, OVH, and Scaleway:

                                                                                                                                https://gist.github.com/justjanne/205cc548148829078d4bf2fd394f50ae

                                                                                                                              1. 8

                                                                                                                                I like typeclasses in Haskell, but I can totally see why Elm doesn’t have them due to its focus on being easy to learn (especially for people coming from js) and having good, helpful and specific error messages.

                                                                                                                                I really hope it’s possible to have good error messages also with type classes, but at least today, with GHC, they are very confusing for beginners. Since you could have a Num instance for strings, the error messages when beginners try to appending strings by using + is

                                                                                                                                No instance for (Num [Char]) arising from a use of ‘+’
                                                                                                                                

                                                                                                                                instead of

                                                                                                                                expecting the argument to be a number, but it is a string