1. 6

    This is really interesting, thank you. For a long time I have been a user and sometime-contributor to IkiWiki, a static wiki site generator. The original/principal author decided that the default theme for the wiki should be basically no theme, an “anti-theme”. For new wikis I can understand (you need to configure a lot of things, so you might as well configure a theme too), but he extended this decision to the site that forms the “advert” and demonstration of the software itself, namely its homepage. But the anti-theme is so hostile to legibility I really felt that it was a bad decision and could be putting of potential contributors before they’d got started. Unfortunately nobody is sufficiently actively contributing to IkIWiki now and my appeal to revisit that decision, 18 months ago, has gone unanswered. I just posted Typesetter.css there as I felt it’s relevant to that discussion.

    1. 2

      I’ve just had a look and legibility for me was very high. This is on an iPhone 8 with Safari. It’s great to not have to press the ‘reading mode’ button on every site.

      What kind of browsers / screen sizes make it show legibility issues?

      1. 3

        I have a wide monitor and my eyes really can’t track a line of text that well over such a long distance. It also causes me to “miss” the next line when I scan back to the left.

        1.  

          I see. I don’t make my browser full screen on wide displays - not because of this, because it’s rare, but because most sites do their own thing to keep the text to a reasonable width - and therefore there is a lot of wasted space.

          Back in the days of Netscape Navigator, I remember setting up the details so that sites without styling would look good to my eyes. If browsers support a default style sheet then it would be good if it had a max width to cater for this. I’d like to publish without CSS and let the user decide how they want content to appear (surely this is a good way to hell with accessibility?) but I’ve seen this problem before.

        2. 3

          If you’re talking about ikiwiki.info, then I find it illegible on my iPhone 7 with Safari, which (I think) is the exact same size and ppi as your 8. So to a certain extent it must be in the eye of the beholder.

          1.  

            Your link goes to this Lobsters discussion page. Fixed link: ikiwiki.info

            1.  

              Thanks!

      1. 17

        Another fun feature of ruby is the __END__ keyword. If that keyword appears alone on a line, ruby will stop parsing the file at that line. In the same file you can use the magic DATA variable to read the rest of the file. Eg:

        #!/usr/bin/env ruby
        puts DATA.read
        __END__
        Hello
        

        This program will output Hello\n when executed.

        This allows to easily create self-unpacking scripts for example, or to join data with code.

        1. 6

          This feature is present in Perl too.

          1. 3

            Perl’s documentation of its __END__ and __DATA__ special literals: https://perldoc.perl.org/perldata.html#Special-Literals

        1. 4

          When I worked with Clojure in Vim, I preferred vim-sexp over paredit.vim. I remember that Paredit forced that parentheses always be balanced. It clashed with my workflow of deleting a snippet of code (sometimes unbalancing parentheses) and then pasting it somewhere else in the file (making the parentheses balanced again). vim-sexp provides the same slurp, barf, etc. commands as Paredit without imposing that restriction.

          If you use vim-sexp, you will probably want vim-sexp-mappings-for-regular-people as well.

          1. 3

            I use both vim-sexp and vim-sexp-mappings-for-regular-people but I also use parinfer-rust. https://github.com/eraserhd/parinfer-rust It is by far the best application of parinfer I’ve come across. If you have tried other versions before and didn’t care for it I would suggest giving this one a go. It uses “smart mode” I think they call it, and it just works. I couldn’t stand the emacs version but this one made my transition back to vim so fun and simple.

            1. 3

              At least in Emacs, Paredit also provides bindings for deleting whole sexps, so you don’t end up with that issue. For instance, in

              (let [x 5
                    foo (fn [y]
                          (+ y x))]
                (foo 8))
              

              if you position your cursor after the 5, you can do C-M-k (kill-sexp) twice and pull out both the foo binding and the fn expression onto the clipboard. It’s a bit of a different approach, but it means never having to do that cleanup work of balancing parens.

              1. 2

                Yeah paredit is the thing I’m most likely to change. I’ve heard of vim-sexp but haven’t used it yet!

              1. 8

                The comment field there doesn’t permit editting and correcting typos…..

                So let me try again here…

                In a galaxy far far away….

                Larry Wall wondered why he needed to learn 3 pretty bad languages, sh, awk, sed…., and devised perl as the Grand Unifying Language.

                Perl sadly borrowed too much from it’s inspirations, and wasn’t much more readable.

                Then Matz came along and resolved to borrow the best from perl and scheme and ….. and make something more powerful than them all, yet more readable.

                It’s called Ruby.

                And yes, you can do everything in Ruby, in one line if you must, that you can do in bash, awk, sed, jq, perl…. but in a more powerful and maintainable form.

                All this has been available for decades, why are we (still) bashing (pun intended) our heads against the Lowest Common Denominator?

                1. 8

                  serious question: what does “doing some awk in Ruby” look like? This might be a pretty big motivator for me to finally figure out Ruby for scripting (I’m more of a Python guy myself but awk works nicely for small scripts on line-oriented stuff when I want a one-liner)

                  1. 8

                    Compare:

                    # Official way of naming Go-related things:
                    $ grep -i ^go /usr/share/dict/* | cut -d: -f2 | sort -R | head -n1
                    goldfish
                    

                    Versus Ruby:

                    puts(Dir['/usr/share/dict/*-english'].map do |f|
                      File.open(f)
                        .readlines
                        .select { |l| l[0..1].downcase == 'go' }
                    end.flatten.sample.chomp)
                    

                    Simple example, but I think it demonstrates that doing various basic and common tasks are quite a bit more complex to do in Ruby than in the shell.

                    That doesn’t mean I’m always in favour of shell scripts – I got that example from an article I wrote saying you shouldn’t use shell scripts – but there are definitely reasons shell scripting persists, even though we have things like Perl and Ruby.

                    In that article I wrote “I regret writing most shell scripts [..] and my 2018 new year’s pledge will be to not write any more”. I’ve mostly failed at that new years’ pledge, and have happily continued shelling about. I have started rewritting shell script prototypes to other languages at the first sign of getting hairy though, and that seems like a middle ground that is working well for me (I should update/ammend that article).

                    1. 5

                      To be fair, it looks like most of the additional complexity in the Ruby code comes from reading files: the first command in the pipeline, grep -i ^re glob, is what becomes

                      Dir[glob].map do |f|
                        File.open(f)
                          .readlines
                          .select { |l| l[0..1].downcase == re }
                      end.flatten
                      

                      The rest of the script contributes very little to the Ruby code.

                      I suspect this is a recurring theme when trying to replace shell pipelines with programs. Only Perl avoids some of this additional complexity for reading files, I think.

                      1. 5
                        puts Dir['/usr/share/dict/*-english'].
                          flat_map { |f| File.readlines(f).grep(/^go/i) }.
                          sample
                        
                        1. 6

                          At least with Ruby I don’t have to constantly cross-reference the man page and my cargo-culted knowledge of Unix’s multitude text manipulation DSLs, all unlike. It’s pretty obvious what it’s doing.

                          1. 1

                            Actually you used very little shell there in your first example.

                            You also used grep, cut, sort and head.

                            Why do you assume the backtick operator and the | operator for io doesn’t exist in ruby? In fact why do people assume shell and jq do not exist if you use ruby?

                            Personally I tend to reduce the number of tools involved to reduce the cognitive load of needing to understand each tool to understand the one liner.

                            I balance that against considerations like going IO.read(”|sort -u fileName”) can be a huge performance boost

                            Anyhoo… some examples of ruby onliners

                            http://reference.jumpingmonkey.org/programming_languages/ruby/ruby-one-liners.html

                          2. 7

                            Because code in sed or awk that worked a decade ago (or, hell, two years) still works. Ruby code seems to bit rot faster than any other language I’ve use for nontrivial work.

                            Also, with awk, I could put it down for a year, then use it again, and everything I’d need to be productive fits in a small man page. (The same seems to be true of sed, though I don’t use it much.) The Ruby ecosystem moves a lot faster, and if you haven’t been following it closely, catching up will add extra work. (Whether it’s actually going anywhere is neither here nor there.)

                            Yes, awk is a more limited language, but that’s a trade-off – there are upsides, and I know which I’d prefer.

                            1. 1

                              Not true.

                              The awk scripts I wrote decades ago with in Solaris awk which is not quite the same thing as gnu awk.

                              Well thought out growth in a language is good.

                              I find the maintenance burden in ruby rolling forward with language versions is very low.

                              Doubly so since rubocop will often autocorrect stuff.

                            2. 6

                              I don’t know Ruby. But for me these are the reasons why I am writing more and more bash programs:

                              • Bash is my command line. So I am doing a lot of small steps, file modifications, comparing, searching analysing. At some point I can see that some of the steps can be composed and I pull them out of the history, try them out on the console and at some point put them into a script. If Ruby would have a REPL in which I can do all the operations that I am doing on the command line with less typing and more comfort, I would maybe give it a try.

                              • Bash is on every Linux box. Ruby is not.

                              1. 4

                                Ruby does have a REPL. It’s called IRB and it comes with every Ruby installation. I use it exactly as you describe, for composing small programs iteratively.

                                1. 1

                                  Are you using the Ruby REPL as your daily all-time console or just when you have in mind to create a program? I am asking honestly because I do not know anything about Ruby or their REPL and I am quite interested how good this REPL is as a replacement for the daily life?

                                  My point is that shell scripts are a by-product of using the shell for doing manual tasks. And I get better and better at my shell usage, and even after 20 years of shell usage I am still discovering new features or ways to do something in a more efficient way. While the shell language is really ugly, but being very succinct plus the composition of unix commands, the history, the prompt customization, the possibility to have vi mode for editing (and I probably forgot a lot of features), all this makes using shell such an efficient tool.

                                  1. 2

                                    Well, no, not as my daily shell. I dislike shell scripting enough that I switch to Ruby pretty quickly if I’m having to spend any amount of time or effort on a task, but it’s not meant to be a replacement for bash/zsh/fish.

                                2. 3

                                  Bash is on every Linux box. Ruby is not.

                                  Let’s not limit ourselves here. For those not using Bash and/or Linux, how about this:

                                  • Bourne-compatible $SHELL is on every Unix box. Ruby is not.
                                  1. 2

                                    Bash is on every Linux box. Ruby is not.

                                    So is ed.

                                    However sudo apt install ruby solves that problem.

                                    And yes, ruby does have a REPL.

                                    1. 2

                                      apt: command not found.

                                      sudo: permission denied

                                      $

                                      1. 2

                                        Have fun with ed then, it’s the Standard!

                                        https://www.gnu.org/fun/jokes/ed-msg.html

                                        1. 1

                                          I have written scripts in ed before to do some sufficiently tricky text manipulation. It’s a good tool.

                                  2. 5

                                    Mostly, because picking up enough jq, awk and sed to be useful is faster than learning the ins and outs of Ruby?

                                    I suppose you could make a similar argument about learning Ruby one-liners, but by the time I’m writing a very long bash script, I’m probably writing a larger program anyway, either in Go or Python. Ruby as a language doesn’t have much appeal to me, at least at the moment.

                                    Awk, at least, fits very nicely into a small space right next to regex. jq is a bit fiddilier to pick up, but very nice for basic stuff. Sed, I still don’t have down very well, but also is nicely regex adjacent.

                                    1. 3

                                      I regularly write sed one liners to do refactorings on my Ruby code. Usually the sed call is fed by the result of grep or find. I could write a Ruby one liner to do the same, but it would be a much longer line and escaping would be much more difficult. Ruby is simply not a replacement for the convenience of sed.

                                      And maintainability is a red herring here: the whole point of something like sed is that you use it for one-off commands.

                                      1. 2

                                        I’m not that experienced with jq, but when it comes to awk (and sed), one of their benefits is that you can easily write a program in the shell, since they act as glue between pipe operations.

                                        For example, to filter out all lines that have less than 4 characters, all you have to write is

                                        ... | awk 'length >= 5' | ...
                                        

                                        no imports or types required. It was made for stuff like this, which makes it easy to use. I’ve only read a book about Ruby a few years ago, but to process stdin/out this was should require a bit more overhead, shouldn’t it?

                                        1. 1

                                          One part of your history lesson is missing: Paul McCarthy and Steve Russell saw what was going to happen and pre-emptively invented Lisp. And yes, you can do everything in Lisp, in one line if you must, that you can do in bash, awk, sed, jq, perl… but in a more powerful and maintainable form.

                                          ;)

                                          1. 2

                                            s/Paul/John/

                                            This gotta be one of my most common brainarts…

                                            1. 2

                                              It was Yoko’s fault.

                                            2. 1

                                              Ruby equivalents of the basic awk and sed examples from the article, as examples of Ruby one-liner structure:

                                              • AWK: awk '{print $1}' logs.txt
                                                • Ruby: cat logs.txt | ruby -ne 'puts $_.split[0]'
                                                • Ruby: cat logs.txt | ruby -ane 'puts $F[0]'
                                              • sed: sed 's/^[^ ]*//' logs.txt |sed 's/"[^"]*"$//'
                                                • Ruby: cat logs.txt | ruby -ne 'puts $_.gsub(/^[^ ]*/, "").gsub(/"[^"]*"$/, "")'
                                            1. 2

                                              What seems to be missing, in my opinion, is a book that is written for beginners in programming, that teach you programming while teaching you the language.

                                              There are many such books out there, at least for other languages than Clojure. When I took a programming class in high school, I learned a lot from the free online textbook we were using, Introduction to Computer Science using Java by Bradley Kjell. I think that book would be good for self-learners, too. I liked its style of asking questions at the end of each page to keep you thinking. The downside is that the book teaches Java, a language that is often cumbersome to write in – certainly more cumbersome than Clojure. But learning any second programming language is relatively easy after you have learned your first.

                                              Though it may be easier to find beginners’ books for languages other than Clojure, I acknowledge that switching focuses from your original choice of language may be a bad idea. It is easy to get caught in a trap of always hearing about a better way of doing something and switching to it before you have learned much, causing you to spend all your time reading introductory materials and no time actually doing the exercises and learning things.

                                              Given that you want to learn Clojure, maybe there are more beginner-oriented books you haven’t considered. I noticed there’s a book Getting Clojure by Russ Olsen that was published a year ago. Reading the chapter excerpts linked on that page and the reviews on Goodreads, it looks like that book might be basic enough to be suitable for beginners. You can read the excerpts yourself and decide.

                                              1. 1

                                                Thanks for the time you took to write a post thorough like this. Yes, I agree that second language is relatively easy when you’ve learned your first, but I’m still struggling with my first :) Not for long, I hope.

                                                The thing about switching languages and keep getting stuck reading introductory materials is what I got trapped in, I think. But that’s why I’m going to stick with Clojure and not get distracted by trying to do something in other languages, at least for now.

                                                Getting Clojure is a book that several people recommended, alongside Clojure for the brave and true. I’ll definitely check it out.

                                              1. 2

                                                Speaking of pages that list comments, is there any existing page that shows all of one’s own comments? I would like to be able to save all of my comments to my computer, and to search within my comments to find one I remember making about a certain topic.

                                                Your Threads contains one’s comments inline with other comments, but the page ends with threads from a few months ago. Comments contains all comments, paginated, but I don’t see a way to filter it to a specific user’s comments.

                                                1. 1

                                                  No, there’s currently no page for all comments by a user.

                                                1. 4

                                                  I gave up on the captcha. Will this end at some point? I think I filled 4 or 5 of the captcha screens before I wanted to throw my PC out of the window.

                                                  The funny thing is how you can relate many components to modern web pages: Cookie banners, message boxes popping up on the bottom right, fullscreen hover popups about “Please subscribe to our newsletter”…

                                                  1. 3

                                                    The captcha ended for me after three screens – checking pictures containing “glasses”, “checks”, and “bows”.

                                                    Maybe the form checks if you marked the pictures accurately. Did you notice that the checkboxes aren’t associated with the picture close above them, but the picture far below them? To see the checkboxes for the top row of pictures, you have to scroll up. I’m not sure if it mattered, but I didn’t select the pictures of glass windows since I would call them “glass”, not “glasses”, and I didn’t select the single picture of chess pieces that were not in check.

                                                    1. 3

                                                      I noticed the checkboxes being above the pictures (but also well done that you have to scroll up a bit to see this). My mistake might have been the glasses. There was one image with multiple panes(?) of glass, which I marked as “glasses”.

                                                      But having to repeat this over and over was also a nice feeling of surfing the web with a VPN and getting Google captchas. I feel that when you use a VPN you get the most difficult ones and have to do like 5 or more to reach a website.

                                                  1. 4

                                                    I would like to know what kind of drama has ensued over human moderation of tagging at AO3 before jumping ton the conclusion that their particular system of tag curation is better than either top-down Dewey-decimal style classification or twitter-style freeform tagging. I personally rather like the ability to freely create tags, twitter- or tumblr-style, and like the rhetorical effect of writers introducing new information in the form of of a hashtag, which human moderation for the purpose of searchability would get in the way of.

                                                    1. 6

                                                      You can still freely create tags. Like, I just saw a story that has a “don’t read this if you’re having a bad night okay” tag, which is clearly not meant to help you search or browse, it’s just an informational tag. And I can still click on that tag to see other stories (none yet) with the same tag, I just can’t use it combined with other tags in AO3’s filtering engine.

                                                      There’s definitely been drama over the tag system, and there was a ton of debate involved in implementing it. You can read about it on Fanlore. But this is a very large and diverse community, so there’d be drama about any policy made. I don’t think “drama” is a point for or against any policy.

                                                      1. 2

                                                        This criticism quoted on that Fanlore page resonates with me:

                                                        But that’s the problem with the freeform tags; they are simultaneously presented as personal expression for the authors that cannot be touched or questioned even if it’s unwranglable or obviously a typo, and a rational structure to find fic with. It’s an incoherently thought out system.

                                                        If AO3 were at all sane and sensible, they’d have a canonical set of tags for indexing and then a freeform area.

                                                        After reading all the comments on that Fanlore page, I think there are not two, but three types of tags that people write:

                                                        • tags that could be pre-defined officially by the tag-wrangler team, like “Harry Potter” or “slash”
                                                        • unusual tags that are still useful for categorization, like “high school AU” or “angry sex”
                                                        • one-off tags that are just author’s notes that the author doesn’t want to emphasize, like “don’t read this if you’re having a bad night okay” or “Sirry is a creamy cupcake”

                                                        Inspired by the Proposed Suggestions for Improvement section of the Fanlore page, here is a tagging system that gives readers more information and still gives authors freedom of expression. The idea is to store tags of each of the above three types separately, instead of in the same list, as AO3 currently does. The tagging user interface for authors would probably consist of one combined tag field for the first two types, in which the autocomplete suggests official tags before unofficial tags, and one field for “mini-notes” or whatever you call them. The mini-notes would be displayed under the tags field, and could be hidden by users who only like seeing informational tags.

                                                        Adding more categories of tags increases the difficulty of communicating to the users how to use the tag system. I think that giving the fields different names than “tags”, such as “mini-notes”, would help a lot, as would putting one-sentence descriptions next to the fields. More ideas for names:

                                                        … I’d rename freeform tags as ‘fic labels’ or something, and then create a new set of not-freeform, wrangler-created-and-curated navigational tags. (Or the same thing, but leave the current thing called ‘tags,’ and call the new navigational thing ‘search keywords’ or something.)

                                                    1. 2

                                                      I remember when I first started using Ruby, I occasionally used my text editor’s shortcut for “wrap selected lines in block comment” and was confused that the resulting code was always highlighted as invalid. I eventually gave up trying to use block comments. It’s good to finally learn why that suggested =begin =end syntax didn’t work.

                                                      1. 17

                                                        Interested in hearing other views. But I think what they are doing is reasonable.

                                                        Can this be extrapolated into a ‘BLISS’ principle: ‘Buy License if SaaS’ (just came up with abbreviation :-) )

                                                        “.. The one and only thing that you cannot do is offer a commercial version of CockroachDB as a service without buying a license. ..”

                                                        They should probably provide some examples of what they consider a CockroachDB service, vs a service that’s using CockroachDB underneath.

                                                        1. 10

                                                          agreed. copying my comment over from hn:

                                                          this seems like an excellent licence, clearly spelling out the intent of the copyright, rather than trying to fashion a one-size-fits-all set of rules. it reminds me of cory doctorow’s point that, intuitively, if some community theatre wanted to dramatise one of his works, they should be able to just do so, but if a major hollywood studio wanted to film it they should require a licence, and it is hard to draft a copyright law that does this properly.

                                                          1. 13

                                                            Can this be extrapolated into a ‘BLISS’ principle: ‘Buy License if SaaS’

                                                            It can be. The question is not whether someone could do a thing, it’s whether they should do a thing.

                                                            And the answer to that question is: Cockroach Labs itself wants to offer CockroachDB as SaaS, and they see it as absolutely necessary that they have the exclusive right to decide whether anyone else can do that and charge money for the privilege. Fair enough, they hold the copyright on the software (presumably) and can relicense it as they wish.

                                                            But what happens to Cockroach Labs’ SaaS offering if every other component of the stack they run on adopts the same license and says “free but only if you’re not a for-profit SaaS”? If they have to pay dozens or, more likely, hundreds of separate license fees for the privilege of using all the other open-source components they depend on?

                                                            The answer is Cockroach Labs would not be in the SaaS business for very long after that, because they wouldn’t be able to turn a profit in such a world. The categorical imperative catches up to people. And the real result would be everybody forking from the last genuinely open-source version and routing around the damage that way.

                                                            1. 11

                                                              But what happens to Cockroach Labs’ SaaS offering if every other component of the stack they run on adopts the same license and says “free but only if you’re not a for-profit SaaS”?

                                                              but cockroachdb, as far as i can make out, is not doing this - they’re saying “free, unless you’re a for-profit cockroach-db-as-a-saas”, that is, if what you are selling is a hosted version of cockroachdb itself, rather than some other saas product that happens to use cockroach as a backend.

                                                              1. 5

                                                                Right. So assuming that Cockroach Labs offers no services except CockroachDB-as-a-service and a support line, Cockroach Labs would not have to pay for any additional licenses if all dependencies in their software stack switched to CockroachDB’s new license.

                                                                I think very few companies would be harmed if this license became prevalent. (I make no statement on the worth of the services of the few companies that would be harmed by such mass relicensing.)

                                                              2. 4

                                                                But most of the deps of CockroachDB aren’t created by corporations who need to monetize them directly.

                                                                1. 12

                                                                  Exactly. I think different kinds of projects end up preferring different kinds of licenses, for good reasons:

                                                                  • core infrastructure — libraries, runtimes, kernels, compilers — permissive and public domain-ish — because “stuff you were going to write anyway”, not written directly for profit, stuff you want to just exist and would love it if someone made a successful fork (because you wouldn’t have to maintain it anymore! — that’s most of my github projects) etc.
                                                                  • end user / GUI / client software — desktop, mobile apps — copyleft — because someone else turning your app into a proprietary one sucks, you want user freedom for the end users
                                                                  • SaaSable / Web Scale™ / serious business oriented server software — distributed DBMSes like this one — these “Buy License if SaaS” licenses — because reasons everyone discussed with the SaaS thing

                                                                  Of course not everyone will agree with my philosophy here, but I think it’s good and much more productive than “I hate GPL” / “I hate permissive” / “the anti-SaaS stuff is destroying all FOSS ever”. You don’t have to attach yourself personally to a kind of license, you can adopt a philosophy of “different licenses for different kinds of projects”.

                                                                  1. 1

                                                                    core infrastructure — libraries, runtimes, kernels, compilers — permissive and public domain-ish — because “stuff you were going to write anyway”,

                                                                    I don’t think that’s true given the value that great infrastructure can provide, esp with good ecosystem. The mainframe companies, VMS Inc, Microsoft, and Apple all pull in billions of dollars selling infrastructure. The cloud companies sell customized and managed versions of open infrastructure. The vendors I reference making separation kernels, safety-critical runtimes, and certifying compilers are providing benefits you can’t get with most open code. Moreover, stuff in that last sentence costs more to make both in developer expertise and time.

                                                                    I think suppliers should keep experimenting with new licenses for selling infrastructure. These new licenses fit that case better than in the past. If not open, then shared source like Sciter has been doing a long time. I’d still like to see shared source plus paying customers allowed to make unsupported forks and extensions whose licenses can’t be revoked so long as they pay. That gets really close to benefits of open source.

                                                                    1. 1

                                                                      Of course there’s still companies selling specialized, big, serious things. But FOSS infrastructure has largely won outside of these niches. Linux is everywhere, even in smart toilets and remote controlled dildos :D Joyent has open sourced their whole cloud stack. Google has open sourced Bazel, Kubernetes, many frontend frameworks… Etc. etc.

                                                                      shared source plus paying customers allowed to make unsupported forks and extensions whose licenses can’t be revoked so long as they pay

                                                                      IIRC that’s the Unreal Engine 4 model. It’s.. better than hidden source proprietary I guess.

                                                                      separation kernels, safety-critical runtimes, and certifying compilers are providing benefits you can’t get with most open code

                                                                      I’ve heard of some of these things.. but they’ve been FOSS mostly. NOVA: GPLv2. Muen: GPLv3. seL4: mix of BSD and GPLv2. CompCert: mix of non-commercial and GPLv2.

                                                                      1. 4

                                                                        “ But FOSS infrastructure has largely won outside of these niches. “

                                                                        Free stuff that works well enough is hard to argue with. So, FOSS definitely wins by default in many infrastructure settings.

                                                                        “but they’ve been FOSS mostly. NOVA: GPLv2. Muen: GPLv3. seL4: mix of BSD and GPLv2. CompCert: mix of non-commercial and GPLv2.”

                                                                        They’ve (pdf) all been cathedral-style, paid developments by proprietary vendors or academics. A few became commercial products. A few were incidentally open-sourced with one, Genode, having some community activity. seL4 may have some. Most seL4-based developments are done by paid folks that I’ve seen. The data indicates the best results come in security-focused projects when qualified people were paid to work on the projects. The community can do value-adds, shake bugs out, help with packaging/docs, translate, etc. The core design and security usually requires a from core team of specialists, though. That tends to suggest paid models with shared source or a mix that includes F/OSS are best model to incentivize further development.

                                                                        “and remote controlled dildos :D “

                                                                        There’s undoubtedly some developer that got laid off from their job shoving Windows CE or Symbian into devices that were once hot who dreamed of building bigger, better, and smarter dildos that showed off what their platforms had. The humiliation that followed wasn’t a smiling matter, Sir. For some, it may have not been the first time either.

                                                                        1. 2

                                                                          cathedral-style, paid developments by proprietary vendors or academics

                                                                          Yes, the discussion was about licensing, not community vs paid development. For this kind of project, I don’t see how non-FOSS shared source licensing would benefit anyone.

                                                                          1. 2

                                                                            Individuals outside business context could use, inspect, and modify the product for anywhere from cheap to free. Commercial users buy a license that’s anything from cheap to enterprise-priced. The commercial use generates revenues that pay the developers. Project keeps getting focused work by talented people. Folks working on it might also be able to maintain work-life balance. If 40-hr workweek, then they have spare time and energy for other projects (eg F/OSS). If mix of shared-source and F/OSS, a percentage of the funds will go to F/OSS.

                                                                            I think that covers a large number of users with acceptable tradeoffs. Harder to market than something free. The size of the security and privacy markets makes me think someone would buy it.

                                                                  2. 3

                                                                    They aren’t today.

                                                                    But yesterday, CockroachDB was open-source software.

                                                                    1. 6

                                                                      Yeah people love free stuff and not paying for it.

                                                                      1. 4

                                                                        Well, most of the free stuff I have access to is reasonably priced.

                                                                        1. 2

                                                                          Ok, I meant to say not paying what it is worth (draining the producers).

                                                                        2. 6

                                                                          Yes, people love getting things for free.

                                                                          Cockroach Labs likes getting things for free, but has decided that they don’t like giving things away for free. This is a choice they have the legal right to make, of course, but that doesn’t necessarily make it the right decision.

                                                                          From a business perspective, it’s a very bad sign. A company suddenly switching from open source to proprietary/“source available” is usually a company where the vultures are already circling. And mostly it indicates a fundamental problem with the business model; changing the license like this doesn’t fix that problem, and in fact can’t fix it. If demand for CockroachDB is significant enough, other people will fork from the last open-source release and keep it going. If demand for it isn’t significant enough, well, they won’t. And either way, Cockroach Labs probably won’t make back what the VCs invested into it.

                                                                          From a software-ecosystem perspective, it’s more than a bit hypocritical. Lots of people build and distribute permissive-licensed software, and Cockroach Labs has, if not profited (since they may not be profitable) from it, at least saved significant up-front development cost as a result. If what they wanted was a copyleft-style share-and-share-alike, there were licenses available to let them do that (which, from a business perspective, still would not have saved them). But that’s not really what they wanted (and by “they” I mean the people in a position to impose decisions, which does not mean the engineering team or possibly even the executive team). What they seem to have wanted was to be proprietary from the start, and therefore to have absolute control over who was allowed to compete with them and on what terms. There is no open-source or Free Software license available which achieves that goal; the AGPL comes closest, but still doesn’t quite get there.

                                                                          And there simply may not have been a business model available for CockroachDB that would satisfy their investors, but Cockroach Labs was founded at a time when it already should have been clear – especially to a founding team of ex-Googlers – where the market was heading with respect to managed offerings for this type of software. They could have tried other options, like putting more work into integrating with cloud providers’ marketplaces, but instead they knowingly signed up to get their lunch eaten, and do in fact appear to have gotten their lunch eaten.

                                                                          1. 9

                                                                            Cockroach Labs likes getting things for free, but has decided that they don’t like giving things away for free.

                                                                            You are hinting that Cockroach Labs are trying to act as freeloaders while ignoring the real elephant in the room: SaaS providers.

                                                                            1. 0

                                                                              You are hinting that Cockroach Labs are trying to act as freeloaders while ignoring the real elephant in the room: SaaS providers.

                                                                              I’m pointing out the simple fact that Cockroach Labs wants to have the right to build a business on open-source software, but wants to say that other entities shouldn’t have that same right. That’s literally what this comes down to, and literally what their new license tries to say.

                                                                            2. 3

                                                                              Cockroach Labs likes getting things for free, but has decided that they don’t like giving things away for free.

                                                                              That’s an unfair characterization. The code they use is made by people who like giving stuff away for free. If permissive, they’ve already chosen a license that lets commercial software reuse it without giving back any changes. If copyleft under GPL-like license, there’s already bypasses to sharing like SaaS that they’re implicitly allowing by not using a strong license. They’re also doing this in a market where most users of their libraries freeload. They then release the code under that license knowing all this for whatever reasons they have in mind.

                                                                              And then Cockroach Labs, whose goal is a mix of profit and public benefit, uses some of the code they were given for free. They modify the license to suit their goals. Each party contributing code should be fine with the result because each one is doing exactly what you’d expect with their licenses and incentives. If anything, CockroachDB is going out of their way to be more altruistic than other for-profit parties. They could be locking stuff up more.

                                                                              1. 1

                                                                                They approve of the “take open-source software and build a business on it without financially supporting all the authors in a sustainable way” approach when it’s them doing it with other people’s software. They don’t approve when it’s Amazon doing it with CockroachDB. You can try to spin it, but that’s really what it comes down to.

                                                                                And they want control over who’s allowed to compete with them and who’s allowed to use their software for what purposes. That’s fundamentally incompatible with their software being open source, and they’ve finally realized that, but it’s a bit late to be suddenly trying to change to proprietary.

                                                                                1. 2

                                                                                  I agree it won’t be open source software when they relicense it. I disagree that there’s any spin. I tell people who want to force contributions or money back to put it in their license with a clause blocking relicensing to non-OSS/FOSS. Yet, the OSS people still keep using licenses or contributing to software with such licenses that facilitate exactly what CockroachDB-like companies are doing.

                                                                                  I don’t see how it’s evil or hypocritical for a for-profit company acting in self-interests to use licensed components whose authors choose knowing it facilitates that. It wasn’t the developers only option. There was a ton of freeloading and hoarding of permissively-licensed components before they made the choice. Developers wanting contributions from selfish parties, esp companies, should use licenses that force like AGPL or Parity. The kinds of companies they gripe about mostly avoid that stuff. This building on permissive licensing and relicensing problem has two causes, not one.

                                                                                  Note: There’s also people that don’t care if companies do that since they’re just trying to improve software they and other people use. Just figured I should mention that in case they’re reading.

                                                                                  1. 2

                                                                                    I don’t see how it’s evil or hypocritical for a for-profit company acting in self-interests to use licensed components whose authors choose knowing it facilitates that.

                                                                                    It’s not “evil”. But it is at least a bit hypocritical to decide that you’re OK doing something yourself, but not with other people doing it too.

                                                                                    Given their intended business model, CockroachDB probably should have been proprietary from the start. Would’ve avoided this specific headache (but probably still wouldn’t have avoided the problem with the business model they chose).

                                                                                    1. 1

                                                                                      “But it is at least a bit hypocritical to decide that you’re OK doing something yourself, but not with other people doing it too.” “CockroachDB probably should have been proprietary from the start”

                                                                                      “three years after each release, the license converts to the standard Apache 2.0 license”

                                                                                      Amazon isn’t giving all their stuff away after three years under a permissive, open-source license. What we’re really discussing is a company that will delay open-sourcing code by three years, not just license proprietary software. Every year, they’ll produce more open-source code. It will be three years behind the proprietary, shared-source version everyone can use except for SaaS companies cloning and selling their software. You’re talking like they’re not giving anything back or doing any OSS. They are. It’s just in a way that captures some market value out of it.

                                                                                      In contrast, the people making OSS dependencies usually aren’t doing anything to capture business value out of the code. If anything, they’re not even trying to. They’re directly or indirectly encouraging commercial freeloading with a license that enables it instead of using one that forbids it. So, CockroachDB doesn’t owe them anything or have any incentive to pay. Whereas, CockroachDB’s goal is to make profit on their own work. The goal differences are why there’s no hypocrisy here. It would be different if the component developers were copylefting or charging for CockroachDB’s dependencies with the company not returning code or pirating the components.

                                                                                      1. 1

                                                                                        but not with other people doing it too

                                                                                        Have you heard anyone at Cockroach Labs say this? Wouldn’t they be able to offer their service based on 3 year old versions of every piece of OSS they use? It seems to me this license would work fine transitively, so there’s no hypocrisy involved.

                                                                        3. 3

                                                                          If they have to pay dozens or, more likely, hundreds of separate license fees for the privilege of using all the other open-source components they depend on?

                                                                          Sounds good to me. They have had millions of dollars of funding, they can easily pay some money to people who deserve it.

                                                                          1. 1

                                                                            Or we’ll get something like ASCAP, but for software instead of music.

                                                                            1. 7

                                                                              As a long time ASCAP member, I hope we could do better.

                                                                          2. 3

                                                                            They should probably provide some examples of what they consider a CockroachDB service, vs a service that’s using CockroachDB underneath.

                                                                            I believe I read somewhere that they considered the user having the ability to freely modify the schema as being “as a service”

                                                                            Edit: found it

                                                                            1. 2

                                                                              The user of a “CockroachDB as a Service” company, that is (not just a user of CockroachDB in general)

                                                                              1. 2

                                                                                Thx @trousers @johnaj for clarification. I guess, for me this ‘muddied’ waters so to speak.

                                                                                Say, hypothetically, I have a SaaS that allows my customers to upload logs from IoT devices, and schema (in my DSL) explaining the data, and some SQL-like (but can also be my DSL) queries about their data.

                                                                                My service is to provide the results of the queries back to them via dashboards/PDFs etc. The hypothetical SaaS charges for that service (and hopes, in some distant future, to make net profit)

                                                                                Underneath, I want to use CockroachDB.

                                                                                When customer provides their data explanation in DSL, I actually translate it into CockroachDB schema, and create materialized and non-materialized views (I do not know if the DB supports this, let’s assume – it does). I do that so that customer’s queries can be translated to database statements more easily (and run efficiently).

                                                                                So I have a SaaS service, and allow customers (although indirectly) to create schema specific to their data in my database.

                                                                                Will I need license?

                                                                                From what I am reading right now, I will.
                                                                                This is not good or bad – but I hope, then, Postgres would never adapt BLISS.

                                                                                May be I am wrong .. so hope to hear what others think.

                                                                                1. 2

                                                                                  Will I need license?

                                                                                  No. I think anything that is indirect (they are not using the wire protocol or directly issuing queries) is not going to require a license.

                                                                                  That said, I can see how your example is demonstrative of a possible problem – if Amazon created like a graphQL layer in front of it that just sort of translated to and from CockroachDB would that give them safety license wise – and I think it would.

                                                                                  1. 3

                                                                                    Right, there is ambiguity about the ‘type or class’ of layers that when added, will not require a license vs layers that will require a license.

                                                                                    If I correctly understand the spirit and the intent of their license, I actually think CockroachDB should protect themselves, and specify that following layers:

                                                                                    a) security + access control layers

                                                                                    b) performance + scalability layers

                                                                                    c) General (not domain specific) query meta language layers

                                                                                    d) Deployment layers (eg ansible roles on top)

                                                                                    e) Hardware layer underneath (eg optimized FPGA/GPUs)

                                                                                    If a SaaS business added on top of their DB only the above layers in essense, and then sold as SaaS together with CocroachDB – they would need the BLISS license.

                                                                                    Also, at the end of the day, their license may end up being, still, free for some businesses that fall under BLISS – but I think, CockrouchDB team and their investors, want to be in control of that decision…

                                                                                2. 1

                                                                                  Right. Good clarification.

                                                                              1. 2

                                                                                Why? Which part?

                                                                              1. 2

                                                                                Here’s a link to the documentation for String#b:

                                                                                b → str

                                                                                Returns a copied string whose encoding is ASCII-8BIT.

                                                                                1. 1

                                                                                  Yup the documentation already exists. I just wanted to share what I learned and found interesting :)

                                                                                  I added note about it in the post.

                                                                                1. 2

                                                                                  disabling q: and ctrl-A / ctrl-X is something I should do. :) I live in fear of ctrl-A/X ing some magic number some day. I know I’ve done it before and caught it.

                                                                                  1. 5

                                                                                    That fear is not unreasonable. If you’re using <C-x> and <C-a>, then you probably also want to set the following:

                                                                                    set nrformats-=octal
                                                                                    

                                                                                    Explanation from Practical Vim (which I recommend every Vim user buys):

                                                                                    What follows 007? No, this isn’t a James Bond gag; I’m asking what result would you expect if you added one to 007.

                                                                                    If you answered 008, then you might be in for a surprise when you try using Vim’s <C-a> command on any number with a leading zero. As is the convention in some programming languages, Vim interprets numerals with a leading zero to be in octal notation rather than in decimal. In the octal numeric system, 007 + 001 = 010, which looks like the decimal ten but is actually an octal eight. Confused? If you work with octal numbers frequently, Vim’s default behavior might suit you. If you don’t, you probably want to add the following line to your vimrc:

                                                                                    set nrformats=
                                                                                    

                                                                                    This will cause Vim to treat all numerals as decimal, regardless of whether they are padded with zeros.

                                                                                    1. 5

                                                                                      You don’t have to change nrformats yourself if you explicitly opt into Vim’s updated defaults (available as of Vim 8):

                                                                                      " opt into Vim 8’s new defaults
                                                                                      " see `:help defaults.vim`
                                                                                      unlet! skip_defaults_vim
                                                                                      if filereadable($VIMRUNTIME . '/defaults.vim')
                                                                                      	source $VIMRUNTIME/defaults.vim
                                                                                      endif
                                                                                      

                                                                                      The file $VIMRUNTIME/defaults.vim will adjust the nrformats setting for you:

                                                                                      " Do not recognize octal numbers for Ctrl-A and Ctrl-X, most users find it
                                                                                      " confusing.
                                                                                      set nrformats-=octal
                                                                                      
                                                                                  1. 27

                                                                                    One little tip I picked up from Practical Vim which I never see discussed is setting global marks.

                                                                                    Open up your vimrc

                                                                                    vim ~/.vimrc
                                                                                    

                                                                                    Create a global mark

                                                                                    mV
                                                                                    

                                                                                    Now anytime you’re in a vim session, do this:

                                                                                    `V
                                                                                    

                                                                                    and you will immediately be taken to your vimrc.

                                                                                    1. 4

                                                                                      +1 for Practical Vim - it’s one of my favorite technical books ever. Little bites of practice to help you build your skills. Can’t say enough good things about it.

                                                                                      1. 4

                                                                                        I hadn’t know that was an option. For comparison, this is the mapping I had already defined to jump to my .vimrc, using the proper cross-platform $MYVIMRC variable:

                                                                                        " edit vimrc
                                                                                        nnoremap <Leader>ev :edit $MYVIMRC<CR>
                                                                                        " edit gvimrc
                                                                                        nnoremap <Leader>eg :edit $MYGVIMRC<CR>
                                                                                        

                                                                                        Edit: Oh, and the article itself suggests defining a command :Vimrc for the same task:

                                                                                        command! Vimrc :vs $MYVIMRC
                                                                                        
                                                                                        1. 3

                                                                                          Thank you

                                                                                          1. 3

                                                                                            thank you

                                                                                          1. 2

                                                                                            Recently I have been automating away some small annoyances with my computer experience.

                                                                                            Yesterday I wrote a browser user script in Violentmonkey to solve a small problem that I had wanted to solve for years. It turned out to be easier to write than it would have been when I first thought of it, thanks to the introduction of the URL API for manipulating the search parameters in URLs. It was also quicker to create a new script in Violentmonkey than it had been in older versions of Greasemonkey, back when scripts were saved as local .js files.

                                                                                            The problem my script solves is that on various phpBB forums, when I search across threads for something and then click on one of the result threads, the resulting page visually highlights every use of the search term I typed. This phpBB feature is worse than useless. Usually my search term is the title of a work, and the title gets repeated throughout the thread, so the highlighting is distracting rather than helpful. I had figured out that manually deleting the &hilit=search+term search parameter from the URL would delete, but it was a pain to do this manually for every search result thread I opened.

                                                                                            The script, which I have only enabled on viewtopic.php pages in phpBB forums I visit, removes the hilit parameter if it’s present (and also the useless sid parameter, making the URL easier to read). This is all the code I ended up needing, apart from the user script metadata comment block:

                                                                                            const currentLocation = window.location;
                                                                                            
                                                                                            const url = new URL(currentLocation.href);
                                                                                            const originalSearch = url.search;
                                                                                            url.searchParams.delete('hilit'); // remove distracting in-page highlighting
                                                                                            url.searchParams.delete('sid'); // simplify URL by removing useless “session ID”
                                                                                            const simplifiedSearch = url.search;
                                                                                            
                                                                                            if (simplifiedSearch !== originalSearch) {
                                                                                              // in this case, the `delete` calls on `url` have mutated it, so its `href` is different
                                                                                              window.location = url.href;
                                                                                            }
                                                                                            

                                                                                            Apart from writing a user script, I also found some existing Firefox add-ons to solve problems with web pages:

                                                                                            And I wrote some Keyboard Maestro macros for problems outside of the browser:

                                                                                            • Quickly toggle the MacBook Pro’s Touch Bar between showing App Controls and the Expanded Control Strip, by automatically opening System Preferences to the correct pane and clicking on the appropriate menu. I still need to click the desired menu option myself, but I automated the quitting of System Preferences after this.
                                                                                            • In the online multiplayer game Rocket League, type a shortcut such as ⌘R and then a letter such as S to quickly send a preset message over team chat such as “I have Spikes”. This makes it practical to communicate during a match even without voice communication.
                                                                                            • In the iTunes media player, clear the Up Next queue of tracks with a keyboard shortcut. I improved my previous solution by making the macro visually inspect the screen to make sure iTunes is in the correct state before trying to send keystrokes to it. That means I can safely trigger the macro even if I’m not sure that the Up Next queue has any tracks in it.

                                                                                            Of course, it took more time to write these automations than I will save by using them. But these solutions aren’t about saving time in an absolute sense, they are about preserving flow. I spent some free time to save me a bit of time in situations when I know I will be in a hurry. Time is more precious in such situations.

                                                                                            1. 2

                                                                                              Sounds more like blogs than a wiki? What would be wrong with WordPress?

                                                                                              1. 2

                                                                                                Personal blogs have the same problems that public personal wikis are described as having in the OP. A single site specifically for solutions to tech problems that gave users their own namespace would have these advantages over independent blogs:

                                                                                                • some better discoverability, network effects
                                                                                                • no need to set something up yourself

                                                                                                Additionally, a website specifically for tech solutions could allow each user’s posts to share the same hierarchy of tags, so that one can more easily find all tips about a specific tool such as Bash or Ruby on Rails.

                                                                                              1. 3

                                                                                                Copied for those whose screen would otherwise be obscured by floating top and bottom bars:

                                                                                                ===

                                                                                                This time I am not writing an interview or a technical post. I am writing about a series of events that took place in the context of the conference organization which exposed me to a situation that is now out of control despite my efforts to avoid conflict. The impact these events are having oblige me to write this article as a tool to clarify what happened.

                                                                                                I expect this specific case illustrates the type of things that might happen to anyone out there trying to create something for the community. I hope the article it is not too boring, I want to give more precise information but I can’t yet. In the end, the truth comes out and people show their true colors.

                                                                                                Reach me via twitter at @unbalancedparen if you have any comments.

                                                                                                Why organize a conference?

                                                                                                Organizing a conference involves a great expenditure of time and money. True, sponsors make up for a big part of financing, and ticket sales help. Still, conferences tend to net to a loss.

                                                                                                Then why do we do it? Because they are also an enormous source of satisfaction. For a couple of days, conferences generate a vibrant community, where people have the opportunity to grow and learn together, renew passion for their work and create relationships that will evolve in new projects that will last far beyond the scope of the conference.

                                                                                                What are the usual problems that appear while organizing a conference?

                                                                                                Anyone that has organized an event of this scale knows how hard it is to sell tickets, publicise, organize logistics, get sponsors, look for accomodation, buy airfare tickets, coordinate catering, pay for insurance, arrange stands and manage audio and video recording. Also, differences within the organizing team and diverse points of view will most likely appear. Basically, “whatever can go wrong, will go wrong”, and this is quite a challenge during the preproduction and during the conference itself.

                                                                                                What has been our experience so far?

                                                                                                Until now, my team and I have organized several meetups and participated in lots of conferences; but only last year we took the plunge and organized our first software conference, called BuzzConf. This will be the second time we started a new telecommunication conference called Zruput.

                                                                                                We learned how to deal with the unexpected: flights were cancelled, the catering messed up the gluten-free food, the cell phone of one of our speakers went missing during the conference, the audio and video recording of the talks failed and some sponsors paid months after the conference. Despite these inconveniences, which are normal, it was an incredible experience and we enjoyed it greatly.

                                                                                                We were able to bring people who develop Linux’s kernel, who are part of the Rust language core team, who make important contributions to distributed systems, people who launch satellites, among other things. The people we met and the things we learned broadened our horizons. This year we are expecting computer scientists that were involved in the design of Haskell, that created an amazing package managers and that implemented Python packages, used by hedge funds, for statistical modeling. We know we are privileged.

                                                                                                What happened this year?

                                                                                                My team and I were contacted by different people to warn us that they were uncomfortable with the participation of a speaker and her boyfriend in our conference. Sadly, I can’t go into details until the legal issue is over. This communication took us by surprise since we had performed a basic background check on the chosen speakers to avoid these kinds of issues. Like many of you who are reading this article, I am skeptical of what people I don’t know say over the Internet. I initially hesitated to do something based upon these comments when my team and I discussed the matter.

                                                                                                When you are in a difficult situation, the most reasonable thing to do is to search for the help of those who can provide knowledge and experience, so we consulted on what we should do with different people on what to do. Several people who knew both of them confirmed that they had had problems with them in the past. We also talked with the organizers of other conferences and with dev that are part of gender groups focalized in technology and all of them recommended us to take distance from them.

                                                                                                This was how we finally decided that the best thing to do was to inform the speaker she wasn’t going to be a member of the conference. It was a difficult decision in which we prioritized the participation of the public that had reached out to us while also knowing that many people, especially women, wouldn’t come to the conference if we did nothing about this situation. Neither I nor the rest of the organization wanted to create a problematic situation, we were just trying to solve a difficult conflict in the best possible way.

                                                                                                Therefore, on April 25, 2019, I, along with an employee of my company, communicated to her our decision in a meeting held in a place of her choice. She took it badly. We knew it was hard news to take on. Nevertheless, we didn’t expect a threatening reaction followed by several emails, Twitter DMs, persistent phone calls and Whatsapp messages. She even texted my girlfriend, one of the organizers of the conference, whose telephone number is not public and wasn’t given to her at any moment. At the same time, she started contacting other speakers of the conference.

                                                                                                Problems escalate

                                                                                                A few hours later, I was contacted via Whatsapp by a person who told me he needed to meet me to talk about the conference because he had a big problem which could be solved by talking. That person identified himself. I didn’t know who he was and I replied that I had no problem speaking but I didn’t know how I could help him.

                                                                                                At around the same time I got a message from an employee of my company who told me that the same person had contacted a speaker of our conference and requested a meeting with him. The speaker confirmed this to me and told me he had felt uncomfortable with the way in which this person had written to him. When this happened, I asked around and acquaintances of mine told me that this person was the boyfriend of the speaker we had decided wouldn’t be a part of the conference.

                                                                                                At this point I found out this man is an internationally renowned information security specialist. He found vulnerabilities in known operating systems and privacy-oriented messaging platforms. I was learning all this in the spur of the moment.

                                                                                                It was late in the day, but before I went to sleep I found an anonymous threat which stated private information about me would be published. I can’t confirm who the author was, as it was anonymous.

                                                                                                Conference encounter

                                                                                                Two days later on April 27th, a software conference took place that has no relationship with the conference I am organizing. I went there to meet two acquaintances. After meeting with them I decided to tour around and see the different stands of the conference. At that precise moment I saw the former speaker. She was calling the security of the event and using her cellphone to record me. She yelling that I was at the conference to stalk her, and that I was harassing her and following her. I never thought something like this could ever happen. It is worth noting that, at this point, I had only talked over the phone with her once, met her in person also once and, as I stated before, I had received several persistent communications on her. Now she was accusing me of following her to her work, to a conference and of being a stalker. One of the organizers of this conference intervened and let her yell at me instead of trying to solve the issue. A few days after I learned he was a close friend of her and her partner.

                                                                                                I had to leave the conference, depressed by the whole situation. Luckily, my girlfriend and other friends were there to help me. I was just attending a conference and was subjected, along with my acquaintances, to a very unpleasant moment by being unfairly accused by a person I didn’t know.

                                                                                                They went public

                                                                                                After this incident, a friend gave me a heads up that the boyfriend of this person had taken to Twitter to post that I was harassing and threatening his girlfriend. He even suggested that I was personally attacking him through his girlfriend. He later deleted this tweet but I managed to save screenshots.

                                                                                                After this I felt powerless and despaired. I never imagined that telling someone she would not speak at the conference would expose me and my team to this sort of situation. Several people contacted us to ask what was going on and why I was being accused of harassing a woman. I had to give explanations to our sponsors. Being accused like that caused me harm. He had already gone public with his version, so I decided to tell my side of the story on Twitter too. I needed people to know the facts: we had contacted a speaker to tell her she was no longer a part of the conference, we were harassed and I was the victim of a false accusation that had a commercial impact for me. I had to talk with clients, sponsors and employees to explain what was happening. Due to all of this, I decided to file the corresponding lawsuits.

                                                                                                While I was sleeping, early morning May 4th, my phone began to ring incessantly for minutes with notifications. It was an employee’s phone sending messages via Signal, for several minutes. I called him to ask what was going on. He said he hadn’t touched his phone. I asked him to turn off his phone, but the messages kept coming. At the same time, another employee called me to tell me he was getting those messages too and wanted to know what was happening. In the years I have been using Signal, this never happened to me nor do I know of similar cases, but I have talked with security specialists that pointed me to how this might have happened.

                                                                                                This is just one of many similar issues I had to go through since then, but this article would become long and boring if I listed them all, and I think you already get the idea.

                                                                                                What is the best way to act in these cases?

                                                                                                Sometimes, our initial reaction to this type of situation is keeping quiet and hope it goes away. As soon as you start talking you start being judged and getting deep into even a bigger problem. These are the reasons why we hesitated within my team to make this situation public. We didn’t want to waste time, energy and resources on this affair. Generally, the best scenario is to talk with the involved parties, to cooperate and to seek a solution that doesn’t make the problem bigger. This isn’t always possible. In this case they went public and accused me and I had to explain what happened. I had to explain to sponsors, clients, employees and other members of the community what happened.

                                                                                                What’s the legal status of the conflict?

                                                                                                I’m currently analyzing with different attorneys and advisers the steps to take next. One of the pieces of advice they gave me were not to give any names to avoid escalating the situation even further. It pains me to do so, because I feel I need to warn the community so that this doesn’t happen to more people. But I understand this is the way things work and right now I need to trust that the justice system in my country will do its work. Therefore, I will take the necessary legal actions to bring light to this situation, and I will request the legal system to publish all necessary documents to prove I acted with integrity at all times.

                                                                                                Why is it important to create safe and diverse cooperation spaces?

                                                                                                Some people consider that software conferences are focusing too much on inclusion and diversity. What they want is for conferences to be exclusively technical. This makes sense only in abstract. The problem with this is that they aren’t taking into account that many people can’t partake in the way they could and would like to. There is no way of making a technical conference if some people feel insecure or uncomfortable. This is why inclusion and diversity are essential in these kinds of events, as well as the participation of the groups that promote these values.

                                                                                                We know that hostile environments are often generated where harassment and uncomfortable situations make women and minorities step aside. It is important to generate a space where everybody, no matter what gender, ethnicity, religion or ideology, is able to share knowledge in a friendly, pleasant environment with a collaboration spirit. There are several ways to achieve this. One of them is to work along gender and minority technology groups, which are doing an excellent work in promoting bigger diversity, and cooperate with them. Giving discounts to those minorities that have less resources is another way. It is also necessary to be attentive towards potential conflict situations that may occur so we can solve them by following a code of conduct.

                                                                                                This year, only 2 of the 9 speakers in our conference will be women. The conference is still really behind its gender equality goals in this sense. We are working with different women’s groups to improve. I am sure that we will do better in the following years.

                                                                                                How will we move forward?

                                                                                                Today, we are working to leave all this behind us, but since there are legal complaints, this will probably take more time, more money and more energy.

                                                                                                Being involved in situations like this is part of the risk one takes when organizing a conference and facing a greater deal of public exposure. It was probably naive of me not to consider these kind of things could happen. I actually believed that the hard part of organizing a conference was the logistics, but I learned that sometimes the hardest part is the human factor.

                                                                                                The best way to face this type of situation is to always be faithful to the code of conduct, not give in to undue pressure and consult groups dedicated to ethics, gender and minorities in technology because they know the most about these issues. Also, to lay things out in the open, speak up and not let there be a taboo is essential to prevent other people to go through the same ordeal.

                                                                                                Finally, I would like to thank everybody that contacted us. In times like these, those gestures are worth a lot.

                                                                                                1. 5

                                                                                                  At least reader mode of firefox removes them?

                                                                                                  1. 2

                                                                                                    that’s good

                                                                                                  2. 2

                                                                                                    The Make Medium Readable Again browser extension removes the overlays while preserving the styling of the page.

                                                                                                  1. 0

                                                                                                    It seems like everything this does could be done with aliases, unless this is really just setting up some aliases for you in the background..

                                                                                                    1. 1

                                                                                                      It works by defining shell scripts: git-toolbelt on GitHub. Some of those scripts (like git-stage-all) could have been done with aliases, but others (like git-undo-commit) are more complicated, due to supporting flags or doing error checking.

                                                                                                      1. 1

                                                                                                        git-undo-undo commit is literally doing either git reset @~1 or git reset --hard @~1. You can create an alias for git reset @~1, call it gr or something, then just gr --hard for the hard reset case. You could even pass more flags to it! (provided git-reset supports it). The script here isn’t really doing any meaningful error checking, since git will complain if you pass an unsupported flag. It may actually make it harder for folks since now they have to contend with shell errors instead of errors from git itself (which are arguably better, because git knows you want to use git while shells don’t know what you might be trying to do)

                                                                                                        1. 1

                                                                                                          I didn’t mean to imply that git-undo-commit, specifically, does error checking. I was referring to some of the other “more complicated” scripts that do error checking. Both git-shatter-by-file and git-sha do sanity checks of their results before exiting.

                                                                                                          The closest alias to git-undo-commit would actually be git reset --soft HEAD~1. The default is --mixed; the script sets --soft by default. If you named that alias undo-commit, the only difference would be accepting --hard instead of -f.

                                                                                                          I like the idea behind git-undo-commit: providing more intuitive names for Git actions. --force could be seen as a superior name to --hard because it is more consistent with other Git commands. But you are right that this implementation is lacking. It should pass through additional flags as you said, and I think it should accept --force as well as -f.

                                                                                                    1. 5

                                                                                                      I bet there aren’t a lot of Firefox extension developers remaining to be affected by this. I wrote an extension for Firefox 3.5 in 2007, and was able to keep it working with minor changes until Firefox 56 (2016, IIRC). I gave up on jumping through all their hoops after that point - first they disallowed self-hosted add-ons, then required code reviews by Mozilla staff for add-on approval and automated code checks prior to making each new version public. Random changes in their code checking would get an add-on banned with no warning. These recent changes are piling on to an already over-encumbered, unyielding and ever-changing process. Super frustrating.

                                                                                                      1. 1

                                                                                                        Self-hosted add-ons? Does that mean I can’t create an add-on that only I use?

                                                                                                        1. 2

                                                                                                          From what I remember, you can create an add-on that only you use, but you have to upload it to Mozilla to get it scanned for threats and then signed before Firefox will accept it. Uploading your add-on to get it signed is separate from uploading it to be published on AMO.

                                                                                                          There are a few alternatives that don’t involve signing. You can visit about:debugging and temporarily install any add-on you like, but it will be deactivated when you restart the browser. Or you can run Firefox Developer Edition or Firefox Nightly and then disable signature verification of all add-ons, at the risk of possibly installing a fake add-on later.

                                                                                                      1. 3

                                                                                                        Not sure if “however you like” is correct, since Black hardly has any styling options available. :)

                                                                                                        1. 17

                                                                                                          I assume the title, like Black itself, is a reference to the Henry Ford quote, “Any customer can have a car painted any color that he wants so long as it is black.”

                                                                                                          1. 3

                                                                                                            I am happy with yapf

                                                                                                            1. 2
                                                                                                          2. 1

                                                                                                            Well if it’s PEP8/pycodestyle compliant, there are very few formatting options to begin with (hopefully it lets you turn off long lines. That’s the only one everyone hates :-P)