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. 6

                              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

                                      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


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


                                    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

                                                          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)

                                                          1. 2

                                                            If this new guide is supposed to be a replacement for Better Specs, it’s a pity that the Better Specs website doesn’t link to it. The Better Specs website www.betterspecs.org feels much more authoritative than the new RSpec Style Guide at github.com/rubocop-hq/rspec-style-guide. This is because of Better Specs’s nice styling that is obviously custom-built for a style guide, as well as its dedicated domain and its past reputation for being the best style guide for RSpec. Even the syntax highlighting in code blocks on Better Specs looks better – the color for strings is noticeably different from the color for keywords, unlike on GitHub, so it is easier to read the names of examples and contexts.

                                                            1. 3

                                                              Sounds like it doesn’t try to avoid redoing redundant work. Is this right?

                                                              1. 2

                                                                That’s right; just isn’t a replacement for make, it’s a replacement for those little pseudo-scripts I used to keep in my shell history.

                                                                1. 1

                                                                  Does that mean that you’ll need make to build the project, and then just to run commands?

                                                                  1. 2

                                                                    In the Further Ramblings section at the end of the README, the author suggests using just to trigger all commands, including build commands, in a language-agnostic way. They link to just’s justfile, which has a build command that runs cargo build. So yes, if you are writing code in an ecosystem for which Makefiles are the best, you might end up using just to call make.

                                                                    But if you don’t like that pattern, you could use just only for small projects that don’t need building (e.g. ones written in Ruby or Python). Or you can run all your commands with make by defining .PHONY targets in your Makefile.

                                                              1. 1

                                                                I emailed the author a comment to be edited into the page, as the page instructs, but I’ll also post it here, since I have no idea how long the author will take to perform that edit.

                                                                Ruby and avoiding accidental mutation

                                                                I think you characterize Ruby wrong in your Traits section. The reason my_uhoh.value changes and my_num doesn’t has nothing to do with copy semantics. Ruby passes both my_num and my_uhoh by reference – it doesn’t implicitly copy only the number as you claim. The reason my_uhoh.value changes is that the UhOh#floor method explicitly mutates @value = @value.floor.

                                                                I think your confusion is due to an assumption that Float#floor mutates the number it is called on. You think that my_num was only left unchanged because a copy was provided to nasty_function. In fact, #floor does not mutate the number. A demonstration in irb:

                                                                my_num = 0.5
                                                                # => 0.5
                                                                # => 0
                                                                # => 0.5

                                                                If floor mutated the number, I would expect it to be called floor! according to Ruby convention. That is why your example feels to contrived to me, despite your assurance that it is not. If I had written the UhOh class, I would have named the method floor!, and the bug never would have happened.

                                                                Apart from naming the method differently, if you wanted to achieve the same effect in Ruby as the Perl 6 rw trait that you demonstrate, you could call the #freeze method on the object after constructing it:

                                                                class Mutable
                                                                  attr_accessor :value
                                                                  def change
                                                                    @value += 1
                                                                mut = Mutable.new
                                                                # => #<Mutable:0x00007fc5ae26cc78>
                                                                mut.value = 3
                                                                # => 3
                                                                # => 4
                                                                # => 4
                                                                # => #<Mutable:0x00007fc5ae26cc78 @value=4>
                                                                # Traceback (most recent call last):
                                                                # …
                                                                # FrozenError (can't modify frozen Mutable)
                                                                # => 4

                                                                I called mut.freeze manually above, but you can even override .new so that #freeze is called automatically on every new instance of your object.

                                                                Anyway, that is a corrected description of how Ruby can help you prevent unintended mutation. It’s good that Perl 6 has a solution for that problem too.

                                                                Ruby and Smartmatch

                                                                This is a feature that is so inherently Perl that I cannot imagine it ever being implemented in another language.

                                                                In fact, Ruby has a very similar feature too – probably inspired by Perl, as many of Ruby’s features are. Ruby’s casewhen construct calls a custom operator === on each “when” expression to compare it to the “case” value. This sounds the same as your description of Perl 6 calling .ACCEPTS on the “when” expression to compare it to the “given” value.

                                                                Ruby’s #=== method (because operators are just method calls in Ruby) is defined for various types as doing some sort of matching – for example, equality for strings, inclusion for ranges, and matching for regexes. And it can be used for type matching as well. Thanks to the Module#=== implementation, MyClass === some_obj will return true only if some_obj is an instance of MyClass or one of its descendants. Ruby doesn’t have an object representation of function signatures, though, so you can’t check whether an object would be accepted as a parameter to a method as you demonstrated you can in Perl 6.

                                                                1. 13

                                                                  I had no idea this kinda thing even existed. It probably does make sense to disable it by default, as I’m not sure there is a good use case. But then again, you can achieve the same thing with JavaScript.

                                                                  1. 14

                                                                    IMO that makes this all the more pernicious - this is the kind of behavior people who go to the lengths of disabling Javascript are trying to avoid I’d think.

                                                                    1. 5

                                                                      That’s the thing: Google et al will try to track your clicks anyhow. They’ve always done that with Javascript and/or link rewriting – which works by default and has to be blocked on a site-by-site basis. You want them to do it with a standard feature instead because then you can block all of them the same way. But if they can expect the standard feature to be disabled by default then it’s useless to them and they’ll just keep right on doing what they were doing before. So for you to be able to meaningfully disable the standard click tracking feature, it must be enabled by default…

                                                                      I expect the whole idea to not work out in the long run because the incentive structure is metastable by a razor’s edge in the best case. It’s marginally more favourable but broadly similar to the Do Not Track header – which died a quiet death not long ago.

                                                                      1. 3

                                                                        You can still try to defend yourself: https://github.com/Rob--W/dont-track-me-google

                                                                        1. 2

                                                                          I use a different extension, “Avoid Google Search redirects” (Firefox Add-ons page). I hadn’t heard of the one you linked. There is probably no significant difference.

                                                                          1. 2

                                                                            … on a site-by-site basis, yes, as I already said. Getting them to use ping would mean there’d be no “try” about it and it’d be called “dont-track-me” instead of “dont-track-me-google”. And that is the point I was making – not that it’s impossible to defend yourself against the non-ping approaches. If they used ping exclusively, you’d have a cheap, reliable, broad defence, rather than the only intermittently reliable and hard-to-scale defences we have today.

                                                                          2. 3

                                                                            The Do Not Track header didn’t work out because it cost site authors to implement, and didn’t provide any direct benefit.

                                                                            This HTML5 link tracking costs site authors about the same as what they’re doing already (set up a server-side script to collect pings, swizzle elements on rendered pages), but provides them some benefits: it makes external links load quicker (because they don’t go through a redirection), so their site is more pleasant to use, and it doesn’t obscure the Referer header — which they don’t much care about for outgoing links, but they care very much about for incoming links.

                                                                            The fact that it can also be easily neutered by the browser is irrelevant to them, as long as not many installed browsers are doing it.

                                                                            1. 2

                                                                              It did provide some legal cover for tracking, so it did have some benefit, albeit a much weaker one. But that alone wasn’t its death knell. What did it in was when Microsoft flipped to sending it by default in their browsers, since that undermined its benefit (however weak) as a signal of conscious user intent.

                                                                              It had the same “asking sites to make their invasiveness easy to defend against by promising that users will have to consciously choose to defend themselves (which most won’t)” incentive structure. It was just worse – as I’d already said – for the reason you gave, that it was harder to implement than ping is, and had murkier benefits to site owners – which I skimmed over (as I was only referencing it tangentially as a parallel).

                                                                              I don’t expect ping to ever kill off or even broadly supplant non-ping click tracking techniques, even if it doesn’t vanish as quickly and completely as DNT did. I’m pretty sure it cannot serve its intended purpose because site owners will always have reason to agitate for less user control over it and users will always have reason to agitate for more, both of which undermine it – and I don’t see how that tug of war can ever settle into a stable configuration for long.

                                                                              1. 3

                                                                                What did [the Do Not Track header] in was when Microsoft flipped to sending it by default in their browsers, since that undermined its benefit (however weak) as a signal of conscious user intent.

                                                                                The second half of that sentence is partly wrong – the most important conscious user signal remained available. Advertisers lost a strong opt-out signal (DNT: 1 and DNT: null became indistinguishable), but the strong opt-in signal (DNT: 0) remained available and strong. Is opt-in required to track somebody, or is lack of opt-out sufficient? Advertisers were banally pushing for the latter, of course.

                                                                                ‘User consciously opts in to tracking’ is famously the standard that the GDPR requires. The IE 10 DNT kerfuffle pre-dates the GDPR. It took place in late 2012; in 2015 Microsoft announced it would go back to null-DNT by default; the GDPR was adopted on 14 April 2016, and became enforceable beginning 25 May 2018. If the GDPR had already been in place to give Microsoft’s ‘opt-out is the default’ stance extra, legal, force, that might have been interesting in ways that this margin is too narrow to contain are too off-topic to type out on my phone.

                                                                        1. 2

                                                                          A bit off-topic, but I love how it’s officially

                                                                          The Glorious Glasgow Haskell Compiler.

                                                                          1. 1

                                                                            Not quite – the alternate name is the “Glorious Glasgow Haskell Compilation System”. ¹ ²

                                                                          1. 11

                                                                            I like the argument about the intuitiveness of hashtagging and linking as a layer on top of plaintext, but couldn’t the same be done with bolding for example like **bold** i.e. the markup is not stripped.

                                                                            1. 9

                                                                              Good idea. You could do this with other formatting too, such as making # headers bigger while still showing the #s.

                                                                              You can see an example of this style of formatting in the screenshot of the Mou Markdown editor on its home page. The editor pane on the left shows some of this hybrid formatting. (To try it yourself, download the open-source MacDown editor.)

                                                                              Taken to its conclusion, this style of formatting is just really good syntax highlighting.

                                                                              1. 5

                                                                                and a really nice thing about it is you can copy and paste it just fine!

                                                                              2. 4

                                                                                That’s possible, but it still has the factor that you can accidentally invoke the markdown syntax. Let’s say, for example, that you want to place a shruggie onto a platform like this:

                                                                                If you do not implement escape characters at all, then you wind up with ¯\_(ツ)_/¯ where the anatomy is all visible, but the face is tilted sideways.

                                                                                If you do implement escape characters, and you hide the escape characters, then you wind up with ¯_(ツ)_/¯ the classic “missing arm” broken shruggie.

                                                                                If you implement escape characters, and show them, then you wind up with a correct ¯\_(ツ)_/¯. This is the outcome we want, but that policy is NOT generally good. I had to use escape characters extensively in this site, and I would not have benefited from such a policy.

                                                                                1. 3

                                                                                  You can accidentally invoke the hashtag syntax on Twitter, by using the number sign in front of a number as per normal (see post #1). All the rest of this is just a matter of degree.

                                                                                  1. 3

                                                                                    You can accidentally write an unintentional url, too. Twitter also makes it hard to write a url that will appear as text without mangling and truncation, so even knowing what will happen may not help.

                                                                                  2. 2

                                                                                    How about (sic)? I imagine it as an escape mechanism which nullifies the special formatting of whatever directly precedes it. And, it is already considered “transparent, not part of the text” by most English readers. (Does something like it exist for non-English readers?)


                                                                                    The robot prefers to be addressed as 345ART0.


                                                                                    The robot prefers to be addressed as 345*ART*0 (sic).

                                                                                    I will abstain from speculating about how to handle edge cases, like, a sentence that contains the names of ten robots…

                                                                                    1. 1

                                                                                      You could have it only format whole words. Then users can invent their own ad-hoc ._escaping_, or prepend with any other character to disable formatting. Sure, they then can’t format within words (I almost never do), but it avoids the inadvertent formatting problem.

                                                                                      Or have [formatting _not apply_ within square brackets] or some other infrequent character sequence.

                                                                                      I really like this whole concept, by the way.

                                                                                      1. 2

                                                                                        Or have [formatting not apply within square brackets] or some other infrequent character sequence.

                                                                                        Sadly that would go against markdown (or at least commonmark, to be exact), which I think is worth preserving, especially since it has proliferated itself to become the default limited-markup for websites. And compared to alternatives like bbcode or the markup wikis use, I find it a lot more comfortable.

                                                                                    2. 3

                                                                                      Yeah, that’s generally how Emacs handles styling (‘font-locking’) for Org-mode markup.

                                                                                      1. 2

                                                                                        If you have a look at the Ulysses app on macOS it does this. It’s a writing app that lets you write in markdown. But what it does is for instance for headings, it has a gutter on the left like a code editor which shows the heading level while still retaining the markdown syntax in the view and stying it based on the heading level selection or markdown. It also extends certains items with inline controls like images, etc…

                                                                                        You can see an example on their features page https://ulysses.app/features/ it’s a paid product though. I bought it years ago, then it went to subscription and the version I bought was left to rot and constantly crashed and got worse on subsequent versions of macOS.

                                                                                      1. 2

                                                                                        Reddit has a WYSIWYG editor now. It lets you switch between the “Fancy Pants Editor” (WYSIWYG HTML) and Markdown as you write your post, which I like – you can write in “preview mode” most of the time, then switch to Markdown temporarily when you want to type some tricky formatting.

                                                                                        The community hasn’t completely adjusted to it, though. Every now and then I see someone typing Enter twice between paragraphs as if they are typing Markdown, but in fact they are in the WYSIWYG editor. This means their text has a blank paragraph between each paragraph, which looks silly. The main cause of this is Reddit’s paragraph styling – their space between paragraphs is short enough that someone could think they only typed a newline.

                                                                                        1. 3

                                                                                          WYSIWYG editors have their own problems. I’ve had trouble getting the desired formatting out of Microsoft Word, and so has everyone else I’ve ever seen use it. A lot of people intentionally try to bypass Word’s auto-formatting features, in favor of just “typewriter-formatting” their text. It’s a real mess.

                                                                                          I guess part of it is that, for people who don’t want to spend time learning your app, it’s better to make something impossible than hard. If it’s impossible, then nobody does it, and you’re not expected to do it. If it’s hard, then other people are doing it, and now you’re expected to figure it out, too.