1. 15

    Does “master” in the context of git mean master like in “master and slave”, like “master bedroom” or like “come here young master!”? I’m not a native English speaker, but it’s a word with multiple meanings, right?

    1. 11

      It is indeed a word with multiple meanings. But the people who initially developed git had previously used a tool called bitkeeper, and were inspired by its workflow. It used the term master like in “master and slave”.

      https://github.com/bitkeeper-scm/bitkeeper/blob/master/doc/HOWTO.ask#L223

      So the most benign explanation is that git used the term in the same sense.

      1. 14

        And until people started talking about it recently, if you asked anyone what the “master” branch meant, they didn’t give that answer – they thought it meant like “master copy”.

        So in a very real sense, the people promoting this explanation are actually creating an association that did not exist in people’s minds before, and incurring stereotype threat that did not need to exist.

        I understand the sentiment, but I think this has negative utility overall.

        1.  

          I don’t think any of the meanings commonly assigned to “master” really fit git’s usage. The only explanation I have heard that I find particularly satisfying is that people accustomed to bitkeeper adopted a familiar term.

          It’s not really like a “master copy” or a “master key”. Nor does it control anything, which is usually the sense for “master/slave”. I expect if they had been working without the context of BK, it’d have been called “primary” “default” or “main” in all likelihood. I think giving it a clearer name rather than continuing to overload the poorly chosen term “master” has some small utility, as long as it doesn’t break too much tooling too badly.

          And I think a much more interesting question about git is whether Larry McVoy still thinks it was a good move to spawn its creation by revoking the kernel developers’ license to use it on account of Tridge’s reverse engineering efforts.

          1. 6

            I think it means master copy in that all branches come back to it when finished. So at any given point in time it has the most finished, most production, most merged copy.

            Like if you are mixing a song and you put all the tracks together into a master copy. That’s like bringing all the branches together and tagging a release on master.

            If anything, git branches are in no way “slave” or “secondary,” just works in progress that will eventually make it into master, if they are good enough.

            That’s at least how I understood it.

            1.  

              I certainly would have no argument with using main, default, or primary if creating a new system. It would be a little more descriptive, which is good. I don’t think it’s better enough to upset a convention, though.

              (One argument against master/slave in disk and database terminology, besides the obvious and very valid societal one, is that it can be terribly misleading and isn’t a good description.)

          2. 9

            But git never adopted the concept of master as in the meaning “master/slave” only in the meaning “master branch” (like “master key”), right?

            1.  

              I thought it was more in reference to “master copy” akin to an audio recording.

              1.  

                I don’t recall any usage of the word slave in git.

                I find it impossible to say, though, because none of the meanings you listed are really a good fit for git’s usage of the term. I think the only answer is that it was familiar from BK.

                Something like “main” or “primary” would better match the way it gets used in git.

                1.  

                  Or something like “tip” or “trunk”…

                  yep I’m using trunk in new projects now, as an SVN reference :D

                  1.  

                    Heh, i’m tempted to use attic to be even more contrarian then.

                    1.  

                      I would encourage main simply because it autocompletes the same for the first two characters. :-)

              2. 17

                Yes, for example Master’s Degree

                1.  

                  But it’s the dumbest branch. It knows less than other active branches, it only eventually collects the products of the work on other branches.

                  Of all the meanings of master, I can only think of one where this analogy applies.

                  It also doesn’t “do everything” like a master key, it does the same thing as all the active branches, or one thing less if a feature is completed on that branch. Code in the master branch should be the most active, so it’s not a bedroom. It’s the parent of all the others so it’s not a young master.

                  It’s a boss, a leader, a main, or indeed a slave master. Any of these analogies would fit.

                  1. 7

                    Master in git doesn’t mean master like any of those things. It means finished product, master. The exact same way it’s used in media, for example, when a “remastered” song is released.

                    1. 6

                      Gold master.

                  2. 7

                    There is some further discussion about this on the GNOME desktop-devel mailing list. Petr Baudis, who was the first to use “master” in the git content had intended it in the “master recording” sense.

                    Edit: Added additional link and removed “Apparently”

                    1. 6

                      Arguably language changes with usage, but in this case if you look at where the word came from, Git is based in many ways on Bitkeeper, which had master and slave both, so it would fall into the first category.

                      1. 15

                        But surely git isn’t using the word with that neaning, since there are no slave brances? Or?

                        1. 8

                          That’s how I feel about it, but apparently others disagree.

                          1.  

                            Git was made by Linus Torvalds. If you know anything about the guy, you’d know that the only human aspects he takes into consideration is efficiency of tool use. Having named slaves is more useful, and once they have name there’s no reason to call them that anymore.

                            1. 8

                              Linus didn’t introduce the master branch concept, that was a dude named Petr ‘Pasky’ Baudis. He recently clarified that he intended to use it in the sense of ‘master copy’, but he may have been influenced by ‘master-slave’ terminology.

                          2.  

                            Thinking in terms of what the authors themselves meant at the time, and whether or not the word “slave” is explicitly stated is a pretty limiting framing of the issue IMO. In reality, people react negatively to using metaphors of human dominance to describe everyday tools.

                            1.  

                              In reality, git’s use of master has not resulted in a preponderance of negative reactions.

                              It’s used millions (billion?) of times a day with neutral to positive reactions, I expect.

                              I would like to see this empirically validated, but I think “In reality, people react negatively to using metaphors of human dominance to describe everyday tools.” is unverified at best and probably false.

                          3.  

                            Do words become taboo only due to their original meaning, or to their current meaning? Or both? What if I make up a false etymology to make a word sound bad, do you then have an obligation to stop using it?

                        1. 2

                          Seems like this will make deployment of NixOS systems with out-of-tree Nix modules much less painful. Looks like Gemfile.lock for the whole system.

                          1. 2

                            Yep, this is great, I have HUGE hacks around nixpkgs/etc… to mimic something like this.

                            1.  

                              It’s especially bad with nixops right now… needing a shell.nix for nixops seems like it misses the point.

                          1. 6

                            Interesting article, but saying we can’t truly fix free software until we destroy capitalism feels at once both a bit extreme and unhelpful.

                            It’s a nice idea (Who doesn’t want to live in a world where everything is free? Oh wait. A lot of people :) but I’d rather focus on ideas that help us iteratively improve the current situation.

                            1. 17

                              I think the author’s point is that the free software movement is already a radical philosophy, but one which is doomed to failure by its individualist focus. As a movement, it doesn’t offer a solution for how to make free software the natural choice (where the structure of our systems inherently directs people to select it as the best option), preferring instead to focus on convincing individuals that it is the right choice (which may be true, but doesn’t scale, and will constantly fight against whatever the natural choice is, which is why open source has eaten free software’s lunch).

                              So the choice is between an ineffective radical philosophy and a potentially effective one.

                              1. 4

                                how to make free software the natural choice…the best option

                                There are many things that changed since the late 1990s when free software was the dominant ideology. One is that Google, and ultimately all of big tech, co-opted open source to mean “you are free to have all of the source code to the client that talks to our centralized proprietary service.” Having done so, free software isn’t the natural choice, because the benefits of freedom in being able to change the system to do what you want is not present. Its capabilities are limited to what the proprietary service provides, and it only works if the client implements what the proprietary service requires.

                                1. 3

                                  I’m not sure in what sense it’s the case that “open source has eaten free software’s lunch”. At the moment, free software and open-source software are basically synonymous. An open-source library developed by paid programmers working for some Microsoft- or Facebook-sized corporation is free in exactly the same way that GNU Emacs or Firefox is.

                                  There are people who would like to change this situation - create and popularize software licenses that are “open-source” in the sense of having the source code be publicly available, but non-free in the sense of imposing four-freedoms-violating conditions on the use of that software. But the two main motivations for doing this are to prevent large cloud providers (such as Amazon specifically) from releasing products based on open-source software that might compete with smaller companies that develop such software, and to prevent organizations and people with political views specific activist programmers find distasteful from being able to freely use useful software. The former consideration is an attempt to limit the power of well-capitalized corporate institutions, and the latter is associated with “culturally leftist” politics but doesn’t directly help or hinder such institutions.

                                  1. 1

                                    At the moment, free software and open-source software are basically synonymous.

                                    I disagree, because “free software” is actually less free (as in freedom) than open source.

                                    For example, let’s say that “Bob” wants to release a videogame toolkit. He starts with the Quake III Arena source code (released under the GPL). He spends months building a complete game creation toolkit around it the likes of which could be compared to any modern AAA game engine.

                                    But, there are still sections of code that are recognizably Quake. If he tries to sell this thing that he spend so long on, he could get a cease-and-desist (and likely will).

                                    Imagine a similar situation where “Alice” does the same thing with the Sauerbraten engine (zlib license). She gets to sell her work (and it is hers if she’s spent months working on it). She can then decide later that she would like to release the source on her own time.

                                    Who had more freedom?

                                    This is a contrived example, because no reasonable person would start with GPL software who wants to sell something. The point is that “Bob” can’t use the Quake source for his own gains even though ID has decided that they are done using it.

                                    1. 3

                                      I don’t know how long you’ve been in the open source/free software realm, but these arguments were done to death 20 years ago.

                                      The difference is perspective: freedom for the developer vs. freedom for the user. When GNU started, AT&T was exercising its “freedom” to maintain exclusive control of UNIX, and RMS wanted the “freedom” to control what happened on his computer.

                                      From time to time this is intentionally confused by people with an agenda, as in “free software isn’t free because it doesn’t let us freely screw users.”

                                      1. 4

                                        I don’t know how long you’ve been in the open source/free software realm, but these arguments were done to death 20 years ago.

                                        Well, I’m only 20.

                                        The difference is perspective: freedom for the developer vs. freedom for the user.

                                        As the developer you always have the freedom to not release the source. As the user, you can choose to ignore the license (at your peril). Your freedom ends where another person’s freedom begins. It’s selfish and arrogant to think that you “deserve” to control other peoples use of your product.

                                        I like to draw a parallel with firearms. You have a right to not own one, but you cannot prevent me from owning one. Substitute any politically correct item for firearm if you wish.

                                        From time to time this is intentionally confused by people with an agenda, as in “free software isn’t free because it doesn’t let us freely screw users.”

                                        This is attributing the (perceived) malice of large corrupt corporations to people like me who prefer to keep personal liberties intact. It’s shameful.

                                        1. 5

                                          This is attributing the (perceived) malice of large corrupt corporations to people like me who prefer to keep personal liberties intact. It’s shameful.

                                          I didn’t mean to attribute it to you. As I said at the beginning of the post, I’m not sure about your background (thanks for clarifying it.) I do mean to say that the argument you provided is also provided by people with an agenda, and I’d encourage you to think critically about it.

                                          Your freedom ends where another person’s freedom begins. It’s selfish and arrogant to think that you “deserve” to control other peoples use of your product.

                                          Very true, but consider what that means in the context of software. Software released without source is trying to exercise control over the use of the product by preventing the user from altering it or improving it. These days it often goes further with code signing, DRM, online activation, etc, which is increasing the degree of control.

                                          The point of copyleft is that if we accept as a society that authors control the use of their product, then authors are free to prevent what they would see as misuse of that product, including distributing it without source code. There is an alternate universe where authors have much less control in general, but we happen to live in this one.

                                          The genius of RMS, IMHO, was more about economics than software. He observed that in a market where fixed costs are high and marginal costs are low, which software takes to the extreme, the result will be a small number of vendors and a large number of users. In that context, users do not have a remedy through competition: they cannot choose a vendor that gives them the level of freedom they want. Market forces would push any user-respecting vendor out of existence. Taking your example, find a games publisher that releases source code [edit: to their new release game]. In the ultimate, he observed that the degree of vendor control would only increase over time, without limit, which has since proven to be true. In the last 15 years we’ve moved from a world where anyone can write a device driver or application to a world where these need to be approved by platform vendors, for example, and entire classes of software are unavailable to users as a result.

                                          If competition among vendors can’t deliver the products users want, then the issue needs to be around restricting what vendors can do to ensure users can do what they want. As you put it, one person’s freedom ends where another person’s begins - but if we accept that anything which restricts the freedom of vendors is bad, then we accept that users should have no freedom whatsoever.

                                          1. 2

                                            Prologue: This thread has ended up way longer than I thought. Thank you for your time.

                                            I think we agree on a lot of principles, we just disagree on where the line between author and user freedom is.

                                            Fair warning, my firearm analogies got a little out of hand. If you are unfamiliar, feel free to ask for clarification.


                                            I didn’t mean to attribute it to you.

                                            Yes, I re-read the comment and I think I was being a little paranoid :)

                                            Software released without source is trying to exercise control over the use of the product by preventing the user from altering it or improving it.

                                            The same thing happens when somebody releases a product without specifying exactly how it was put together. For example: there are a fair amount of proprietary firearm designs, but the most popular rifle (AFAIK) is the AR-15. A modular design that pretty much anybody is allowed to manufacture and sell (well, if the government lets them).

                                            These days it often goes further with code signing, DRM, online activation, etc, which is increasing the degree of control.

                                            I see code signing as a net good. I appreciate the assurance that when something runs with administrative privileges that the program is (sort of) verified. DRM can be done well, but most companies do it wrong. Steam is pretty good, but if they were a smaller company I wouldn’t trust them as much (mostly because I would have no guarantee that they would stick around).

                                            The point of copyleft is that if we accept as a society that authors control the use of their product, then authors are free to prevent what they would see as misuse of that product, including distributing it without source code. There is an alternate universe where authors have much less control in general, but we happen to live in this one.

                                            Code authors cannot control the use of their product, in the same way that a firearms manufacturer cannot prevent people from murdering people. All you can say is “we do not warranty this software if it is used for anything other than…”.

                                            The genius of RMS, IMHO, was more about economics than software. He observed that in a market where fixed costs are high and marginal costs are low, which software takes to the extreme, the result will be a small number of vendors and a large number of users. In that context, users do not have a remedy through competition: they cannot choose a vendor that gives them the level of freedom they want. Market forces would push any user-respecting vendor out of existence.

                                            I agree with this statement, but I believe the solution is more information. If more people knew how corrupt big tech was then they would use them less.

                                            Taking your example, find a games publisher that releases source code.

                                            I think the new Unreal Tournament is “public” source. UE4 and Crytek are also “public” source (with EULAs and royalties of course).

                                            In the ultimate, he observed that the degree of vendor control would only increase over time, without limit, which has since proven to be true.

                                            I assume by he you mean Richard Stallman.

                                            In the last 15 years we’ve moved from a world where anyone can write a device driver or application to a world where these need to be approved by platform vendors, for example, and entire classes of software are unavailable to users as a result.

                                            Sure anybody can write a device driver. The approval process is IMHO necessary because otherwise somebody could socially engineer people into installing a malicious driver or application (technically still possible, but more difficult). It’s like a carry permit. It (ostensibly) proves that you are competent and stable, and that you won’t use your thing (firearm, device driver) to intentionally harm an innocent person.

                                            If competition among vendors can’t deliver the products users want, then the issue needs to be around restricting what vendors can do to ensure users can do what they want. As you put it, one person’s freedom ends where another person’s begins - but if we accept that anything which restricts the freedom of vendors is bad, then we accept that users should have no freedom whatsoever.

                                            How does not restricting vendors lead to users having no freedom? I don’t mean to be snarky, I just don’t understand.

                                            1. 6

                                              I think the high level observation I’d make is that each of us exist in a society that establishes certain “normal” practices. Those practices change over time. When RMS was starting in software, “normal” meant that commercial vendors provide sources, and moving away from that was a redline for him. When I was starting in software, “normal” meant closed source but no signing/activation/forced updates, and moving away from that was a redline for me. Over the next couple decades, “normal” will continue to change and the things which seem normal for you now will become more restrictive due to competitive forces. When you see it happen, RMS stops looking crazy.

                                              I see code signing as a net good. I appreciate the assurance that when something runs with administrative privileges that the program is (sort of) verified.

                                              “Verified” in this context means it does what the vendor intended, not that it does what you want. If it was done to verify that it does what you want, then you’d be in control of the certificates that you’re willing to trust, and would be able to use software that is trusted by anyone you trust. As it stands, you’re not allowed to run code that you wrote yourself, because the vendor doesn’t trust you.

                                              Code authors cannot control the use of their product…

                                              (I’m avoiding firearms comparisons since it’s a business I don’t know anything about.) Code authors have an unusually high amount of control due to things like the DMCA which give legal protection to any measure they can create. Control is just an arms race - if it can be enforced somehow, it’s legal and legitimate. The makers of devices have a lot of resources to ensure they retain control of things like the applications that run, and they are highly motivated to exercise that control since they get a 30% cut. The maker of a hammer cannot control how it is used, but the maker of a technical device can and does control the software that runs on it (although you are free to use it to drive nails into a wall, which is often its most valuable use.)

                                              I believe the solution is more information. If more people knew how corrupt big tech was then they would use them less.

                                              Users are given the choice to use tech or not use tech. They do not have a competitive remedy. Your cell phone company knows where you are at all times and sells that information to marketers. Your remedy is to not carry a cell phone. It is true that if everyone rejects the entire category of tech then the problem goes away, but that seems like a big societal failure that gives us a choice between dystopia or dark ages.

                                              I think the new Unreal Tournament is “public” source.

                                              It’s an interesting model to be sure, but note that UT4 is cancelled. You’re free to get the source code so long as anything you do with it has copyright assigned such that your contributions can be released as part of UT4. This is a volunteers-develop-a-commercial-product model. I think the reason this thread started - taking issue with the idea that “free software” is more free than “open source” - is because “open source” is often a volunteers-develop-a-commercial-product model. This one happens to be far more explicit than most.

                                              Sure anybody can write a device driver. The approval process is IMHO necessary because otherwise somebody could socially engineer people into installing a malicious driver

                                              To be clear, you can write a device driver, but you cannot run the thing you just wrote.

                                              The argument about needing approval amounts to an argument that users cannot be trusted to make their own decisions. Logically, it applies to anything. Can you socially engineer people into installing a malicious usermode program? Can you socially engineer people to visit a website with a bitcoin miner? Can you socially engineer people to visit a phishing website? If the solution is an explicit approval step, then we’d live in a very different world - perhaps our conversation might need explicit approval, because we might be engaging in social engineering right now.

                                              How does not restricting vendors lead to users having no freedom? I don’t mean to be snarky, I just don’t understand.

                                              This is exactly the argument you made about one person’s freedom ending where another’s begins. It’s easy enough to illustrate by example, but that relies on examining the examples with an open mind, and remembering that in the not-that-distant past things which appear as normal today were not remotely normal.

                                              Personally I’m in the strange position of developing device drivers professionally. There’s a lot of value in them - I’m paid pretty well really - but I haven’t written any open source drivers. Why not? Because nobody could run them. I have written open source applications, because people can run those. But when you’re on both sides of the same fence and realize that you have a skill which is valuable but can’t contribute it to the community, the lack of user freedom becomes very visible.

                                              1. 1

                                                To be clear, you can write a device driver, but you cannot run the thing you just wrote.

                                                I thought that (on windows at least) you could develop the driver and run in unsigned on your own machine? I’ll take your word for it if I’m wrong because I looked at your blog and it looks like you’re a lot more knowledgeable on the subject than I am.

                                                This is exactly the argument you made about one person’s freedom ending where another’s begins. It’s easy enough to illustrate by example, but that relies on examining the examples with an open mind, and remembering that in the not-that-distant past things which appear as normal today were not remotely normal.

                                                I would appreciate an example. My point is that practically speaking a vendor cannot limit the freedoms of a user. They can get the user to agree not to do something, but what cost would be incurred in trying to enforce that agreement?

                                                Personally I’m in the strange position of developing device drivers professionally. There’s a lot of value in them - I’m paid pretty well really - but I haven’t written any open source drivers. Why not? Because nobody could run them. I have written open source applications, because people can run those. But when you’re on both sides of the same fence and realize that you have a skill which is valuable but can’t contribute it to the community, the lack of user freedom becomes very visible.

                                                You have a very interesting vantage point, thank you for your contribution to the conversation.

                                                1. 3

                                                  I thought that (on windows at least) you could develop the driver and run in unsigned on your own machine?

                                                  The bootloader has no way to know whether the unsigned code it’s loading came from your compiler or came from a malicious source on the Internet. The “obvious” way to fix this is to allow for self signed code and allow the user to manage which certificates they trust, but attestation signing is doing the exact opposite of that.

                                                  The way I develop drivers is by running systems under a kernel debugger, which disables driver signing requirements. A kernel debugger runs on a second machine. So you could run arbitrary drivers if you configure a machine to run multiple VMs so one can act as a debugger for the other, but realistically there’s no point writing drivers for that set of users, and nobody is going to run in that configuration to run code that’s not written.

                                                  It’s hard to describe the things that don’t exist as a result of restrictions. I can’t point you to a giant repo of things you can’t run; nobody bothered to create the repo because nobody can use what’s in it. But note that every app store restriction exists to prevent some developer from doing something that users want. (If developers didn’t want to build it or users didn’t want to run it, there’d be no point preventing it, because it wouldn’t have a market.) I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago. Either human creativity just ended, or something is preventing that creativity from getting to our phones - and it’s not hard to find what’s between the developers and the users.

                                                  Edit: To be a bit more concrete, note that most commercial phones have locked bootloaders, and most PCs are capable of booting arbitrary operating systems. As a result, there’s a large PC Linux community, but a very small Android developer community. Since the community is smaller, there’s not as much benefit to a user using a community Android distribution. I don’t know exactly what we’re missing out on, but the PC Linux community has contributed a ton of value, and there’s no equivalent on the phone, because our phones have locked bootloaders.

                                                  1. 2

                                                    So you could run arbitrary drivers if you configure a machine to run multiple VMs so one can act as a debugger for the other

                                                    But note that every app store restriction exists to prevent some developer from doing something that users want.

                                                    Ok, I was sorely mistaken on the kernel driver point. You’re also correct that most app store restrictions are BS. Code signing would also be a lot better if you could permanently “trust” an application like on macOS (or a driver).

                                                    I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago.

                                                    The crazy thing is that I feel like we go backwards in a lot of ways. I’m with you on this one.

                                                    1. 2

                                                      If developers didn’t want to build it or users didn’t want to run it

                                                      One of the common complaints in the Windows world is bundled browser toolbars. While there are people who actually like the Ask Toolbar and Yahoo Search, does anybody want it bundled with the JRE?

                                                      In a strict neoliberal sense, I suppose that users do willingly run the Java installer and consent to everything it installs, but describing it as something that the end users “wants to run” doesn’t ring true. The JRE itself is usually just a means to run some other app, and the bundled toolbars are probably not part of the end-user goal.

                                                      After all, free software distributions like Debian and Fedora have rules about what they allow in their repositories. And plenty of people complain about those rules. But do you actually think they’re trying to be user-hostile?

                                                      I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago. Either human creativity just ended, or something is preventing that creativity from getting to our phones - and it’s not hard to find what’s between the developers and the users.

                                                      Or, as an alternative explanation, the easy and low-hanging fruit has already been exhausted. Web apps haven’t really gotten better now as quickly as they were improving ten years ago, yet it isn’t any more proprietary now than it was in the past (If you say “Google’s fault”, I’ll reply by reminding you of IE6).

                                                      1. 2

                                                        While there are people who actually like the Ask Toolbar and Yahoo Search, does anybody want it bundled with the JRE?

                                                        No, clearly not. But as you say, there are people who want them, outside of the JRE. Platforms which restrict classes of software will invariably exclude software that some people do want. At least personally, I did use the Google toolbar back when it added value to me by displaying Pagerank. Somewhat cynically, I can’t help but notice these things are designed to redirect traffic to obtain revenue, and platform owners would like to keep that revenue for themselves, so they have an interest in preventing things unrelated to user benefit.

                                                        software distributions like Debian and Fedora have rules about what they allow in their repositories…do you actually think they’re trying to be user-hostile?

                                                        No, I don’t. But as distributions, they don’t have a monopoly on software, and a feedback loop exists. If some piece of software is released that breaches a repository rule but a lot of people end up going around the repository to install it, it will spark a conversation about whether the repository’s policies are correct. That’s why people are able to complain about rules. In more closed ecosystems, that new piece of software just can’t exist, so users are excluded from the feedback loop.

                                                        If you say “Google’s fault”

                                                        I think the comments and criticisms I’m making here apply to pretty much all of the tech majors and are comments on restrictions that exist now among multiple vendors which did not exist 15 years ago. I don’t mean to single any one of them out.

                                        2. 2

                                          Both engines are Free Software. Both engines are Open Source. The FSF and the OSI both define their licensing criteria, and the GPL and ZLIB licenses both comply with the Four Freedoms and with the Open Source Definition.

                                          You’re contrasting copyleft with permissive licensing, which is a totally different distinction.

                                          1. 1

                                            Thank you for pointing this out. I thought Stallman’s definition of free software required copyleft.

                                            I stand behind my arguments for permissive licensing though.

                                            1. 1
                                              1. 2

                                                Thank you for linking it. I’ve just read it. I still disagree with a lot of Stallman’s assertions.

                                                1. 4

                                                  I’m not asking that you agree with him. I certainly don’t.

                                                  I just don’t want you to misrepresent him, or anyone else.

                                                  1. 1

                                                    Understandable. We could do with less misrepresentation these days.

                                          2. 2

                                            I don’t quite follow the argument you’re making, nor what distinction you’re drawing between “free software” and “open source”. It sounds like you’re saying that even though a piece of software like Quake III Arena is “free software” (that is, released under the GPL free software license), someone forking that software, writing a derivative work, and trying to sell it would be subject to legal action from Id Software for violating their Quake-related intellectual property rights - whereas some other piece of software Sauerbraten (which I’m not familiar with), released under a different-but-still-FSF-approved license, wouldn’t have this problem?

                                            1. 1

                                              @notriddle hit the nail on the head. I am talking about copyleft vs permissive licensing, the zlib license doesn’t preclude inclusion in proprietary software. The GPL does.

                                              1. 2

                                                I am talking about copyleft vs permissive licensing, the zlib license doesn’t preclude inclusion in proprietary software. The GPL does.

                                                Interestingly, that makes GPL software less free in its own right, copyleft people seem to disagree that this matters but its the root of why some of us dislike it. Sometimes I just want to get my job done and don’t want to involve the legal team. Its also why I don’t put anything I do up as GPL unless I have to. I want others to do the same.

                                                GPL’s virality is both a pro and a con. I lean to it being more of a con in that it imposes a philosophy of world upon source code that I find too extreme. We can differ on this but axiomatically they are approaching free from different starting points.

                                            2. 1

                                              remember that free software has no restrictions on commercial use. so when you say “if he tries to sell this thing that he spend so long on, he could get a cease-and-desist,” you are either mistaken, or employing a rhetorical trick.

                                              it would be more honest to say that bob can’t prevent people from reading and modifying the source code of his game. this may or may not make it more difficult to make money on, depending on the circumstances.

                                              with a clear view of the situation, people can decide for themselves whether the freedom to violate other peoples’ freedom is a worthy criteria for what makes a license “free.”

                                              1. 1

                                                it would be more honest to say that bob can’t prevent people from reading and modifying the source code of his game. this may or may not make it more difficult to make money on, depending on the circumstances.

                                                The reason I chose a game engine rather than a game, is because the product is the source code. Sure, there are a handful of image assets for the GUI but those can easily be replicated. Am I wrong in my understanding that you cannot sell a GPL program without providing the source for free? (or at least allowing the purchasers to distribute it for free?)

                                                with a clear view of the situation, people can decide for themselves whether the freedom to violate other peoples’ freedom is a worthy criteria for what makes a license “free.”

                                                My point is that GPL violates more freedoms than permissive licenses.

                                                1. 4

                                                  Am I wrong in my understanding that you cannot sell a GPL program without providing the source for free? (or at least allowing the purchasers to distribute it for free?)

                                                  yes, the latter is correct.

                                                  My point is that GPL violates more freedoms than permissive licenses.

                                                  yes, it violates the freedom to violate other people’s freedoms.

                                                  1. 1

                                                    yes, it violates the freedom to violate other people’s freedoms.

                                                    What “other people’s freedoms” does a permissive license allow people to violate?

                                                    1. 2

                                                      the freedom to read/modify/share the code.

                                                      1. 1

                                                        Using a closed-source program that is based on open-source software is a choice. Don’t make it if you don’t want to. Vote with your money.

                                                        Here’s something I think we can all agree on: selling a program based on open-source software without putting any significant work in is immoral.

                                                        My additional point, is that one can put enough effort into something that they earn the right to keep the source to themself.

                                                        1. 1

                                                          Using a closed-source program that is based on open-source software is a choice. Don’t make it if you don’t want to. Vote with your money.

                                                          i don’t see your point. same goes for software that was proprietary to begin with. in each case the software violates freedoms. or does it not?

                                                          1. 0

                                                            Yeah, looking back I wasn’t really saying anything there.

                                                            What I should’ve said is: I don’t believe that seeing how everything works and being able to pick it apart/audit it is an inalienable right. (This may have something to do with the fact that I’m a Catholic and I believe things that have no scientific explanation, and to criticize them would be heresy.)

                                                            1. 2

                                                              nor is it an inalienable right to keep proprietary control over one’s modifications to a code base.

                                                              that’s why complaints that the GPL is “less free” come off as concern trolling. if you care about software freedom, you would at least acknowledge that the only freedom the GPL takes away is the freedom to take away other people’s freedom. preferring a license that allows modifications to be proprietary would suggest that you don’t actually care about software freedom, so complaining about the GPL being less free seems hollow.

                                                              if you simply disagree with free software and would prefer to be able to keep control over a digital artifact with no reproduction cost, fine, but you aren’t arguing for freedom at that point.

                                                              1. 0

                                                                if you simply disagree with free software and would prefer to be able to keep control over a digital artifact with no reproduction cost, fine, but you aren’t arguing for freedom at that point.

                                                                I think it depends on your definition of freedom. In a communist sense, the GPL is more free. If property rights factor in at all, then permissive licenses are still superior (even if you don’t think it’s more free).

                                                                The only issue I have with the GPL is that people who legally obtain your source code can distribute it for free, which would destroy any business that I built off of it. As an anti-communist, I won’t participate in the spread of the GPL virus.

                                                                I wish more licenses required that modified source be distributed, but only if they don’t allow users to distribute it further.

                                                                1. 4

                                                                  Whether property rights should apply to intangibles like software is an open question.

                                                                  “Intellectual property” is actually an artificial monopoly enforced by the state.

                                                                  1. 1

                                                                    The only issue I have with the GPL is that people who legally obtain your source code can distribute it for free, which would destroy any business that I built off of it.

                                                                    So what’s your take on Redhat? Their product is GPL’ed, and you can even argue that it benefits them, because anyone who chooses to also use and improve their software, necessarily has to give back their contribution, so that Redhat benefits from it again.

                                                                    1. 1

                                                                      I wish more licenses required that modified source be distributed, but only if they don’t allow users to distribute it further.

                                                                      what do you mean

                                                                      1. 1

                                                                        The GPL requires that modified source be available to users. That’s something that I wish caught on more. I just don’t like the part where the users can distribute the source themselves.

                                                                        1. 1

                                                                          so who can modify the source? only someone with a specific license agreement with the company/person that wrote the code?

                                                                          1. 1

                                                                            The idea would be that anybody who obtains/buys the software can modify it, but they would need a specific license agreement to distribute/sell it.

                                                                            The point would be to put such a clause on an open-source project so that if somebody uses it in a proprietary application, the users can at least modify that portion of the software.

                                                  2. 1

                                                    This point has been made may times, and it boils down to “localized” or “downstream” freedom. Do you give Alice the power to restrict/control their users? Alice could have extended the engine with a mechanism that requires her to be paid every month, or that (for whatever reason) only works on Intel CPUs. By not releasing the source, and allowing the software to be modified+shared, “Carol” is dependent on Alice, or is not allowed to port the engine to her Raspberry Pi. That’s certainly less freedom for her (setting aside that this is “just” a game engine we are discussing). And there are a lot more “Carol”s than there are “Alice”es.

                                                    I’m quite pro-copyleft, and I see it in the same terms (albeit less extreme) as we would dismiss anyone who claims that the fact he can’t own a slave limits his freedom. It’s the freedom to restrict others (“permissive”) vs the freedom from foreign control.

                                                    1. 2

                                                      You can also draw an analogy (I think direct but perhaps not quite) to negative vs positive rights. Permissive licenses grant negative rights to do whatever you want with the software, while copyleft grants positive rights to have access to free software.

                                                      I’m rather sad that all rhetoric about rights tends toward negative rights, even though that’s not what most people care about once a baseline of negative rights is established.

                                                  3. 1

                                                    and to prevent organizations and people with political views specific activist programmers find distasteful from being able to freely use useful software

                                                    what do you mean by this exactly?

                                                    is there any reason releasing code under the GPL would not satisfy the wants of these smaller companies?

                                                    1. 1

                                                      what do you mean by this exactly?

                                                      The people who promote licenses like this want to be able to write software under a license that is widely-accepted as open-source but that also bans their political enemies from using the software.

                                                      is there any reason releasing code under the GPL would not satisfy the wants of these smaller companies?

                                                      The GPL allows software licensed under it to be used for any purpose, and creating a SaaS product that competes with the SaaS product the core developers of the software use to fund themselves is “any purpose”.

                                                2. 4

                                                  challenging capitalism is perfectly compatible with iterative improvements. you can make iterative steps to put more resources and power in the hands of working people, and less in the hands of corporations. the importance of free software comes when you see that proprietary software is one lever of power that corporations can use against working people.

                                                  1. 5

                                                    It’s a nice idea (Who doesn’t want to live in a world where everything is free? Oh wait. A lot of people :) but I’d rather focus on ideas that help us iteratively improve the current situation.

                                                    Capitalism != markets. If you’d like I’d be happy to answer questions, but this is my usual recommendation for friends who have been taught that all market systems are “capitalism”. https://m.youtube.com/watch?v=ysZC0JOYYWw

                                                  1. 3

                                                    I’m curious if one could achieve similar results by blowing air in through the hinge (where the vents are located). But then you’d miss out on the satisfaction of seeing those squeeky clean fans at the end.

                                                    1. 2

                                                      I would think that might cause the fans to spin. I seem to recall hearing somewhere that this can be a bad thing, since it might damage the fans (somehow? maybe my spinning them in the wrong direction, or at an RPM that is too high?), but maybe that was just some unfounded rumor?

                                                      1. 3

                                                        Ah, I didn’t mention this in my post. I’ve read similar concerns that making the fans spin at too high of a RPM can damage them. I don’t know how valid the concern is, but just in case, I did use a toothpick to stop the fans from spinning while I used the compressed air to clean them.

                                                        1. 1

                                                          It depends on the machine. I doubt it’d be a problem on Macs because the Apple Tax allows them to cut fewer corners than a budget box, but (AFAIK, IANAEE etc) the issue is that you generate voltage in the motors of things like fans or 3d printers by moving parts around via external force, and this can hurt (sensitive | cheap | poorly isolated) circuitry.

                                                          1. 1

                                                            Yeah i would not spin the fans up… overspeeding them has caused mine to not sound good a while back so now i just hold them stationary while using the air… seems to work much safer. also, considering a fan is basically a generator in reverse i would think it could create some overvoltage on the board? Maybe apple thought of that too?

                                                            1. 2

                                                              I remember a buddy of mine who fried his PC mainboard by using compressed air from a generator to remove dust.

                                                              1. 2

                                                                Though I have no doubt this could happen, I cleaned out an old ThinkPad T61 with a leaf blower and it continued to run well for 3 more years.

                                                                1. 1

                                                                  Might’ve been around 2005 or earlier. They probably have circuitry now that can prevent this kind of damage now that hasn’t been available in cheap motherboards from yesteryear.

                                                                  1. 1

                                                                    Compressed air from a generator normally has condensation that shows up at the destination side as water vapor condensed onto the pcb. Which probably means you can end up shorting things.

                                                                    Compressed air is the best option, you can’t really protect against bridging circuits outside of the pcb.

                                                                    The leaf blower probably just didn’t condense air, not something I would personally use. Seems too good a way to let the magic smoke out of circuits.

                                                        1. 4

                                                          Yeah! I pretty much use only Homebrew for installing fonts. So much so that I created a tap for myself to install non-free fonts I need when working with documents that actually use Calibri, Cambria, and other Microsoft Office fonts.

                                                          1. 3

                                                            Can also just cp the ttf files into ~/Library/Fonts and avoid needing homebrew. or /Library/Fonts if you like putting stuff in system directories.

                                                            1. 2

                                                              Ha! Sorry, I realized I had “only use” when I meant “use only”. I definitely use Homebrew for far more than fonts since I’m a maintainer of one of its components.

                                                              1. 2

                                                                No worries, just noting fonts in macos don’t need any of this automation. I just copy font files around on a new system setup in a simple shell script.

                                                          1. 3

                                                            I, for one, will keep using scp. Rsync’s interface is too different, with a lot of subtle differences which constantly catches me off guard.

                                                            When was, for example, the last time a non-rsync tool cared about whether you included the trailing slash or not for a path to a directory on a GNU system? Why did rsync decide to completely break with the convention? For most people, I bet the behavior of rsyncing directories mostly depends on whether their tab completion happens to include a trailing slash or not.

                                                            1. 1

                                                              Why did rsync decide to completely break with the convention?

                                                              What convention? It follows the SUS/Posix convention, try mv’ing a file to dir or dir/ and note the difference. dir/ is the same as dir/. and implies something different. Its also to handle cases where symlinks may be present to return ENOTDIR.

                                                              Ref: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap04.html#tag_21_04_13 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap03.html#tag_21_03_00_75

                                                              1. 4

                                                                I don’t see a difference between mv <file> <dir> and mv <file> <dir>/? In both cases, <file> is ends up as <dir>/<file>.

                                                                I’m not talking about destinations though, but source. cp foo/ bar and scp foo/ bar will both copy the directory foo to bar such that bar/foo is a directory with the contents of the old foo directory, but rsync foo/ bar will copy all the contents of foo into bar, like cp foo/* bar would do.

                                                                1. 1

                                                                  I don’t see a difference between mv and mv /? In both cases, is ends up as /.

                                                                  Depends on if something exists or not.

                                                                  $ mkdir /tmp/demo
                                                                  $ cd !$
                                                                  cd /tmp/demo
                                                                  $ touch foo
                                                                  $ mkdir dir
                                                                  $ mv foo bar/
                                                                  mv: rename foo to bar/: No such file or directory
                                                                  zsh: exit 1     mv foo bar/
                                                                  

                                                                  Specifying bar/ here indicates there should be a directory to move to. But its not there.

                                                                  but rsync foo/ bar will copy all the contents of foo into bar, like cp foo/* bar would do.

                                                                  Correct, becuase foo/ is the same as foo/. which means copy the contents of foo/. to the destination. Just as foo without a / indicates you want the directory itself (and contents therein) copied to the destination. That follows cp as well.

                                                                  cp foo/ bar and scp foo/ bar will both copy the directory foo to bar such that bar/foo is a directory with the contents of the old foo directory

                                                                  You sure about that? Show your cards as thats not how cp works on any unix i’ve used example from my laptop:

                                                                  $ mkdir -p input/{a,b}                                                                                                                                                                                    
                                                                  $ mkdir output
                                                                  $ cp input/. output
                                                                  cp: input/. is a directory (not copied).
                                                                  zsh: exit 1     cp input/. output
                                                                  $ cp -r input/ output
                                                                  $ find output
                                                                  output
                                                                  output/a
                                                                  output/b
                                                                  $ rm -fr output; mkdir output
                                                                  $ cp -r input output
                                                                  $ find output
                                                                  output
                                                                  output/input
                                                                  output/input/a
                                                                  output/input/b
                                                                  
                                                                  1. 1

                                                                    I don’t know man. All I can say is that rsync works differently from cp and scp and it constantly messes me up. If you’re unhappy with my explanation of how it’s different, I’m sorry.

                                                            1. 1

                                                              Honestly, I’m more interested in why somebody needs a function like this.

                                                              I suppose it makes sense as a library function, but then why bind to a keyboard shortcut?

                                                              1. 1

                                                                Because people tend to edit their shell configuration. I do this quite often and I appreciate having some small utility to help with that (as opposed to having 4 register bindings).

                                                                1. 1

                                                                  That’s fair, I guess. I didn’t realize people edited their shell configuration often enough to warrant an editor shortcut for it.

                                                                  1. 1

                                                                    To be honest its a bit weird to me, just keep a buffer open and switch to it like any other is the strategy I use for all text files. I normally view me effing with dotfiles to be a temporary thing, not so often that I’d want to keybind it. The latter seems more like avoiding work and automating/optimizing that problem than anything else. But my goal tends to be one and done try not to mess with your tools more than use the tools so axiomatically I disagree with the idea in general I guess.

                                                              1. 23

                                                                The story’s catching a lot of “off-topic” flags. I mostly left it up so there’s a single story people can click “hide” on because it’s clear we’re going to see this a dozen times in the next few days as news trickles out. Also, when this story was posted yesterday it wasn’t clear this was a social engineering rather than a zero-day, and we do consider those topical.

                                                                Years ago we removed the ‘news’ tag. Still today, lot of ‘security’ stories are news because they’re about new vulnerabilities. This feeds back into my concern about the recurring idea to remove the culture/practices/etc tags. With a week to reflect on my response there, I think it boils down to: any time we decide to restrict topicality we amplify two problems.

                                                                First, there are Big Event stories like this one that seem worth leaving up. Call it the “heckler’s promo”, because it’s the inverse of the heckler’s veto. A story effects the entire industry and will be submitted over and over, so we make an exception. We can bite the bullet and stop making exceptions, but we know submitters and some number of readers will be outraged at the removal of stories that feel so important in the moment or are so highly emotionally charged. This very often results in angry tweets and PMs to mods about how we’re removing stories to enforce our opinions about politics and business. Having evil motives endlessly imputed to us is personally draining, and more generally not great for the site’s reputation, so that’s why I harp on the need to be able to point to a clear, public standard such that even someone who is angry at having their story or comment removed can accept that it fell within the bounds. The other benefit of drawing a bright line is that it reduces moderator discretion, power, and potential mistakes. (Edit to add sentence:) The more clearly we can draw lines, the more confident users can be that they’re contributing well and getting treated fairly.

                                                                Second, and much harder, stories often touch on multiple topics and it’s not clear where to say that it has so much of the tagged topic that it should be removed on that grounds. When it’s most of the story? Half? One sentence? Implied by popular knowledge about the topic? When it’s likely to prompt a rehash of a contentious topic? We give ‘security’ a pretty wide leeway on ‘news’ but entrepreneurship and business almost none. This problem benefits from having a bright-line rule for all the same reasons as the previous, and because people assume our definition of topicality is the same as other, more popular sites like r/programming and Hacker News. (And: we’ve gotten a lot of off-topic business stories in the last week or so, I don’t know what’s up with the spike.)

                                                                Hope this helps explain why things look the way they do and is a useful framework for future changes.

                                                                1. 2

                                                                  What about bringing about a off-topic or unrelated or breaking-news or squirrel tag for all these types of articles that people love to submit but don’t really fit? Too problematic in that it encourages people to submit them?

                                                                  Just wondering how people that want to bring up stories like this and enable those of us that couldn’t be bothered to care can both be appeased. Might remove some of those angry pm’s and tweets if you just go, moved this story to the spam category. Ooh there call it spam as the label. >.<

                                                                  1. 5

                                                                    Something like this gets proposed every couple months. I don’t see any reason it would fix anything; the discussion would only shift terms slightly from “why’d you delete this” to “why did you give it the tag of shame” with the same open questions about when to apply it, plus the comments there would show up on /comments, topics would spill over into other threads, etc. Maybe someone wants to take a page from the chat room playbook and run their own site with different rules that are closer to but still broader than Lobsters itself.

                                                                    1. 1

                                                                      It might encourage more submissions, but at least an ‘offtopic’ tag could be hidden by users and incur a hotness penalty.

                                                                    2. 1

                                                                      Cloudflare

                                                                      But why did @alynpost merge the twitter stuff with the cloudflare outage ?! that’s completely unrelated..

                                                                      1. 3

                                                                        I did accidentally conflate story submissions xbl6uc and uptmet and merging them was incorrect. It’s undone.

                                                                        1. 1

                                                                          Thanks :)

                                                                    1. 2

                                                                      I recently graduated. Got lucky and found a consulting position for software development. I had to move from a city of ~80,000 to the twin cities metro area. Seems like the residents around here aren’t phased by the pandemic. The first day at my apartment there were people outside having a party (no masks-distancing). If only they realized they’re part of the problem…

                                                                      1. 3

                                                                        Seems like the residents around here aren’t phased by the pandemic.

                                                                        So the twin cities is kinda funky, there are the people that hewed to this hard, those people you wont see. Then there is also the more libertarian bent around here. They’re likely the ones you’re seeing out and about without masks (over generalization but its pretty apt given who I see using face masks as chin hammocks if even). My suggestion is note the bars you see things like this and avoid them like the plague they are. I went to my first bar and they had done things well, 6 foot distancing, wiped down thing after people left, etc….

                                                                        And they won’t change until either they get it or a family member does. As someone that knows a few nurses here all I’ll say is I take their word on how things are going a lot more than any talking head.

                                                                        Stay safe!

                                                                      1. 9

                                                                        Great news! I am eager to try this!

                                                                        Turn on -XLinearTypes, and the first thing you will notice, probably, is that the error messages are typically unhelpful: you will get typing errors saying that you promised to use a variable linearly, but didn’t. How hasn’t it been used linearly? Well, it’s for you to puzzle out. And while what went wrong is sometimes egregiously obvious, it can often be tricky to figure the mistake out.

                                                                        So, basically, GHC just got its own “Syntax error” a la OCaml… just a bit more specialized :p.

                                                                        1. 11

                                                                          Maybe it’s just me, but to me OCaml’s errors are terse and unhelpful and GHC’s errors are… verbose and unhelpful. ;)

                                                                          There are interesting papers that show working ways to improve both, but I wonder why none of those improvements are in the mainline compilers.

                                                                          1. 2

                                                                            Good error reporting is easiest if it’s built into the compiler front end from the start. If a new algorithm comes along to improve the error information it’s almost never going to be a simple job to drop it into an existing compiler.

                                                                            You need type information & parse information from code that’s potentially incorrect in both spaces, so any error algorithm usually has to be tightly integrated into both parts of the compiler front end. That tight integration usually means that improving compiler errors is a significant amount of work.

                                                                            1. 3

                                                                              It varies. What puzzles me is that a lot of time ready to use, mergeable patches take much longer to merge than they should.

                                                                              Like this talk: https://ocaml.org/meetings/ocaml/2014/chargueraud-slides.pdf

                                                                              1. 1

                                                                                Do you also have a link for a patch for the improved error messages?

                                                                                A lot of work has been going on to move OCaml to a new parser and improve error messages. Even though there is a lot still needed to be done, latest releases have started improving a lot. Maybe we can still extract some useful bits from that effort and try again

                                                                                1. 2

                                                                                  Turns out it was even made into a pull request that isn’t merged yet: https://github.com/ocaml/ocaml/pull/102

                                                                                  1. 1

                                                                                    Thanks. It is quite an informative PR actually, and explains why the change is not there yet and once can infer why it is easier to add informative messages in new languages and complier but it may be quite hard to retrofit them to seasoned ones

                                                                          2. 7

                                                                            Would you be kind enough to give me an ELI5 about what linear types are and what you can do with them?

                                                                            1. 29

                                                                              In logic, normal implication like A implies B means whenever you have A, you can derive B. You have tautologies like “A implies (A and A)” meaning you can always infinitely duplicate your premises.

                                                                              Linear implication is a different notion where deriving B from A “consumes” A. So “A linearly implies B” is a rule that exchanges A for B. It’s not a tautology that “A linearly implies (A and A).”

                                                                              The classic example is you can’t say that “$3 implies a cup of coffee” but “$3 linearly implies a cup of coffee” makes sense. So it’s a logical form that reasons about resources that can be consumed and exchanged.

                                                                              Same in functional programming. A linear function from type A to type B is one that consumes an A value and produces a B value. If you use it once with an A value then you can’t use it again with the same A value.

                                                                              This is nice for some performance guarantees, but also for encoding safety properties like “a stream can only be read once” etc.

                                                                              1. 6

                                                                                Keynote: Linear Haskell: Practical Linearity in a Higher-Order Polymorphic Language https://skillsmatter.com/skillscasts/11067-keynote-linear-haskell-practical-linearity-in-a-higher-order-polymorphic-language

                                                                                1. 5

                                                                                  It can be used to model protocols with type signatures. The following is in theory what you should be able to do.

                                                                                  data ConsoleInput
                                                                                      = Input String ConsoleOutput
                                                                                      | ExitInput
                                                                                  
                                                                                  data ConsoleOutput
                                                                                      = PrintLines ([String] ⊸ Console)
                                                                                      & PrintLastLines ([String] ⊸ ())
                                                                                  
                                                                                  greet :: ConsoleOutput ⊸ ()
                                                                                  greet console
                                                                                      = let PrintLines f = console
                                                                                        in step2 (f ["name?"])
                                                                                  
                                                                                  step2 :: ConsoleInput ⊸ ()
                                                                                  step2 ExitInput = ()
                                                                                  step2 (Input input console)
                                                                                      = let PrintLastLines f = console
                                                                                        in f ["hello " ++ input]
                                                                                  

                                                                                  If you combine it with continuation passing style, you get classical linear logic and it’s a bit more convenient to use.

                                                                                  If you model user interfaces with types, they should be quite useful.

                                                                                  I’m also examining and studying them: http://boxbase.org/entries/2020/jun/15/linear-continuations/

                                                                                  1. 1

                                                                                    Wikipedia gives a reasonable overview. The closest analogy would be something like move semantics – for example ownership in Rust can be considered as manifestation of linear types.

                                                                                    1. 6

                                                                                      Rust ownership is linear affine types. Linear types are similar but differ in the details. A shitty way of understanding it is affine types mimic ref counting and prevent you from having a ref count < 0. Linear types are more a way of acting like RAII in that you might create a resource but just “know” that someone later on in the chain does the cleanup.

                                                                                      Which I’m sure sounds similar but affine types allow for things like resource leaks but linear types should guarantee overall behavior to prevent it.

                                                                                      This all assumes my understanding and explanation is apt. I’m avoiding a ton of math and i’m sure the shitty analogy doesn’t hold up but behaviorally this is how I have it in my brain.

                                                                                      1. 2

                                                                                        Linearity Design Space: https://i.imgur.com/s0Mxhcr.png

                                                                                        1. 2

                                                                                          I’m personally of the stance that the 2020 linear ghc stuff is more <= 1 usage, and kinda misses out on a lot of really fun expressivity that can fall out of making full classical linear logic first class. But that’s a long discussion in its own right , and I’ve yet to make the time to figure out the right educational exposition on that front

                                                                                          1. 1

                                                                                            it definitely seems more limited in scope/ambition compared to the effort ongoing for dependent types, for better or worse. Can’t say I know much about what first class linear logic would look like, but perhaps now there will be more discussion about such things.

                                                                                            1. 2

                                                                                              The really amazing thing about full linear logic is it’s really sortah a rich way to just do mathematical modelling where everything has a really nice duality. The whole thing about linearity isn’t the crown jewel (though wonderfully useful for many applications ), it’s that you get a fully symmetric bag of dualities for every type / thing you can model.

                                                                                              The paper that really made it click for me was mike shulmans linear logic for constructive mathematics paper. It’s just a fun meaty read even at a conceptual level. There’s a lot of other work by him and other folks that taken together just point to it being a nice setting for formal modelling and perhaps foundations of category theory style tools too!

                                                                                          2. 1

                                                                                            Not sure I can agree that Uniqueness types are the same as Linear types. Care to explain they’re similar sure but not the same thing and your… screenshot of a powerpoint? isn’t very illustrative of whatever point you’re trying to make here.

                                                                                            And from my experience with Idris, I’m not sure I’d call what Rust has Uniqueness types.

                                                                                            1. 1

                                                                                              They are different rows in the matrix because they are different, of course.

                                                                                              it’s from this presentation about progress on linear ghc a little over a year ago https://lobste.rs/s/lc20e3/linear_types_are_merged_ghc#c_2xp2dx skip to 56:00

                                                                                              What is meant by Uniqueness types here is “i can guarantee that this function gets the unique ptr to a piece of memory” https://i.imgur.com/oJpN4eN.png

                                                                                    2. 2

                                                                                      Am I the only one thinking this is not how you ship language features?

                                                                                      If the compiler can’t even report errors correctly, the feature shouldn’t ship.

                                                                                      1. 15

                                                                                        If the compiler can’t even report errors correctly, the feature shouldn’t ship.

                                                                                        Its more this is an opt-in feature with crappy error reporting for now using computer programming design features not in use in most programming languages. Its going to have rough edges. If we required everything to be perfect we’d never have anything improved. Linear types like this also might not have a great way to demonstrate errors, or the domain is new so why not ship the feature for use and figure out what kind of error reporting you want based on feedback.

                                                                                        1. 13

                                                                                          Many people do not realize that haskell is a research language and GHC is one of the main compilers for it. This is an experimental feature in a research language. If it works out well, then it will be standardized.

                                                                                        2. 5

                                                                                          Other people have sort-of said it, but not clearly enough I think. This is not a language feature being added. It is a feature-flagged experimental feature of a particular compiler. Most such compiler extensions never make it into real Haskell, and the ones that do take years after they are added to a compiler to make it to a language spec.

                                                                                          1. 4

                                                                                            for all practical purposes isn’t “real Haskell” defined by what ghc implements these days?

                                                                                            1. 2

                                                                                              Yes, all the other implementations are dead. They still work, but they won’t run most modern Haskell code, which usually uses a bunch of GHC extensions.

                                                                                              1. 1

                                                                                                You might say “isn’t it not popular to write standards-compliant Haskell these days?” and you’d be right. Of course it’s often trendy to write nonstandard C (using, say, GNU extensions) or nonstandard HTML/JavaScript. However, ignoring the standard being trendy doesn’t mean the standard doesn’t exist, or even that it isn’t useful. I always make sure my Haskell is Haskell2010, and I try to avoid dependencies that use egregious extensions.

                                                                                              2. 2

                                                                                                Honestly curious: are there any other Haskell compilers out there? Are they used in production?

                                                                                                Also, what is a definition of a true Haskell? I always thought it’s what’s in GHC.

                                                                                                1. 5

                                                                                                  There’s a Haskell which runs on the JVM - Frege. But it makes no attempt to be compatible with the version of Haskell that GHC impements, for good reasons. Hugs is a Haskell interpreter (very out of date now, but still works fine for learning about Haskell.) There a bunch of other Haskell compilers, mostly research works that are now no longer in development - jhc, nhc98 etc etc.

                                                                                                  But GHC is the dominant Haskell compiler by far. I don’t think there are any others in active development, apart from Frege, which isn’t interested in being compatible with GHC.

                                                                                                  (“True Haskell” is the Haskell defined in the Haskell Report, but real world Haskell is the Haskell defined by what GHC + your choice of extensions accepts.)

                                                                                                  1. 2

                                                                                                    There are other compilers and interpreters. None of them is anywhere near as popular as GHC, and usually when one does something interesting GHC consumes the interesting parts.

                                                                                                    There is definitely a standard, though: https://www.haskell.org/onlinereport/haskell2010/

                                                                                                    The whole reason language extensions are called “extensions” and require a magic pragma to turn on is that they are not features of the core language (Haskell) but experimental features of the compiler in question.

                                                                                                  2. 1

                                                                                                    In short, GHC Haskell is a language designed by survival-of-the-fittest.

                                                                                                    1. -2

                                                                                                      If you haven’t noticed, the language spec is dead.

                                                                                                    2. 3

                                                                                                      Overly terse error messages are bad, but they are better than wrong error messages. Some things are much harder to give helpful error messages for than others.

                                                                                                      I wish people spend more time improving error reporting, at least in cases when the way to do it is well understood. There is no reason for say TOML or JSON parsers to just say “Syntax error”. But, YAML parsers are pretty much doomed to give unhelpful errors just because the language syntax is ambiguous by design.

                                                                                                      And then some errors are only helpful because we know what their mean. Consider a simple example:

                                                                                                      Prelude> 42 + "hello world"
                                                                                                      
                                                                                                      <interactive>:1:1: error:
                                                                                                          • No instance for (Num [Char]) arising from a use of ‘+’
                                                                                                          • In the expression: 42 + "hello world"
                                                                                                            In an equation for ‘it’: it = 42 + "hello world"
                                                                                                      

                                                                                                      How helpful is it to a person not yet familiar with type classes? Well, it just isn’t. It’s not helping the reader to learn anything about type classes either.

                                                                                                      1. 1

                                                                                                        I’ve seen some good suggestions on r/haskell for improving the wording of these errors.

                                                                                                      2. 2

                                                                                                        The error they’re talking about is a kind of type error they’ve not worked with. It’s produced if you forget to construct or use a structure. I I’m guessing it’s technically “proper” but the produced error message may be difficult to interpret.

                                                                                                        They’ve ensured it’s a feature you can entirely ignore if you want to. Everybody’s not convinced they need this.

                                                                                                        I otherwise dunno what they’re doing and I’m scratching my head at the message. Something like “Oh cool you’ve done this… … … So where are the types?”

                                                                                                        1. 2

                                                                                                          So you never got a C++ template error in the good olden days? Seriously though, it just got merged. It’s not released or “shipped” in any means.

                                                                                                          1. 0

                                                                                                            So you never got a C++ template error in the good olden days?

                                                                                                            No, because I looked at the language, figured out that the people involved completely lost their fucking mind, and moved on.

                                                                                                            Seriously though, it just got merged. It’s not released or “shipped” in any means.

                                                                                                            They took 4 years to arrive at the current state, which I’ll approximate at roughly 10% done (impl unfinished, spec has unresolved questions, documentation doesn’t really seem to exist, IDE support not even on the radar).

                                                                                                            So if you assume that there will be a Haskell version in the next 36 years, then this thing is going to end up in some Haskell release sooner or later.

                                                                                                            1. 2

                                                                                                              So if you assume that there will be a Haskell version in the next 36 years, then this thing is going to end up in some Haskell release sooner or later.

                                                                                                              Could you elaborate on this? If practical users of linear types will only use them if they have good error messages, and early testers want to work out the kinks now, what’s wrong with having a half-baked linear types feature with no error messages permanently enshrined in GHC 8.12?

                                                                                                      1. 18

                                                                                                        Worth reading to the end just for the totally evil code snippet.

                                                                                                        It was kind of foreshadowed to be evil when the author named it “skynet.c” I guess.

                                                                                                        1. 4

                                                                                                          Reminds me of the Java-code we used to see around 2000.

                                                                                                          With a RuntimeException try-catch at the top and then just print it and continue like nothing happened.

                                                                                                          How much bad bugs, data corruption and weirdness did that practice cause?

                                                                                                          1. 1

                                                                                                            How is that any different from kubernetes and “just restart it”? Its mostly the same practice ultimately, though with a bit more cleanup between failures.

                                                                                                            1. 2

                                                                                                              I guess it depends on whether you keep any app state in memory. If you’re just funnelling data to a database maybe not much difference.

                                                                                                          2. 2

                                                                                                            Now I start to wonder, how the correct code should look like (as opposed of jumping 10 bytes ahead).

                                                                                                            Read DWARF to figure out next instruction?

                                                                                                            Embed a decompiler to decode the faulty opcode length?

                                                                                                            1. 4

                                                                                                              Increment the instruction pointer until you end up at a valid instruction (i.e., you don’t get SIGILL), of course ;)

                                                                                                              1. 6

                                                                                                                I have code that does this by catching SIGILL too and bumping the instruction pointer along in response to that. https://github.com/RichardBarrell/snippets/blob/master/no_crash_kthxbai.c

                                                                                                                1. 2

                                                                                                                  Brilliant. I’m simultaneously horrified and amused.

                                                                                                                2. 1

                                                                                                                  SIGILL

                                                                                                                  That’d be a pretty great nerdcore MC name.

                                                                                                                3. 1

                                                                                                                  If you want to skip the offending instruction, à la Visual Basics “on error resume next”, you determine instruction length by looking at the code and then increment by that.

                                                                                                                  Figuring out the length requires understanding all the valid instruction formats for your CPU architecture. For some it’s almost trivial, say AVR has 16 bit instructions with very few exceptions for stuff like absolute call. For others, like x86, you need to have a fair bit of logic.

                                                                                                                  I am aware that the “just increment by 1” below are intended as a joke. However I still think it’s instructive to say that incrementing blindly might lead you to start decoding at some point in the middle of an instruction. This might still be a valid instruction, especially for dense instruction set encodings. In fact, jumping into the middle of operands was sometimes used on early microcomputers to achieve compact code.

                                                                                                                4. 2

                                                                                                                  Here’s a more correct approach: https://git.saucisseroyale.cc/emersion/c-safe

                                                                                                                  1. 1

                                                                                                                    Just don’t compile it with -pg :)

                                                                                                                  1. 1

                                                                                                                    Don’t see an xz -e example to use extreme compression. Then comparing with xz -eT0 to use all cores, thats how I use xz, xz with threads compresses faster with -e than gzip without (unless you use say pigz) and is infinitely smaller output.

                                                                                                                    1. 1

                                                                                                                      xz’ -e usually doesn’t gain you much however but makes compression much much slower. That being said, lzma has this interesting property that decompression speed is expressed as compressed-bytes per second, which means that improving compression improves decompression speed.

                                                                                                                      By the way, even with that, I find that xz -e is not all that useful in practice: large dictionnaries tend to have a larger effect and xz makes it easy to use. Its command-line supports the following: xz -9vv –lzma2=preset=6,dict=1024M (only the dictionary size changes between levels 6, 7, 8 and 9) but you need to have 10*$dict RAM (lzma absolutely hates swap) and actually 10*$dict*$n_threads if you use threads (decompression requirements are only $dict, no matter other settings). Also worth keeping in mind: it’s not useful to have a dictionary larger than the amount of data to compress (and with threads, the limit would be the amount of data to compress divided by the number of threads).

                                                                                                                      1. 1

                                                                                                                        xz’ -e usually doesn’t gain you much however but makes compression much much slower.

                                                                                                                        Not in my experience. Yeah its slower but…. who cares? Example on a roughly 20GiB file of mixed compressibility, the majority of the end being super compressible (lots of zeros), actually this is an actual data file that will get transferred a lot after build so saving any size at the expense of a bit of cpu time up front only makes sense to me.

                                                                                                                        $ for x in 3 6 9 e
                                                                                                                        xz -${x} -vkT0 -c input.data > input.data.${x}.xz
                                                                                                                        input.data (1/1)
                                                                                                                          100 %      1,800.2 MiB / 19.5 GiB = 0.090   132 MiB/s       2:31
                                                                                                                        input.data (1/1)
                                                                                                                          100 %      1,650.2 MiB / 19.5 GiB = 0.083    74 MiB/s       4:29
                                                                                                                        input.data (1/1)
                                                                                                                          100 %      1,532.0 MiB / 19.5 GiB = 0.077    44 MiB/s       7:31
                                                                                                                        input.data (1/1)
                                                                                                                          100 %      1,648.6 MiB / 19.5 GiB = 0.082    54 MiB/s       6:10
                                                                                                                        

                                                                                                                        The fun part here is -e is closer to -6 on this random bit of data I snagged versus -9, but normally -e wins out, though for this specific instance now I kinda want to change our ci to do 6/9/e and pick the smallest of the three. -e is also faster than -9 on this input data, so I’m not sure I buy your much much slower argument without some sort of examples.

                                                                                                                        And to be fairish and compare using pigz -9 cause I can’t be bothered with single threaded compression of a 20GiB file:

                                                                                                                        $ time pigz -9v -k input.data
                                                                                                                        input.data to input.data.gz
                                                                                                                        
                                                                                                                        real	1m43.304s
                                                                                                                        user	23m44.951s
                                                                                                                        sys	0m15.329s
                                                                                                                        $ du -hm input.data.gz
                                                                                                                        2289	input.data.gz
                                                                                                                        

                                                                                                                        A few minutes more cpu time (less on actual non laptop hardware) for 600-900MiB reduction seems well worth it to me. Your needs may vary but every time I’ve looked at the “cost” in time for compressing with xz at higher modes is that it pays off in either network transfer or space savings later.

                                                                                                                        1. 1

                                                                                                                          Yup, definitely agreed that xz oftens provides wins in I/O or space overall. When I do the math and compare to gzip or even zstd (let alone bzip2), xz is often the best choice.

                                                                                                                          Have you tried playing with sparse files for your dataset? I’ve been using tar –sparse for quite some time and I’ve recently combined it with “fallocate –dig-holes” to automatically turn zeroes into sparsity. Xz is not fast for sparse data unfortunately but since tar preserves sparsity, xz doesn’t get to see the zeroes at all. It almost always provides me nice speed boosts.

                                                                                                                    1. 4

                                                                                                                      I’ve been using comment-region like a caveman! Today I shall try comment-dwim, thank you!

                                                                                                                      1. 7

                                                                                                                        I have the feeling with Emacs, everyone appears as a partial caveman to others. It was ages until I understood the kill ring, started using hippie-expand, realized I could use recompile instead of calling compile again, learned how to make flymake tell me what’s wrong (C-h .), etc., etc. And more often than not, I think to myself “why was I even using Emacs, if I didn’t know about this feature”.

                                                                                                                        1. 3

                                                                                                                          I share the feeling. I think I needed at least 5 years to truly grok (the basics of) Emacs and start benefiting from its unique features and advantages. At this point I’ve been an Emacs user for over 15 years and I still learn new things quite often. :-)

                                                                                                                          1. 1

                                                                                                                            Yep! Though I found out about comment-dwim a while ago, but the depths of the emacs abyss is deep. We all stare into it.

                                                                                                                          2. 3

                                                                                                                            You’re welcome! :-)

                                                                                                                            1. 2

                                                                                                                              Same!

                                                                                                                            1. 7

                                                                                                                              There is something that has bothered me over time, especially in the world of DevOps tooling that is purported to be declarative and deterministic is that it is very hard to make things perfectly deterministic. There are a lot of things that almost get you there but there is still something unsatisfying about it. It seems you either need to live with bleeding edge updates and hope you can track it down when it breaks, or you live on older pinned versions and deal with the bugs and security.

                                                                                                                              Docker - Docker’s default tag is latest, which will run differently depending on whether you have a system with it already cached, how far apart in time the containers were deployed, etc. Easily solved with tags right? Secondly, many Dockerfiles do everything right except that when they source a base image with FROM, it can’t guarantee that’s the same base image. Even with “versioned” tags, you can’t guarantee that the older versions haven’t been updated over time.

                                                                                                                              Ansible - When installing or updating packages, pinning versions isn’t always straightforward and I’ve seen many systems which just use the bleeding edge version. You have things defined in code, but you end up with config drift across systems without realizing it.

                                                                                                                              NixOS - For a system that is supposed to immutable, declarative and deterministic, there is one major flaw that keeps it from achieving a dream of perfect determinism. It has no consistent version-pinning when it comes to the actual package names. Only in cases when the package maintainers have specifically decided to create a new attribute for a specific version of a package. On a local system it’s fine because it’s never going to change in the store until you garbage-collect it, but if you are working on ephemeral, constantly rebuilt systems, you can end up in the same kind of version-update config drift scenarios like before. Your configuration.nix file will not save you because it’s probably not made up entirely of hand-built derivations with hashes for everything, it’s probably built from the nixos package respository. Somebody created a work-around site for this, because the object store still has hashes from older things, but it’s a bit of a hack.

                                                                                                                              My dream would be seeing something between the Nix way of doing things, and allow version-pinning in the nixos config files. But also allow the ability to use the latest and greatest, but with a twist. The latest version still be pinned and incremented by some other system that checks for new versions of packages and updates them in git, then makes a PR that increments the package version and triggers CI to ensure that the update is sane, then merges. Declarative, deterministic, and auto-updating all in one. Some things would break down in that process but you’d write tests for things, pin packages if necessary, and live knowing that everything is valid and tracked in version control but you don’t have to constantly bump versions manually. I’m sure somebody has already done this idea but I’d love to see it realized in an approachable way.

                                                                                                                              1. 2

                                                                                                                                But also allow the ability to use the latest and greatest, but with a twist.

                                                                                                                                Can’t you do this now just using another nixpkgs checkout? You can mix and match and name the nixpkgs definitions. On my mac my nixpkgs name is the stock nixpkgs, and anything else is just a git worktree of nixpkgs where i just setup things to be whatever version I need and add another named package setup and use that specific thing from it.

                                                                                                                                Kinda seems like nix has this covered to a degree with the nixpkgs setup tbh: https://nixos.wiki/wiki/Nixpkgs/Create_and_debug_packages

                                                                                                                                Its basically the same thing as doing local development, and the package at version N is built alongside/with the same other things at that same overall derivation so less chance of other things breaking.

                                                                                                                              1. 4

                                                                                                                                At least we have a single connector now…

                                                                                                                                1. 18

                                                                                                                                  Arguably having one connector that is not actually interoperable is worse than having multiple connectors whose lack of interoperability is apparent at a glance.

                                                                                                                                  1. 5

                                                                                                                                    Yep, not knowing if the cable you want will work is like having USB-C Heisenberg edition. Its arguably worse because of the lack of knowing.

                                                                                                                                    1. 4

                                                                                                                                      It works for me with everything. A variety of phones, laptops, Nindendos Switch, chargers, batteries and cables. Maybe sometimes I’m not getting optimal charging speed, but it’s always better than the situation was before.

                                                                                                                                      I don’t have a MacBook though. I hear they have more issues than anything else.

                                                                                                                                      1. 3

                                                                                                                                        Good for you. But the article shows your experience isn’t shared by everyone. Not knowing if a USB-C cable and charger will charge your device unless you try it is mildly infuriating.

                                                                                                                                  1. 10

                                                                                                                                    And? Why do we need to discuss iCloud in reference to zoom?

                                                                                                                                    1. 24

                                                                                                                                      I think the author’s idea is, “why do we hold other companies blatantly accountable (like Zoom), and not Apple?”

                                                                                                                                      1. 26

                                                                                                                                        I guess I don’t see the need to equivocate both. They’re different threat models and different situations.

                                                                                                                                        If the goal is to attack icloud, just note its flaws. Just like people did when they originally were known. Zoom is in the line of fire due to their current issues. If we’re going to start “yes and”ing every security failure I’m ditching both of these tags in lobsters. It is as bad as the constant arguments about countries doing bad things and hearing people bring up every other countries other problems as reasons why we shouldn’t care. We can legitimately care about both without constantly comparing between companies or countries.

                                                                                                                                        The constant comparison really rubs me the wrong way like propoganda at derailing conversation away from the actual problems on their own merits.

                                                                                                                                        1. 12

                                                                                                                                          The one-word-ism for this is “whataboutism” and I too would like to see lots less of it all over the internet, but especially here!

                                                                                                                                          1. 3

                                                                                                                                            this type of argument is a critique of media and our collective ethical standards, rather than a critique of the situation as such. there’s nothing wrong with this type of critique, and i just as often see people dismissing such valid forms of critique as “whataboutism,” thus derailing the conversation away from examining media and ethical standards.

                                                                                                                                            this goes for /u/haldean’s comment as well

                                                                                                                                          2. 12

                                                                                                                                            we’re holding zoom accountable? huh?

                                                                                                                                            1. 1

                                                                                                                                              “accountable”

                                                                                                                                          3. 4

                                                                                                                                            Zoom and Apple are both companies that claim to be end-to-end encrypted, yet this person is claiming that they are not.

                                                                                                                                            1. 19

                                                                                                                                              Apple does not claim to be end-to-end encrypted for backups or notes or photos or videos. Apple’s own weasely KB article on the topic is linked from TFA.

                                                                                                                                              They also fail to mention that backups include your complete conversation history with everyone you’ve ever texted or iMessaged with on your device.

                                                                                                                                              This is me, shining a flashlight on that.

                                                                                                                                          1. 27

                                                                                                                                            It’s nice to read a review that feels honest and isn’t spewing bile and hatred about every little thing. This one is recommended.

                                                                                                                                            I concur with assertion that the trackpad is too large, although I use a 2017 MBPro so I avoid typing on it as much as possible.

                                                                                                                                            1. 2

                                                                                                                                              I concur with assertion that the trackpad is too large, although I use a 2017 MBPro so I avoid typing on it as much as possible.

                                                                                                                                              I have a 2018 Macbook Pro. Yes its getting into the crazy size territory.

                                                                                                                                              1. 2

                                                                                                                                                It’s nice to read a review that feels honest and isn’t spewing bile and hatred about every little thing.

                                                                                                                                                Indeed, this was a very nice, balanced, review.

                                                                                                                                                I concur with assertion that the trackpad is too large, although I use a 2017 MBPro so I avoid typing on it as much as possible.

                                                                                                                                                I feel like they should offer something that combines the Air and the Pro.

                                                                                                                                                The Air 2020 has a smaller trackpad, no Touch Bar (which is a feature), and a 10th generation Ice Lake CPU. The primary thing that people may dislike is its weaker CPU, which is designed for low TDPs. Another downside is just 2 USB-C ports.

                                                                                                                                                The two baseline MacBook Pro 13” 2020 models are a travesty. They are basically the low-end 2018/2019 model with the new Magic Keyboard (good) and Touch Bar (bad). The CPU is still slower than my previous Touch Bar MacBook Pro 2018 and they only have 2 ports. These models basically combine the downsides of the Air (weaker CPU, 2 USB-C ports) and the Pro (Touch Bar). To add to the offense, you get an 8th generation Intel chip with much lower memory bandwidth and slower GPU than the 2020 Air.

                                                                                                                                                The high-end MacBook Pro 13” 2020 are pretty good with 10th gen CPUs and 4 USB-C ports. Unfortunately, it has a Touch bar (+ larger trackpad if you do not like it).

                                                                                                                                                What seems to be missing for most folks is basically the MacBook Air (perhaps in a slightly thicker enclosure) that has a higher TDP CPU like the Pros.

                                                                                                                                                That said, I never had problems with accidental touch inputs with the Pro 2018 or Air 2020.

                                                                                                                                                1. 3

                                                                                                                                                  The two baseline MacBook Pro 13” 2020 models are a travesty. They are basically the low-end 2018/2019 model with the new Magic Keyboard (good) and Touch Bar (bad). The CPU is still slower than my previous Touch Bar MacBook Pro 2018 and they only have 2 ports

                                                                                                                                                  My theory is that they have positioned this model (and purposefully not updated/hobbled it a bit) for a move to Arm in the future. It will allow for a nice markety-type reveal such as “we made an Arm laptop that is faster than the previous intel model! woo!”.

                                                                                                                                                  1. 3

                                                                                                                                                    That’s actually quite smart. “Up to 20x faster!”

                                                                                                                                                2. 1

                                                                                                                                                  I also have a 2017 MBP and I’ve gotten used to changing my palm resting position to be on either side of the track pad. Most of the time, however, I use a regular keyboard and mouse plugged into a usbc hub. The most obnoxious feature I’d remark on is Siri on the upper right corner - 9/10 times I wanted to hit delete or = and instead got that silly app.

                                                                                                                                                  1. 2

                                                                                                                                                    You can customize the touch bar in system preferences. I have mine to only display the volume, brightness and media keys.

                                                                                                                                                1. 4

                                                                                                                                                  As someone who has resisted upgrading to 6.7 from 6.6, until such time as I could understand whether or not ffs2 was worth it, this was an amazing thing to find in my inbox yesterday. Now, I have all the context to know that there’s very little to gain from doing a clean install on ffs2, but because of FOMO I’ll do it anyway.

                                                                                                                                                  1. 1

                                                                                                                                                    ffs2 is faster than ffs […] almost always when fscking them

                                                                                                                                                    Doesn’t say how much faster, but that’s probably appreciably faster boots.

                                                                                                                                                    1. 1

                                                                                                                                                      I don’t boot very often. :)

                                                                                                                                                      1. 1

                                                                                                                                                        Last time I rebooted my openbsd box was updating to 6.7, I’m in the same boat! FOMO for openbsd? Meh, whatever whenever/if I get another box I’ll install ffs2 then..

                                                                                                                                                        1. 1

                                                                                                                                                          FOMO for openbsd?

                                                                                                                                                          Specifically, ffs2. I use one computer (and a VPS) for personal stuff, and that runs OpenBSD. I don’t really need another right now…I have no free time to use what I’ve got!

                                                                                                                                                  1. 21

                                                                                                                                                    I often find, even when I’m interested in a subject I end up procrastinating all day instead of doing it.

                                                                                                                                                    I have some form of background anxiety that prevents me from starting; maybe the scope is too big, or I worry about interruptions.

                                                                                                                                                    Eitherway; the key piece of advice I shamelessly stole from Tom Limmoncelli’s book “Time Management for Systems Administrators” was to write down the first thing you will do the next day. Before anything else except the essential morning rituals (brush teeth, make coffee, do not check emails) and when I follow this advice I am generally more productive the whole day.

                                                                                                                                                    If you find a subject thoroughly boring though, I don’t think any advice is really going to help.

                                                                                                                                                    1. 7

                                                                                                                                                      I also often find myself procrastinating. I started the Bullet Journal Method, and it kind of helps. In the morning I plan what need to be done, and at the end of the day I can review the progress/achievements I had.

                                                                                                                                                      Pair programming always helps to get the nastiest work get done. Just need some mental support to get started on the really crap parts, or talk it over, to create a mental path through the unwanted parts. Also when doing research having someone who I can talk the progress of 2-8 hours of research over helps a lot.

                                                                                                                                                      For me the positive feedback is needed to get up to speed and get into flow, or to provide reward after the hard work. In remote work this is not that trivial, while in the office when I was leading a team I always made sure my teammates got positive feedback from me, and they also instinctively provided it for me, and others, or help, if that was needed. I really miss the natural meta-communication present if personal meetings.

                                                                                                                                                      1. 5

                                                                                                                                                        Anxiety is the #1 problem for me. It’s so difficult to concentrate and get ‘in the zone’ when the project, company, or personal life seem in chaos. The global pandemic has been a real issue for me personally, even though I shut out all news, take breaks, exercise, etc. I have no idea if I am normal or some kind of bad dev :shrug emoji:.

                                                                                                                                                        1. 5

                                                                                                                                                          Anxiety definitely affects my ability to focus too. Sometimes I find that just taking the first small step helps, because often my anxiety is overblown, and even when my fears were accurate, action makes them less scary. Ymmv.

                                                                                                                                                        2. 5

                                                                                                                                                          Structured Procrastination can be an effective strategy for people like us.

                                                                                                                                                          anyone can do any amount of work, provided it isn’t the work he is supposed to be doing at that moment

                                                                                                                                                          The trick is to find some bigger, nastier task that you ought to be doing, and work on your smaller goals as a means of procrastinating on the big one.

                                                                                                                                                          1. 6

                                                                                                                                                            It’s a pretty delightful read, but I think on balance I’d rather focus on improving rather than outwitting my foibles.

                                                                                                                                                          2. 2

                                                                                                                                                            If you find a subject thoroughly boring though, I don’t think any advice is really going to help.

                                                                                                                                                            But what do you do when you have to get the task done? Quit your job? Pay someone else to do it? Beg a teammate?

                                                                                                                                                            1. 9

                                                                                                                                                              Personal approaches: go for a quick walk, nothing long 10-15 minutes to clear your mind. On the way back pick the least bit of work you can think of to start. When you get in just start doing it.

                                                                                                                                                              Or I do some push ups/jumping jacks/burpees/whatever just to get my body/brain into its time to do something mode and then start work.

                                                                                                                                                              I find personally that just getting started tends to be my problem so this tactic tends to yield good benefits. To each their own.

                                                                                                                                                              Or you might like my Grandpa’s view on things, he grew up through the Great Depression. Nobody likes cleaning the toilet, but if nobody does it it will never get done so you have to buck up and just get it done.

                                                                                                                                                              1. 2

                                                                                                                                                                I find personally that just getting started tends to be my problem

                                                                                                                                                                Same here. The Pomodoro technique helps me start.

                                                                                                                                                          1. 2

                                                                                                                                                            I’ll give all the zsh users my favorite global aliases i’ve used for years:

                                                                                                                                                            alias -g silent="> /dev/null 2>&1"
                                                                                                                                                            alias -g noerr="2> /dev/null"
                                                                                                                                                            alias -g stdboth="2>&1"
                                                                                                                                                            
                                                                                                                                                            # mainly for firefox, because it can suck up the cycles, but not when
                                                                                                                                                            # in a SIGSTOP state you can't use any power then firefox.
                                                                                                                                                            alias -g sigcont='kill -CONT '
                                                                                                                                                            alias -g sigstop='kill -STOP '
                                                                                                                                                            

                                                                                                                                                            And my fave keybind to save what I typed and get it back after i run the thing i just forgot:

                                                                                                                                                            bindkey '^P' push-line # Saves the current line and returns to it afterwards.
                                                                                                                                                            

                                                                                                                                                            I use them ALL THE TIME, aka: running a chatty command that you don’t want output for:

                                                                                                                                                            terraform apply -auto-approve silent
                                                                                                                                                            

                                                                                                                                                            Or just filter out stderr for reasons:

                                                                                                                                                            chatty_stderr_command noerr
                                                                                                                                                            

                                                                                                                                                            Or snagging stdout/err to a file:

                                                                                                                                                            docker build -t zomg . stdboth | tee whatever.log
                                                                                                                                                            

                                                                                                                                                            Most of my zsh shenanigans are for just getting in/out of the shell as fast as I can and back into the warm embrace of emacs, so my shell stuff is pretty boring.

                                                                                                                                                            1. 1

                                                                                                                                                              push-line is pretty neat and didn’t know about it. I ended up doing it like this:

                                                                                                                                                              remember() {
                                                                                                                                                              	# Nothing in buffer: get previous command.
                                                                                                                                                              	if [[ $#BUFFER -eq 0 ]]; then
                                                                                                                                                              		print -ln "${stored:-}"
                                                                                                                                                              		stored=
                                                                                                                                                              	# Store current input.
                                                                                                                                                              	else
                                                                                                                                                              		stored=$BUFFER
                                                                                                                                                              		BUFFER=
                                                                                                                                                              	fi
                                                                                                                                                              }
                                                                                                                                                              zle -N remember
                                                                                                                                                              bindkey '^Q' remember
                                                                                                                                                              

                                                                                                                                                              It’s essentially the same, except that you need to explicitly put the pushed value back with a second ^Q press, which seems a bit nicer to me.

                                                                                                                                                              A related thing I found/added btw:

                                                                                                                                                              # Run command but don't clear commandline and preserve cursor position.
                                                                                                                                                              bindkey '^\'    accept-and-hold
                                                                                                                                                              

                                                                                                                                                              Which seems pretty useful when mucking about with longer curl command etc.

                                                                                                                                                              1. 1

                                                                                                                                                                Note that push-line is already mapped to M-q by default.