1. 9

    At first I thought the title was a bit pretentious, but ok, the author wrote i3, which I love. It led me to his post about Go, which is interesting; won’t change my opinion about the language itself and (what I think are) its terrible design decisions, but it’s interesting to see that skilled people like to wield it.

    1. 2

      It’s a reference to usesthis.com (see the first line), so not pretentious so much as writing in a given form.

      1. 2


        1. 2

          Hello, fellow Melburnian! o/

          1. 2

            Oh hey! How good is this city?

            1. 1

              Nowhere I’d rather be, especially now. :)

    1. 4

      I’m generally worried about how underspecified Markdown seems to be. Different parsers sometimes do very different things and I wish there was a generally accepted, completely rigorous standard that is deterministic down to the last character. A language that is this ambiguous doesn’t fill me with a lot of confidence. The most vexing parse is ambiguous on a syntactic level, but not on a semantic one - an important difference between C++ and Markdown. I don’t understand why it’s always the markup languages that cause this mess, nobody would put up with having no proper C++ standard because “different people have different needs”. How does that square with interoperability? If you need to serve specific needs, you can create a rigorous language that has well defined entry points for plugins and extensions. There’s no need to ever go down the ambiguity route.

      1. 11

        Worth noting https://commonmark.org/. This specification is implemented by Reddit, GitHub, GitLab, Discourse, etc.

        1. 5

          I’m generally worried about how underspecified Markdown seems to be

          It was designed as a lightweight format for blogging and commenting. There are plenty of alternative markup languages that are better specified.

          1. 2

            In general I think that Markdown is good format for blogposts, as it is quite simple to read and write, and in that case there will be only one parser for that content. On the other hand I completely do not understand the trend of using Markdown (or CommonMark) for documentation. Markdown is just poor choice there as:

            • It is underspecified in original form. CommonMark solves this a little.
            • It has not extensibility which causes people to need to hack around the different features.
            • It is mostly HTML-centric so it lacks some features that are useful for non-HTML documentation, like manpages, PDFs, etc.
          1. 4

            Reminds me of a rant I wrote a while ago about an article titled “How and Why We Switched from Erlang to Python”.

            1. 4

              🤦‍♀️ omg they switch to PYTHON because they needed faster CPU speed? Like, I love Python, paid my bill for years, but it’s a terrible choice for CPU bound speed improvements.

            1. 1

              I love it — this is just the kind of screwing around with internals I enjoy, but don’t really have the time or mental energy to do myself any more.

              1. 2

                Obligatory note: python-markdown isn’t CommonMark-compliant. Whether you care about this is really up to you; here’s a list of CommonMark implementations for Python if you do.

                1. 1

                  Thanks, I did not know that. I did notice the common markup package for Python was last updated 5 years ago.

                1. 15

                  A related concept: identity elements, such as these for integers;

                  • the multiplicative identity, 1 (because x * 1 = x), and
                  • the additive identity, 0 (because x + 0 = x).

                  For booleans, there’s

                  • the “and” identity, True (because x and True = x), and
                  • the “or” identity, False (because x or False = x).

                  We know all([x, y, z]) is equivalent¹ to x and y and z, i.e. it’s the “and” operator applied to a list of elements. When there’s no elements, you get the identity for the “and” operation, namely True. You could imagine the invocation was equivalent to all([True, x, y, z]), so that when there’s no elements in the argument list you get all([True]) = True.

                  ¹ There’s so many little details omitted, but let’s ignore those. This isn’t a Python primer.

                  Here’s another way you can build an intuition for this. I’ll use Ruby here because I’m more familiar, but the concepts apply anywhere.

                  Ruby’s equivalent of fold is called inject. You can pass a block which is applied repeatedly to the elements, starting with the first two elements, and then applying the result to each next element. Here’s an example:

                  > [1, 2].inject {|a,b| a+b}
                  => 3
                  > [1, 2, 3, 4].inject {|a,b| a+b}
                  => 10

                  Here’s some added printf debugging showing what gets added to what:

                  > [1, 2, 3, 4].inject {|a,b| puts "adding #{a} and #{b}"; a+b}
                  adding 1 and 2
                  adding 3 and 3
                  adding 6 and 4
                  => 10

                  You can also supply a starting value as an argument to inject, in which case it’ll use that and the first element for the first operation:

                  > [1, 2, 3, 4].inject(777) {|a,b| puts "adding #{a} and #{b}"; a+b}
                  adding 777 and 1
                  adding 778 and 2
                  adding 780 and 3
                  adding 783 and 4
                  => 787

                  So, what happens if we don’t have any elements in the list?

                  > [].inject {|a,b| puts "adding #{a} and #{b}"; a+b}
                  => nil

                  Nothing happens. You get nil because there’s nothing useful to produce.

                  If you supply a starting value, you get that:

                  > [].inject(0) {|a,b| puts "adding #{a} and #{b}"; a+b}
                  => 0

                  Note the binary operation isn’t called here, because there isn’t two values.

                  So here we see that supplying 0 gives us 0, which makes sense when you consider that the binary operation is adding two numbers. We can also see that keeping 0 as the starting value works for this case:

                  > [1, 2, 3, 4].inject(0) {|a,b| puts "adding #{a} and #{b}"; a+b}
                  adding 0 and 1
                  adding 1 and 2
                  adding 3 and 3
                  adding 6 and 4
                  => 10

                  But, say, for multiplication, it doesn’t:

                  > [1, 2, 3, 4].inject(0) {|a,b| puts "multiplying #{a} and #{b}"; a*b}
                  multiplying 0 and 1
                  multiplying 0 and 2
                  multiplying 0 and 3
                  multiplying 0 and 4
                  => 0

                  We need 1 for that—because it’s the multiplicative identity:

                  > [1, 2, 3, 4].inject(1) {|a,b| puts "multiplying #{a} and #{b}"; a*b}
                  multiplying 1 and 1
                  multiplying 1 and 2
                  multiplying 2 and 3
                  multiplying 6 and 4
                  => 24

                  So we can see why true is the right identity for a function like Python’s all:

                  > [true, true].inject(true) {|a,b| puts "ANDing #{a} and #{b}"; a&&b}
                  ANDing true and true
                  ANDing true and true
                  => true
                  > [true, true, false, true].inject(true) {|a,b| puts "ANDing #{a} and #{b}"; a&&b}
                  ANDing true and true
                  ANDing true and true
                  ANDing true and false
                  ANDing false and true
                  => false

                  And why false is not:

                  > [true, true].inject(false) {|a,b| puts "ANDing #{a} and #{b}"; a&&b}
                  ANDing false and true
                  ANDing false and true
                  => false

                  Here’s a Ruby equivalent of all([]), showing it demonstrating the same identity:

                  > [].all?
                  => true

                  And the any([]) equivalent (because false is the “or” identity):

                  > [].any?
                  => false
                  1. 7

                    The inability to add headers (such as the ones[1] in the article) natively in httpd, and requiring the use of relayd to do so, is the thing keeping me from using OpenBSD’s httpd server for a few cases where otherwise I think it would be a great fit. Totally fine that the devs don’t want to add that functionality, and I don’t fault them for not doing it (it certainly would add more code to maintain), but I personally feel that the ability to add headers is part of “table stakes” for an http server.

                    As such, I am still using nginx for cases where httpd would otherwise work fine.

                    [1]: Somewhat counter intuitively, hsts is natively supported, but as a special stanza instead of with a more generalized “add custom header” mechanism

                    1. 3

                      This used to keep me away from it too, then after some time (really needed this feature, really didn’t want to switch away from httpd) I just bit the bullet and did it. I’ve been really happy with it ever since. My configuration’s become increasingly complex (many virtual hosts, many different backends), but having the separation between httpd and relayd has made it easier to deal with, I think.

                    1. 30

                      There’s one other coincidence that leads people to believe EOF is a character: if a program is running in a terminal and the user presses Ctrl-D, the program detects EOF. From observing that behaviour, it’s not crazy to conclude that the EOF character is actually Ctrl-D — after all, other “special” characters like Tab and Bell turn out to just be control characters, why not this one too?

                      The real reason Ctrl-D produces EOF is more complex. In the same way that Ctrl-C is received by the kernel’s terminal driver and turned into SIGINT, when Ctrl-D is received by the kernel’s terminal driver, it causes any process waiting on a read() syscall to have that syscall return immediately. Because the syscall returns immediately, before the requested number of bytes arrived, most applications assume they’ve hit the EOF condition and exit gracefully, even though if they actually tried, they’d be allowed to keep reading.

                      1. 7

                        Nice, I’d wondered about Ctrl-D’s exact mode of action! Here’s a little example I cooked up locally (on MacOS):

                        #include <stdio.h>
                        #include <sys/types.h>
                        #include <sys/uio.h>
                        #include <unistd.h>
                        int main() {
                                char buf[64];
                                while (1) {
                                        ssize_t n = read(0, buf, sizeof(buf));
                                        printf("got %ld bytes\n", n);
                                return 0;

                        Here’s what happens if you enter the following: a<return><ctrl-d>abc<ctrl-d><ctrl-d>

                        got 2 bytes
                        got 0 bytes
                        abcgot 3 bytes
                        got 0 bytes
                      1. 16

                        I did quit GitHub back in November, for exactly this reason. It was a cool, high-profile place to work, doing what I loved most (working on developer tools and the systems supporting them). Senior management treated those of us who had concerns with contempt, and it only seemed to deepen the more we insisted that this wasn’t just going to blow over. Alas.

                        1. 8

                          One that got a little popularity at one time was my Rouge (wayback website). It got a few mentions in books and I was pretty chuffed about it.

                          1. 2

                            That’s really cool, the syntax for blocks interopt (is that what it is?) looks interesting:

                            (.subscribe queue {:ack true} | [metadata payload]
                              (puts (str "got a message: " payload))
                              (.ack metadata))

                            Any reason why this couldn’t be just a function passed in? (Since blocks can be procs/lambdas/anything that implements call, sometimes)

                            1. 1

                              The block form with arguments is syntax sugar that mirrors sugar in Ruby. It’s worth noting that a block isn’t a regular argument in Ruby — it has special treatment in the VM. So in Ruby:

                              >> [1, 2, 3].each {|e| puts e}
                              => [1, 2, 3]
                              >> [1, 2, 3].each(&lambda {|e| puts e})
                              => [1, 2, 3]
                              >> [1, 2, 3].each(lambda {|e| puts e})
                              Traceback (most recent call last):
                                      5: from /Users/kivikakk/.rbenv/versions/2.6.3/bin/irb:23:in `<main>'
                                      4: from /Users/kivikakk/.rbenv/versions/2.6.3/bin/irb:23:in `load'
                                      3: from /Users/kivikakk/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
                                      2: from (irb):3
                                      1: from (irb):3:in `each'
                              ArgumentError (wrong number of arguments (given 1, expected 0))

                              Note how the last example fails, because each doesn’t take any positional arguments.

                              The first two forms are largely identical, although there is a difference in how the bytecode turns out because blocks get some special treatment in codegen too. (If you’re interested, try puts RubyVM::InstructionSequence.compile('[1,2,3].each {|e| puts e}').disasm, and then again for the &lambda {…} form.)

                              Here’s the equivalent in Rouge using Ruby interop:

                              user=> (.each [1 2 3] | [e] (puts e))
                              [1 2 3]
                              user=> (.each [1 2 3] | (fn [e] (puts e)))
                              [1 2 3]
                              user=> (.each [1 2 3] (fn [e] (puts e)))
                              !! ArgumentError: wrong number of arguments (given 1, expected 0)
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:143:in `each'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:143:in `block in eval_symbol'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:229:in `eval_call'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:187:in `block in eval_cons'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:235:in `backtrace_fix'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:186:in `eval_cons'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/context.rb:111:in `eval'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge/repl.rb:57:in `run!'
                              /Users/kivikakk/kivikakk/rouge/lib/rouge.rb:47:in `repl'
                              bin/rouge:83:in `<main>'

                              Of course the ~rougey~ way would probably involve an as-yet unwritten doseq implementation. This thing didn’t get too far off the ground in terms of Clojure-compatibility.

                              Thanks for responding. It gave me a chance to play around with Rouge, which I haven’t done in a good seven years or so. :)

                              1. 2

                                Ah true - I forgot about the special handling of blocks. There’s more to it, for example: implicit blocks with yield - it’s been a while since I wrote any Ruby that uses that stuff extensively.

                                I wish I had some spare time to play around with it - based on the “seven years” part, it’s not only me ;-)

                          1. 4

                            Company: Coder

                            Company site: coder.com

                            Position(s): Go and Typescript Engineers

                            Location: Austin TX - remote or onsite

                            Description: We’re a small startup in Austin, TX looking to scale our team with solid Go and Typescript engineers. The positions involve developing and maintaining the Go microservices and dashboard that serve our development platform on kubernetes. More details at https://www.reddit.com/r/golang/comments/erz90i/hiring_go_engineers_at_coder/

                            Tech stack: Go, Typescript, React

                            Contact: anmol@coder.com

                            1. 1

                              remote — I’m guessing US only, still?

                              1. 1

                                Other countries are possible, just depends on whether we think it’ll work out with the specific candidate.

                              2. 1

                                just fyi, the contents of that post are removed

                                1. 2

                                  Thank you, I’ll look into it.

                                  For now I’ve duplicated the contents onto this gist: https://gist.github.com/nhooyr/3e6cd38b58df65080df49e2a0318514e

                              1. 3

                                I just wanted to say that I appreciate the imagery used here. I understand that it doesn’t necessarily affect the technical merits of the argument (which I think is a good one), but it was a pleasure to read. Technical writing that is actively fun to read at the prose level is not common. I am reminded of James Mickens, @aphyr’s Hexing the Interview and Fred Brook’s essays on building castles in the sky.

                                1. 2

                                  James Mickens

                                  A direct link must be offered: https://mickens.seas.harvard.edu/wisdom-james-mickens. His work is incredible.

                                1. 5

                                  Adopting the Contributor Covenant

                                  I am not too happy about this. I believe that all users should be treated equally, but something about these recent CoC changes just destroys communities:


                                  Off topic, I see that you are the author of the linked post. I also see that you have more posts than comments:


                                  Is it your intention to just use this platform to advertise for GitHub?

                                  1. 17

                                    I think codes of conduct are good. They’re important for making community norms explicit, and as tools to change community norms that are inappropriate. Both of these are important for marginalized members of the community.

                                    Something important to remember is the paradox of tolerance. If you’re willing to tolerate the intolerant, the intolerant will eventually turn the community into an intolerant community.

                                    The code of conduct that git has adopted is a pretty relaxed one. As long as you’re not a jerk you won’t even have to think about it.

                                    1. 10

                                      I’m not a CoC-fan either (though primarily because it implicates corporate professionalism (ala anti hacker culture) than freedom of speech issues), but I still wonder. What examples are there the “Contributor Covenant” in practice. When has it helped in ways that a simple “be kind and respectful” wouldn’t have?

                                      Also don’t forget that it’s this specific document that’s far more controversial than any self-written community guidelines or mailing list rules. I for example still don’t understand what’s so great about it specifically. You say it makes community norms explicit, but most of the time, it’s just a copy-pasted document from outside said community.

                                      1. 4

                                        While I think that code of conducts are probably a good thing, I don’t share your optimism about the Contributor Covenant.

                                        I admit I haven’t read the CC closely since a very early version[0], but what I remember of it was quite vague (perhaps this is what you mean by “relaxed”?). Moreover, its focus on “professionalism” thoroughly undermines its goals of inclusion, and (for people whom that isn’t reason enough) is counter to the hacker ethos.

                                        If you’re looking for a code of conduct similar to the CC, better (not perfect IMO, but much better!) examples include the Slack, Rust, and Django CoCs.

                                        [0]: which I really wanted to like, up until I suggested a minor clarification to the text and then was … promptly blocked by the author.

                                        [1]: Note: a one- or two- page CoC isn’t nearly enough space to make community norms explicit to the point where every decision to fire or censure a moderator won’t devolve into a flamewar (worse yet, it may invite exegesis). For comparison, the IWW—which wikipedia describes as an anarchist organization—has a process document that is about about 100 pages long. A CoC is not a process document.

                                        1. 2

                                          Thanks for the link regarding the use of the word “professionalism”. I’d like to note that the term is last in a list of stuff that’s example of what not to do, so it’s not front and foremost in the main text.

                                          I’d also like to note that the term “hacker ethos” is similarly coded, as “hacker culture” is historically coded male and privileged. If there are attempts to reclaim the term, I’d love to have some more information to read about that.

                                          I do agree that the CC is maybe a bit too brief, and not enough to prevent acrimonious rules-lawyering.

                                          1. 4

                                            “hacker culture” is historically coded […] privileged

                                            Is it? Before these excessive amounts of money poured into tech in the late 90s, being part of hacker culture implied a certain danger in general society, socially but also physically.

                                            (no argument on it historically being a male domain)

                                            1. 2

                                              Re: the term “privileged” - up until the late 90s, just accessing a piece of computing machinery implied access to quite a bit of disposable income. I realize the word has more connotations than just material wealth, but it’s certainly a big part of it.

                                              1. 5

                                                I grew up in a western “working poor” situation and got my home computer in 1990. It was horribly outdated by that point, but computing access was one of these situations where “trickle down” actually worked because those with the money had lots of motivation to go with the latest and greatest and got to get rid of their stuff from last year. Two or three iterations later it became affordable for those who didn’t really have the money but the interest in pursuing the topic.

                                                Sure, somewhere in the poorer parts of Africa or Asia widespread access to computing is still not a given today (although smartphones are making inroads), but that’s generally not what the people mean when designating others as “privileged”.

                                                1. 4

                                                  Stepping back from a particular time period, “hacker culture” has a long history, and that history is mostly students at prestigious universities and colleges (MIT, Stanford). Now, not all of these students were personally affluent, but by attending these seats of learning they were privileged.

                                                  In the aggregate, it was easier to get involved in computing and hacking if you were part of an affluent milieu, or if you were not, was encouraged to study - and more importantly, had the opportunity to study, instead of for example, working for a living. Both contexts imply disposable “income” - either in money, or in the acceptance of opportunity cost in preparing a young person for higher education.

                                                  1. 3

                                                    Both contexts imply disposable “income” - either in money, or in the acceptance of opportunity cost in preparing a young person for higher education.

                                                    So Europeans (no matter their intersectionality in other aspects) are off the scale thanks to access to higher education being taken care of, for the most part.

                                                    If we collect some more of these properties that cover entire continents, everybody is privileged, rendering the term meaningless.

                                                    1. 4

                                                      Higher education in much of Europe may be gratis in regards to attendance fees, etc, but there are not enough places for everyone who wishes to attend them. So you still have a situation where more well-to-do are able to prepare their offspring for the competition of attending by extra study time, language study abroad, etc etc.

                                                      Anyway, I don’t think it’s productive to continue this discussion. We obviously have different meanings of the word “privileged”, and that’s where the rub lies. Thanks for taking the time to respond.

                                            2. 2

                                              I’d also like to note that the term “hacker ethos” is similarly coded, as “hacker culture” is historically coded male and privileged.

                                              Male yes, but I think irrelevant. Privileged, no.

                                              It’s pretty tough to pin down a strict definition of “hacker ethos.” To me it means tinkering with computers and soaking in the culture of bbs and meetups and reading through books like Steven Levy’s Hackers [0] and stacks of 2600.

                                              But I’m fairly young and there are many different experiences.

                                              Historically, and currently, the vast majority has been written by males but I think the hacker ethos is not exclusive to non-males and the difference is around curiosity and knowledge sharing over anything gender-specific.

                                              Note that I think it includes many characteristics of culture that aren’t specific to hacking.

                                              But I don’t think the hacker ethos is privileged at all. It’s focus on low resource environments and DIY and sharing is as close to anti-privileged as you can get.

                                              My own first experiences with computers was through a public school and library and I didn’t have access to computing resources for many years. MIT hackers were great, but they aren’t everyone. Visiting hackers in many countries shows similar tinkerers and low/zero resource learning systems. It was really neat meeting hackers in Kampala who grew up programming on raspberry pis, getting electricity through creative means because their home didn’t have the electricity grid.

                                              So while there were certainly hackers with lots of resources, there were (and still are) many without privilege.

                                              [0] https://en.wikipedia.org/wiki/Hackers:_Heroes_of_the_Computer_Revolution

                                          2. 3

                                            Codes of conduct should only be needed if and when bad conduct repeatedly and systematically occurs. I have never come across any such bad conduct in my many years of working on free software so I can only assume it is not wide-spread. It would be enlightening to see some examples of the bad conduct which led the Git project into adopting this code. If there are none they’re on thin ice in adopting it as far as I’m concerned, especially since these codes themselves often lead to strife.

                                            1. 6

                                              Codes of conduct should only be needed if and when bad conduct repeatedly and systematically occurs

                                              By that time it’s too late, the damage is done.

                                              Much like political constitutions, it’s best to get these things in place before things get bad, and when everyone is on the same page.

                                              1. 10

                                                It’s possible that the way that you experience the world is not the way that marginalized people experience the world. And maybe we should be focusing on making it easier for them to contribute, rather than the people who are least marginalized.

                                                Git is part of the larger open source community, and part of the larger computer science community, both of which have had many problems over the years. You can find many examples of this if you google “open source sexual harassment”. Linus Torvalds, who started the Git project, is famous for his abusive rants. When we’ve seen so many examples of fires breaking out in other similar projects, it seems sensible to get a fire extinguisher.

                                                1. 13

                                                  Linus Torvalds, who started the Git project, is famous for his abusive rants

                                                  His rants were abusive in the regard of someone who he considered “dumb” at the time, or similar. To my knowledge he wasnt ranting at someone because of their race or gender identity. Do you have evidence to the contrary? Else it comes off as you slandering him, which I wont stand for.

                                                  1. 6

                                                    It’s possible that the way that you experience the world is not the way that marginalized people experience the world

                                                    I’m not sure it’s wise to tell random folks you likely never met (or in case of standardized documents: whole communities) that they’re not marginalized as if speaking from authority.

                                                    1. 2

                                                      Linus Torvalds, who started the Git project, is famous for his abusive rants.

                                                      I love Linus “rants” and they are not abusive, they just use colorful language, which is refreshing.

                                                      You can only interpret these texts as abusive if you are less than 12 years old.

                                                      1. 10

                                                        (the twitter link leads to a post in which SS calls Ted Tso a ‘rape apologist’)

                                                        Please note, I am not diminishing what rape is, and or any particular person’s experience. However, I am challenging the use of statistics that may be hyperbolic and misleading … – Ted Tso

                                                        That Ted Tso?

                                                        Throwing epithets does not a truth make. In this case Tso was called a ‘rape apologist’ but that does not make him one, it only means someone attached a label to him because he dared to disagree. Disagreement is not the same as bad conduct. Sometimes it can be solved by discussion, sometimes there is no solution other than acceptance of the fact that people disagree. Let it be, let them be, they have the same right to an opinion as you have.

                                                        (to make it clear, I realise that cup posted this link as an example of how these policies lead to strife)

                                                        1. 10

                                                          Remember the Halloween documents [1], Microsoft’s infamous plan to derail free software in general and Linux in particular? Just image what they would have been able to achieve by strategically calling out developers as ‘rape apologists’ and such.

                                                          Maybe someone did realise this after all? Identity politics is a potentially devastating way to break up communities, and many of these ‘codes of conduct’ can be traced back to this type of politics.

                                                          [1] https://en.wikipedia.org/wiki/Halloween_documents

                                                    2. 4

                                                      I am not too happy about this. I believe that all users should be treated equally, but something about these recent CoC changes just destroys communities:

                                                      I’m actually rather surprised that it all happened so quietly. I guess it was overshadowed by the RMS-situation.

                                                      1. 8

                                                        Me neither, identity politics - the basis of the contributor covenant - has no place in free software communities - or any other community for that matter. It only serves to create factions where none should be, it raises (often trivial) differences between individuals to their defining characteristics and uses those to split communities into groups, groups into hierarchies of oppressed and oppressors. To what purpose, other than to create strife? It is totally antithetical to the famous New Yorker cartoon of the dog-with-a-keyboard telling the world that “on the internet, nobody knows you’re a dog” [1].

                                                        Sendmail was written is and maintained by Eric Allman who was and is openly gay. He’s married to Marshal McKusick of BSD fame. Nobody cared. Nobody cares. That is how it should be and how it was, but that is not how it will be if identity politics really takes hold because Allman will find himself pushed into a certain slot (white [-10] middle-aged [-6] gay [+7] man [-10]) instead of just being known as ‘the guy who developed Sendmail’. Same for McKusick, Same for, well, everyone else.

                                                        The History [2] and Talk [3] section on the Contributor Covenant article [4] on Wikipedia is telling in this respect: criticism is silenced with a claims of ‘The situation is completely solved.There is no need for this outdated section’.

                                                        [1] https://en.wikipedia.org/wiki/On_the_Internet,_nobody_knows_you%27re_a_dog

                                                        [2] https://en.wikipedia.org/wiki/Contributor_Covenant

                                                        [3] https://en.wikipedia.org/wiki/Talk:Contributor_Covenant

                                                        [4] https://en.wikipedia.org/w/index.php?title=Contributor_Covenant&action=history

                                                        1. 3

                                                          New contributors can be assured that the Git community is behind this adoption with the introduction of the Code of Conduct, Acked-by 16 prominent members of the Git community.

                                                          … out of 1316 contributors currently listed on https://github.com/git/git.

                                                          1. 1

                                                            Thanks. I was trying to learn what such a vague statement meant.

                                                          2. 3

                                                            I also see that you have more posts than comments […] Is it your intention to just use this platform to advertise for GitHub?

                                                            All five posts are “Git highlights” blog posts. Nothing is specific to GitHub, other than their being hosted on GitHub’s blog.

                                                          1. 14

                                                            This is a great article. Not only does she share a well written retrospective on what she should have done better… she doesn’t let her mistakes define her. If she did, or was afraid they would, she wouldn’t have written this.

                                                            By writing this, she is able to grow from her mistakes, help people not make similar mistakes, teach others how to think through and do retrospectives… etc… but most importantly, she shows us by example that our mistakes don’t define our value as engineers or people. You learn, grow, and move on.

                                                            1. 3

                                                              I also really appreciate the “(so far)” in the title, because, let’s face it — your worst mistake is only your worst until you inevitably commit a more egregious one.

                                                            1. 2

                                                              What we want is information that explicitly splits the data into two. We don’t want something that can include both male and females, we want purity. One singular class for each split.

                                                              ???? where even does this link to the text, other than the weirdly-included RuPaul’s Drag Race gif in the poorly formatted header above it? (and even then, why this particularly debated example of something that some people dispute is exactly two classes? there are way better binary classes!!)

                                                              1. 3

                                                                Being horribly blocked by brain fog, it seems :/

                                                                1. 17

                                                                  Just donated $100 for that specifically. I really do profoundly hate software patents as an institution.

                                                                  1. 7

                                                                    Spurred on by your comment, donated $25!

                                                                    1. 4

                                                                      Donated as well. This “business model” is nothing less than extortion.

                                                                      1. 3

                                                                        Fiiiine enters payment info. This case could turn out to be a motivational one for other projects who will fight the same trolls.

                                                                        1. 1

                                                                          Good work. I have donated also.

                                                                  1. 8

                                                                    This is a fun list :)

                                                                    I’ve been using Go Mono for about a year now I think, and it’s been a real treat. I feel like ligatures are more of a personal opinion thing than a legibility thing, but I really like them.

                                                                    1. 4

                                                                      When Go Mono came out I switched and never back. Sublime.

                                                                      1. 3

                                                                        Was on iosevka term slab (another serif font), but I’m digging go mono.

                                                                      1. 2

                                                                        Given the title, I expected a rant. Was very pleasantly surprised at the content. I appreciate the format of “here are a bunch of mistakes I’ve made, maybe this will help you avoid some of them.”

                                                                        1. 1

                                                                          Absolutely; this is a nice change from some of the more inflammatory content lately from Drew which has really rubbed me the wrong way (which is neither here nor there). Really love that this post combines humility with a gift of lessons learned in code form!

                                                                        1. 3

                                                                          The audio tag means it’s supposed to be an audio link right? Different color, same color as pdf tag.

                                                                          1. 1

                                                                            Oh, you’re right. I assumed it meant audio-related stuff. It’s not letting me suggest it get removed. Mind doing that for me?

                                                                            1. 2

                                                                              It is done!

                                                                              1. 1