1. 10

    From the readme:

    You probably noticed the peculiar default line length. Black defaults to 88 characters per line, which happens to be 10% over 80. This number was found to produce significantly shorter files than sticking with 80 (the most popular), or even 79 (used by the standard library). In general, 90-ish seems like the wise choice.

    This is a table stakes deal breaker for me. I know, I know, I’m likely old fashioned. I prefer old school. :-)

    1. 5

      It is a default though, you can pass --line-length to it.

      1. [Comment removed by author]

        1. 4

          Honestly though, is your terminal window really 80 columns wide? And should outdated defaults matter?

          1. 3

            Yes, my terminal window is really 80 columns wide.

            I also have a source file where a single line of code is 250 characters (and no, it really can’t be broken up due to semantic constraints).

            So, what should be the minimum width of a terminal window?

            1. 1

              I actually prefer to code with a 80-wide terminal most of the time, because it tends to remind me to simplify my code more than I would otherwise :o

            2. 1

              I think 79 is better than 80, because 79 allows for a single-column ruler on the side of the window and stuff

              1. 1

                This is about the size of your code “viewport”, not of your terminal.

                3 columns are already used by my line length indicator in vim, but that number is really arbitrary too.

              2. 1

                departing from established standards because you feel like it is a pretty bad sign in general. as are --long-gnu-style-options, but that’s a different issue.

              3. 2

                I just counted the length of lines over 266 Lua files [1], calculating the 95th percentile [2] of line length. Only 4% had a 95 percentile of 89 or higher; 11% had a 95th percentile of 80 or higher. And just because, 4% had 95th percentiles of 80 and 81. For maximum line lengths:

                • 42% with longest line of 79 characters or less
                • 46% with longest line of 80 characters or less
                • 56% with longest line of 88 characters or less

                Longest line found: 204 characters

                [1] I don’t use Python, so I’m using what I have. And what I have are multiple Lua modules I’ve downloaded.

                [2] That is, out of all the lines of code, 95% of line lengths are less than this length.

                1. 1

                  https://en.wikipedia.org/wiki/88_(number)

                  I can’t help it but read it as a fascist code, or at least I start thinking about whether it could be on every occasion I see this number (not totally unfounded, because where I live it is used this way every now and then). I don’t think they meant to use it this way, so I think it’s fine (more than that, good, because it devalues the code by not treating the numebr as taboo).

                  1. 1

                    Personally I don’t like line break at 80 or 90 with python, as the 4-spaces indent quickly uses up a lot of horizontal space. For example, if you write unittest-style unit tests, before you write any assignment or call, you have already lost 8 spaces.

                    class TestMyFunctionality(unittest.TestCase):
                        def setUp(self):
                            # ....
                        def test_foo(self):
                            x = SomeModule.SomeClass(self.initial_x, get_dummy_data(), self.database_handle)
                    

                    Of course you could start introducing line breaks, but that quickly leads to debates on “hanging indent”, lisp-style-indent, etc. or you end up with a lot of vanity variables for local variables.

                    With lisp-style indent I mean the following snippet, that (if it was the way the autoformatter would do it would convince me to accept a 80 character line length limit)

                    class TestMyFunctionality(unittest.TestCase):
                        def setUp(self):
                            # ....
                        def test_foo(self):
                            x = SomeModule.SomeClass(self.initial_x,
                                                     get_dummy_data(),
                                                     self.database_handle)
                    

                    Whereas I find the “hanging indent” style makes understanding the structure of the syntax tree so much more difficult.

                    class TestMyFunctionality(unittest.TestCase):
                        def setUp(self):
                            # ....
                        def test_foo(self):
                            x = SomeModule.SomeClass(
                                    self.initial_x,
                                    get_dummy_data(),
                                    self.database_handle)
                    
                  1. 12

                    So, this might be a good time to float an idea:

                    None of this would be an issue if users brought their own data with them.

                    Imagine if users showed up at a site and said “Hey, here is a revokable token for storing/amending information in my KV store”. The site itself never needs to store anything about the user, but instead makes queries with that auth token to modify their slice of the user’s store.

                    This entire problem with privacy and security would go away, because the onus would be on the user to keep their data secure–modulo laws saying that companies shouldn’t (and as a matter of engineering and cost-effectiveness, wouldn’t) store their own copies of customer data.

                    Why didn’t we do this?

                    1. 16

                      http://remotestorage.io/ did this. I’ve worked with it and it’s nowhere near usable. There are so many technical challenges (esp. with performance) you face on the way that result of you basically having to process all user data clientside, but storing the majority of data serverside. It gets more annoying when you attempt to introduce any way of interaction between two users.

                      We did try this, saw that it’s too hard (and for some services an unsolved problem) and did something else. There’s no evil corporatism in that, nor is it a matter of making profit, even if a lot of people especially here want to apply that imagination to everything privacy-related. It’s human nature.

                      1. 2

                        basically having to process all user data clientside

                        If I go to a site, grant that site a token, couldn’t that server do processing server side?

                        It gets more annoying when you attempt to introduce any way of interaction between two users.

                        Looking at remotestorage it appears there’s no support for pub/sub, which seems like a critical failing to me. To bikeshed an example, this is how I see something like lobste.rs ought to be implemented:

                        • User data is stored in servers (like remotestorage) called pods, which contain data for users. A person can sign up at an existing pod or run their own, fediverse-style.

                        • These pods support pub/sub over websocket.

                        • A particular application sits on an app server. That app server subscribes to a list of pods for pub/sub updates, for whatever users that have given that application permission. On top of these streams the app server runs reduce operations and keeps the result in cache or db. A reduce operation might calculate something like, give me the top 1000 items sorted by hotness (a function of time and votes), given streams of user data.

                        • A user visits the site. The server serves the result instantly from its cache.

                        • Additionally the pub/sub protocol would have to support something like resuming broken connections, like replay messages starting from point T in time.

                        Anyway, given this kind of architecture I’m not sure why something like lobste.rs for example couldn’t be created - without the performance issues you ran into.

                        1. 2

                          If I go to a site, grant that site a token, couldn’t that server do processing server side?

                          If your data passes through third-party servers, what’s the point of all of this?

                          The rest of your post is to me, with all due respect, blatant armchair-engineering.

                          • The pub/sub stuff completely misses the point of what I am trying to say. I’m not talking about remotestorage.io in particular.

                          • Lobste.rs is a trivial usecase, and not even an urgent one in the sense that our centralized versions violate our privacy, because how much privacy do you have on a public forum anyway? Let’s try something like Facebook. When I post any content at all, that content will have to be copied to all different pods, making me subject to the lowest common denominator of both their privacy policies and security practices. This puts my privacy at risk. Diaspora did this. It’s terrible.

                          • Let’s assume you come up with the very original idea of having access tokens instead, where the pods would re-fetch the content from my pod all the time instead of storing a copy. This would somewhat fix the risk of my privacy (though I’ve not seen a project that does this), but:

                            • Now the slowest pod is a bottleneck for the entire network. Especially stuff like searching through public postings. How do you implement Twitter moments, global or even just local (on a geographical level, not on network topology level) trends?
                            • Fetching the data from my pod puts the reader’s privacy at risk. I can host a pod that tracks read requests, and, if the system is decentralized enough, map requests from pods back to users (if the request itself doesn’t already contain user-identifying info)

                          See also this Tweet, from an ex-Diaspora dev

                          1. 1

                            If your data passes through third-party servers, what’s the point of all of this?

                            It decouples data and app logic. Which makes it harder for an application to leverage its position as middle man to the data you’re interested in. Doing stuff like selling your data or presenting you with ads. Yet you put up with it because you are still interested in the people there. Because if data runs over a common protocol you’re free to replace the application-side of things without being locked in. For example, I bet there’s some good content on Facebook but I never go there because I don’t trust that company with my data. I wish there were some open source, privacy friendly front end to the Facebook network available, that would let me interact with people there, without sitting on Facebook’s servers, and open source. Besides that, if an application changes its terms of use, maybe you signed up trusting the application, but now you’re faced with a dilemma of rejecting the ToS and losing what you still like about the application, or accepting new crappy terms.

                            The rest of your post is to me, with all due respect, blatant armchair-engineering.

                            Ha! Approaching a design question by first providing an implementation without discussion seems pretty backwards to me. Anyway, as far as I’m concerned I’m just talking design. Specifically I’m criticizing what I perceive as a deficiency in remotestorage’s capabilities. And arguing that a decentralized architecture doesn’t have to be slow, is at least as good as a centralized architecture, and better, in many regards, for end users.

                            Let’s try something like Facebook. When I post any content at all, that content will have to be copied to all different pods,

                            No, I was saying that this would be published to subscribing applications. There could be a Facebook application. And someone else could set up a Facebook-alternative application, with the same data, but a different implementation. Hey, you could even run your own instance of Facebook-X application.

                            making me subject to the lowest common denominator of both their privacy policies and security practices.

                            If you grant an application access to your data, you grant it access to your data. I don’t see a way around that puzzle in either a centralized or decentralized architecture. If anything, in a decentralized architecture you have more choices. Which means you don’t have to resign yourself to Facebook’s security and privacy policies if you want to interact with the “Facebook” network. You could move to Facebook-X.

                            Now the slowest pod is a bottleneck for the entire network. Especially stuff like searching through public postings. How do you implement Twitter moments, global or even just local (on a geographical level, not on network topology level) trends?

                            What I was describing was an architecture where pods just store data. Apps consume and present it. If I have an app, and I subscribe to X pods, there’s no reason I have to wait for the slowest pod’s response in order to construct a state that I can present users of my app.

                            So for something like search, or Twitter moments, you would have an application that subscribes to whatever pods it knows about. Those pods publish notifications to the app over web socket, for example whenever a user tweets. Your state is a reduction over these streams of data. Let’s say I store this in an indexed lookup like ElasticSearch. So every time a user posts a tweet, I receive a notification and add it to my instance of ElasticSearch. Now someone opens my app, maybe by going to my website. They search for X. The app queries the ElasticSearch instance. It returns the matching results. I present those results to the user’s browser.

                            Fetching the data from my pod puts the reader’s privacy at risk.

                            Hmm, I’m not sure if we’re on the same page. In the design I laid out, the app requests this data, not the pod.

                            1. 2

                              With respect, “social media” and aggregator sites are red herrings here. They cant be made to protect privacy by their very nature.

                              I’m more thinking about, say, ecommerce or sites that aren’t about explicitly leaking your data with others.

                              1. 1

                                “With respect, “social media” and aggregator sites are red herrings here. They cant be made to protect privacy by their very nature.”

                                Sure they can. Starting with Facebook, they can give privacy settings per post defaulting on things like Friends Only. They could even give different feeds for stuff like Public, Friends Only, or Friends of Friends. They can use crypto with transparent key management to protect as much of the less-public plaintext as possible. They can support E2E messaging. They can limit discovery options for some people where they have to give you a URL or something to see their profile. Quite a few opportunities for boosting privacy in the existing models.

                                Far as link aggregators, we have a messaging feature that could be private if it isn’t already. Emails and IP’s if not in public profile. The filters can be seen as a privacy mechanism. More to that point, though, might be things like subreddits that were only visible to specific, invited members. Like with search, even what people are looking at might be something they want to keep private. A combo of separation of user activities in runtime, HTTPS and little to no log retention would address that. Finally, for a hypothetical, a link aggregator might also be modified to easily support document drops over an anonymity and filesharing service.

                      2. 9

                        Because the most formidably grown business of late are built on the ability to access massive amounts of user data at random. Companies simply don’t know how to make huge money on the Internet without it.

                        1. 3

                          We did. They’re called browser cookies.

                          The real problems are around an uneducated consumption-driven populous: Who can resist finding out “which spice girl are you most like?” – but would we be so willing to find out if it meant we get a president we wouldn’t like?

                          It is very hard for people to realise how unethical it is to hold someone responsible for being stupid, but we crave violence: We feel no thrill that can compare serving food, working in an office, or driving a taxi. Television and Media give us this violence, an us versus them; Hillary versus Urine Hilarity or The Corrupt Incumbent versus a Chance to Make America Great Again, or even Kanye versus anybody and everybody.

                          How can we make a decision to share our data? We can never be informed of how it will be used against us.

                          The GDPR does something very interesting: It says you’re not allowed to use someones data in a way they wouldn’t want you to.

                          I wish it simply said that, but it’s made somewhat complicated by a weird concept of “data” It’s clear that things like IP addresses aren’t [by themselves] your data, and even a name like John Smith isn’t data. Software understands data but not the kind of “data” that the GDPR is talking about. Pointing to “you” and “data” is a fair thick bit of regulation if you don’t want to draw a box around things and prevent sensible people from interpreting the forms of “data” nobody has yet thought of.

                          But keep it simple: Would that person want you doing this? Can you demonstrate why you think that is and convince reasonable people?

                          I’m doing a fair bit of GDPR consulting at the moment, and whilst there’s a big task in understanding their business, there’s also a big task getting them to approach their compliance from that line of questioning: How does this make things better for that person? Why do they want us to do this?

                          We’re not curing cancer here, fine, but certainly there are degrees.

                          1. 2

                            Browser cookies is something that crossed my mind after I suggested this, but my experience as a web dev makes me immediately suspect of them as durable stores. :)

                            I agree with your points though.

                          2. 2

                            This still doesn’t solve problems with tracking, because companies have already started to require GDPR opt-in to use their products (even when using the product doesn’t necessarily require data tracking), or to use their products without a degraded user experience.

                            See cloudflare, recaptcha, facebook, etc.

                            “You can’t use this site without Google Analytics having a K/V-auth-token”, “We will put up endless ‘find-the-road-sign’ captchas if we can’t track you”, etc.

                            1. 6

                              It’s a mistake to think you can “GDPR opt-in”. You can’t.

                              You have to prove that the data subject wants this processing. One way to do this is to ask for their consent and make them as informed as possible about what you’re doing. But they can decide not to, and they can even decide to revoke their consent at any time until you’ve actually finished the processing and erased their data.

                              These cookie/consent banners are worse than worthless; a queer kind of game people like Google are playing to try to waste time of the regulators.

                              We will put up endless ‘find-the-road-sign’ captchas if we can’t track you

                              I’ve switched to another search engine for the time being. It’s faster, the results are pretty good, and I don’t have to keep fiddling with blocking that roadblock on Google’s properties.

                          1. 1

                            I agree, polling is much better. I check my phone every 5 minutes to see if something has happened.

                            Push notifications are only a symptom.

                            1. 1

                              I check my phone every 5 minutes to see if something has happened.

                              I hope you don’t mean that literally, as if you did, I’d think having the phone do this for you would be a better option?

                              1. 1

                                My point is that I get push notifications less frequently than I would feel compelled to “poll” the phone myself. 5 minutes is an exaggeration.

                            1. 3

                              currently 1 developer and 2 community managers

                              Am i the only one who is bothered by this? Its understandable for commercial projects, but i can’t imagine what a manager for an open source community is doing.

                              1. 4

                                Manager and community manager are very different roles. A community manager is anyone who manages the community through interaction. That can mean writing news posts, writing release notes, publishing a roadmap, responding to user questions on forums or IRC, moderating, and more. I can easily see how a Linux distribution could use two part time people to do all of those things.

                                1. 2

                                  Not sure why you think this is problematic. The concept of forum moderators, though not quite the same, has been around since forever.

                                1. 13
                                  • Semver allows me to break compatibility in major releases. The author recommends not to, and to support old interfaces for years. The latter is out of the question for hobby projects. The package manager of the language I use (e.g. Cargo, npm) is able to deal with this just fine. Apt is not.
                                  • Cargo or npm allow me to lock all versions in my dependency tree and to restrict version ranges. Especially the latter is necessary for API breakages (in compliance with semver) to not be a problem. Again, it’s only apt that is not able to deal with this. Cargo or npm can resolve this conflict automatically and find appropriate versions, or do version splits if necessary. In Debian packaging, version splits are a manual task done by a person, which, to me, is the actual friction here.

                                  As an application developer I don’t see why I should need to work around the deficiencies of distribution’s package management systems, especially when those deficiencies are admitted by the author. I am not convinced that I, as developer, should bother with Debian. All of the arguments in “why Debian?” are from the perspective of an end user.

                                  The existence of Debian “stable” is actually a reason why I avoid Debian as a developer. Because what Debian considers “stable” comes at a price I don’t want to pay.

                                  In that sense I reasonate with the post by Joey Hess much more than with this one. Because I really think it’s the distros who have a problem here. Not me. I can just statically link everything, put the resulting binary in a PPA and never need to bother with any of this.

                                  1. 12

                                    Everything made a lot more sense to me when I started to think about the fact that the npm model assumes that code is being deployed by a team of full-time developers who are paid to stay on the upgrade treadmill and work thru all the integration issues of pulling in different pieces that have never been tested together. In this context, you can’t afford to wait for a stable release of a whole distro; you’ve got the bandwidth and expertise and test infrastructure to handle making it work with just the pieces you know you need. But forcing the end-user to be responsible for that kind of integration would be a nightmare.

                                    1. 3

                                      The npm model works because it’s being deployed on top of a stable Debian system.

                                      1. 2

                                        I’m late to the party, but can you elaborate on this?

                                    2. 1

                                      The package manager of the language I use (e.g. Cargo, npm) is able to deal with this just fine. Apt is not.

                                      Apt is perfectly able to cope with complex versioned dependencies, including “not compatible with libs < this version” and “this random point release actually changed the API so all the dependencies need to care about it, even though the developer claims otherwise”.

                                      Exactly what feature do you think apt is missing?

                                      1. 3

                                        Version range restrictions (particularly upper bounds) are the default in Cargo and npm, while in apt they are only used if actually necessary. They’re not necessary if no breakage happens. That is the friction in apt for actually using semver to its full extent.

                                        It’s more of a policy or best practice question than a technical one, but it doesn’t matter.

                                    1. 3

                                      I wish more folks involved in packaging for Linux distros were familiar with Homebrew. Obviously not everything Homebrew does is applicable to Debian, but the ability for folks to show up and easily contribute new versions with a simple PR is game changing. Last night I noticed that the python-paramiko package in Debian is severely out of date, but the thought of trying to learn the various intricacies of contributing to Debian well enough to update it is turns me right off.

                                      1. 15

                                        As an upstream dev of code that’s packaged with Homebrew, I have noticed that Homebrew is by far the sloppiest of any packagers; there is basically no QA, and often the packagers don’t even read the instructions I’ve provided for them. I’ve never tried it myself, but it’s caused me a lot of headaches all the same.

                                        1. 2

                                          I just looked at the packaging information for paramiko and I have more questions than before:

                                          How does this setup even work in case of a security vulnerability?

                                          1. 4

                                            Unfortunately, Debian has still a strong ownership model. Unless a package is team-maintained, an unwilling maintainer can stall any effort to update a package, sometimes actively, sometimes passively. In the particular case of Paramiko, the maintainer has very strong opinions on this matter (I know that first hand).

                                            1. 1

                                              Strong opinions are not necessarily bad. Does he believe paramiko should not be updated?

                                            2. 3

                                              How does this setup even work in case of a security vulnerability?

                                              Bugs tagged as security problems (esp. if also tagged with a CVE) get extra attention from the security team. How that plays out depends on the package/bug, but it can range from someone from the security team prodding the maintainer, all the way to directly uploading a fix themselves (as a non-maintainer upload).

                                              But yeah in general most Debian packages have 1-2 maintainers, which can be a bottleneck if the maintainer loses interest or gets busy. For packages with a lot of interest, such a maintainer will end up replaced by someone else. For more obscure packages it might just languish unmaintained until someone removes the package from Debian for having unfixed major issues.

                                          1. 19

                                            A major reason I use Debian is that, as a user, I consider 90% of software lifecycles to be utterly insane and actively hostile to me, and Debian forces them into some semblance of a reasonable, manageable, release pattern (namely, Debian’s). If I get the option to choose between upstream and a Debian package, I will take the latter every single time, because it immediately has a bunch of policy guarantees that make it friendlier to me as a user. And if I don’t get the option, I will avoid the software if I possibly can.

                                            (Firefox is the only major exception, and its excessively fast release cadence and short support windows are by far my biggest issue with it as a piece of software.)

                                            1. 5

                                              I never really understood why short release cycles is a problem for people, but then I don’t use Debian because of their too long ones. For example, the majority of Firefox’s releases don’t contain user-visible changes.

                                              Could you elaborate what your problems with Firefox on Debian are? Or why software lifecycles can even be hostile to you?

                                              1. 8

                                                I’m with you. I update my personal devices ~weekly via a rolling release model (going on 10 years now), and I virtually never run into problems. The policies employed by Debian stable provide literally no advantage to me because of that. Maybe the calculus changes in a production environment with more machines to manage, but as far as personal devices go, Debian stable’s policies would lead to a net drain on my time because I’d be constantly pushing against the grain to figure out how to update my software to the latest version provided by upstream.

                                                1. 3

                                                  I’ve had quite a few problems myself, mostly around language-specific package managers that break something under me. This is probably partly my fault because I have a lot of one-off scripts with unversioned dependencies, but at least in the languages I use most (Python, Perl, R, shell, etc.), those kinds of unversioned dependencies seem to be the norm. Most recent example: an update to R on my Mac somehow broke some of my data-visualization scripts while I was working on a paper (seemingly due to a change in ggplot, which was managed through R’s own package manager). Not very convenient timing.

                                                  For a desktop I mostly put up with that anyway, but for a server I prefer Debian stable because I can leave it unattended with auto-updates on, not having to worry that something is going to break. For example I have some old Perl CGI stuff lying around, and have been happy that if I manage dependencies via Debian stable’s libdevel-xxx-perl packages instead of CPAN, I can auto-update and pull in security updates without my scripts breaking. I also like major Postfix upgrades (which sometimes require manual intervention) to be scheduled rather than rolling.

                                                  1. 2

                                                    Yeah I don’t deal with R myself, but based on what my wife tells me (she works with R a lot), I’m not at all surprised that it would be a headache to deal with!

                                                2. 7

                                                  Every time a major update happens to a piece of software, I need to spend a bunch of time figuring out and adapting to the changes. As a user, my goal is to use software, rather than learn how to use it, so that time is almost invariably wasted. If I can minimize the frequency, and ideally do all my major updates at the same time, that at least constrains the pain.

                                                  I’ve ranted about this in a more restricted context before.

                                                  My problem with Firefox on Debian is that due to sheer code volume and complexity, third-party security support is impossible; its upstream release and support windows are incompatible with Debian’s; and it’s too important to be dropped from the distro. Due to all that, it has an exception to the release lifecycle, and every now and then with little warning it will go through a major update, breaking everything and wasting a whole bunch of my time.

                                                  1. 4

                                                    Due to all that, it has an exception to the release lifecycle, and every now and then with little warning it will go through a major update, breaking everything and wasting a whole bunch of my time.

                                                    I had this happen with Chromium; they replaced the renderer in upstream, and a security flaw was found which couldn’t be backported due to how insanely complicated the codebase is and the fact that Chromium doesn’t have a proper stable branch, so one day I woke up and suddenly I couldn’t run Chromium over X forwarding any more, which was literally the only thing I was using it for.

                                                    1. 2

                                                      Ha, now I understand why I use emacs. It hasn’t changed the UX in years, if not decades.

                                                    2. 4

                                                      Because you need to invest into upgrading too much of your time. I maintain 4 personal devices with Fedora and I almost manage to upgrade yearly. I am very happy for RHEL at work. 150 servers would be insane. Even with automation. Just the investment into decent ops is years.

                                                      1. 2

                                                        For me there is an equivalence between Debian stable releases and Ubuntu LTE ones, they both run at around 2 years.

                                                        But the advantage (in my eyes) that Debian has is the rolling update process for the “testing” distribution, which gets a good balance between stability and movement.

                                                        We are currently switching our servers from Ubuntu LTE to Debian stable. Driven mostly by lack of confidence in the future trajectory of Ubuntu.

                                                    1. 6

                                                      I think this is a misguided blaming of the language when the programmer is at fault. If you are catching an exception in JavaScript, verify the type of exception before continuing. This is just a straightforward necessity when you don’t have a language with static types.

                                                      So there are two programmer errors in the example: the typo of ‘sedn’ and the absence of a branching for the ‘nouser’ exception.

                                                      I get that it’s not fun and the overall point is that JavaScript should handhold the programmer a bit better, but hey, it’s JavaScript and we’re used to Stockholm syndrome.

                                                      1. 4

                                                        In Python and Ruby the popular linters will point this kind of code out for catching all exceptions. There’s got to be an equivalent in JS.

                                                        1. 1

                                                          I think verifying the type of the exception is difficult in practice. It is not a uniform practice to use granular “subclasses” so the instanceof operator can’t really help with application-specific or library-specific errors. You end up with very ad-hoc set of codes or flag properties that are just in no way comprehensive, stable, or reliable. I think the best you can do is what bounce does which is detect the 6 known programmer errors, but now we’re basically accepting the fact that what javascript itself provides is just not sufficient to properly categorize.

                                                        1. 10

                                                          How to make OSS maintainers cry: Make a talk at a large conference where you publicly shame their software by name. Make sure to include screenshots of GitHub discussions with the maintainer’s username visible. Tell people that the project you just ripped into has a booth at the same conference, tell them to check the booth out.

                                                          Put some slides inbetween to tell everybody it’s just a joke.

                                                          Oh, and pick a title for your talk that makes it sound like you’re the victim.

                                                          1. 2

                                                            I watched the video again after reading this comment, and I have to say, it doesn’t seem so bad to me. Yes, it makes fun of particular packages, but it’s really not in a nasty way, and the examples it presents are public anyway. It’s also quite funny in many places, and I think the fact that it’s intended as humorous is pretty obvious.

                                                          1. 3

                                                            Step-by-step I’m rewriting vdirsyncer in Rust. Right now I’m trying to (unsuccessfully) debug a segfault that happens only in the legacy Ubuntu Trusty environment of Travis (switching to Ubuntu Precise helps), but not in an equivalent local VM: https://github.com/pimutils/vdirsyncer/pull/698

                                                            Apart from that:

                                                            • I’ve just returned from FOSDEM and I try to figure out what I could work on next
                                                            • A bit of studying. One exam still left for this semester
                                                            • Working
                                                            1. 3

                                                              Neat idea. How about making your .bash_history file a named pipe and have the script read from that, instead of using PROMPT_COMMAND?

                                                              1. 4

                                                                I did this at a hackathon. I found it kept having weird sync issues with a lot of shells open, but didn’t have time to fully investigate.

                                                                1. 1

                                                                  Won’t this block your shell after a while if the reading process somehow dies?

                                                                  1. 1

                                                                    Yep. Equally PROMPT_COMMAND could cause delays/hangs depending on connectivity to the remote system.

                                                                  2. 1

                                                                    That’s a very creative idea that I hadn’t thought of. I did want to avoid interfering with the client system’s history mechanism though.

                                                                    1. 1

                                                                      Ah, good point!

                                                                  1. 4

                                                                    Ever typed anything like this?

                                                                    $ grp somestring somefile
                                                                    -bash: grp: command not found
                                                                    

                                                                    Sigh. Hit ‘up’, ‘left’ until at the ‘p’ and type ‘e’ and return.

                                                                    Yeah, but I finnd using “up” “Ctrl-a” “Ctrl-d” “grep” easier, especially as an emacs user.

                                                                    Generally speaking that would say that’s the biggest “hidden” feature of bash: emacs bindings by default. And that’s not only limited to movement commands like C-a, C-e, C-p, M-b, etc. You can kill lines or words with C-k or M-d, and yank them back in when needed with C-y. There’s even an “infinite kill-king” (by far the coolest name for a editor feature), to replace the last yanked section with the next item in the kill-ring. Of course, not everything is implemented, so theres no hidden mail client or M-x butterfly, but if you already are used to the default emacs editor binding, you get used to this quickly. And afaik, all tools that require GNU readline can do this. I just tested it out with Python, and it seemed to work.

                                                                    I also recall reading something about vi-bindings in the bash manpage, but I can’t testify on how useful harmful, annoying or useless they are.

                                                                    1. 6

                                                                      Emacs bindings by default is also one of the biggest hidden features of MacOS: the bindings work in all GUI text fields.

                                                                      1. 1

                                                                        Wow, I learned something new today. Prompted by your comment, I found this table comparing emacs bindings, OSX’s version of emacs bindings, and the more traditional Mac-style bindings for various operations.

                                                                        Looks like emacs’s M- bindings are mapped to ctrl-opt- on MacOS, which isn’t super convenient (e.g. I don’t see myself getting in the habit of using ctrl-opt-f over opt-rightarrow to move forward a word), but most of the C- bindings are convenient enough.

                                                                        1. 1

                                                                          I just discovered this a few days ago by accident because I have it set in GTK so I can use the bindings in my browser. I had to use a colleague’s (who is on macOS) browser and I just used them without thinking and only later realised ‘hey, wait a minute, why did that work?’.

                                                                          1. 1

                                                                            This is a major reason why I stay on OS X. I’m pretty sure I could reconfigure some Linux to get most of this, but probably not all of the niceness of text fields

                                                                            Would love to be proven wrong though

                                                                            1. 3

                                                                              I haven’t used GNOME for a while now, but I remember there being an option somewhere to used emacs keybindigs. And as it seems, all you need nowadays is to install the GNOME tweak tools, to activate it.

                                                                              (Alternatively, just use Emacs as your OS, heard they’ve got good support for emacs keybindings)

                                                                              1. 2

                                                                                Just FYI: That page is outdated, being written for 2.x era Gnome. Now the Emacs Input toggle is under the Keyboard & Mouse section.

                                                                          2. 3

                                                                            Yeah, won’t disagree. Occasionally, I find myself reaching for the caret because it comes to mind first.

                                                                            I’m an avid vi user, but the vi bindings on the command line never take for me. I always go back to the emacs ones.

                                                                            1. 3

                                                                              I use vi vindings and love them! I also never use ^ because I prefer interactive editing.

                                                                              It’s really nice that they work in Python and R as well as bash (because Python and R both use readline).

                                                                              In fact I think a large part of the reason that my OCaml usage trailed off is that the REPL utop doesn’t support readline. It only has emacs bindings!

                                                                              For those who don’t know, here is the beginning of my .inputrc:

                                                                              $ cat ~/.inputrc 
                                                                              set editing-mode vi
                                                                              
                                                                              set bell-style visible    # no beep
                                                                              
                                                                              1. 2

                                                                                Deleting words with C-w is also very helpful ime.

                                                                                1. 1

                                                                                  I use fc for that. Opens your $EDITOR with the last command in a file, the edited command will be run

                                                                                1. 2

                                                                                  The AOSP keyboard has both “Gesture Typing” and Emoji Support, I don’t think AnySoftKeyboard was necessary here.

                                                                                  1. 2

                                                                                    I’m pretty sure gesture typing requires a proprietary library. I have LineageOS 14.1 without Google apps, there’s no gesture typing.

                                                                                    1. 1

                                                                                      I’m not entirely sure, but I had to explicitly enable it in the keyboard settings.

                                                                                      It also seems that my keyboard is called “AOSP Keyboard” but idk how much that means.

                                                                                      1. 1

                                                                                        Yeah, AOSP Keyboard, but if you have gapps installed, it will load a proprietary shared library that implements gesture typing.

                                                                                  1. [Comment from banned user removed]

                                                                                    1. 6

                                                                                      This is a pretty standard thing to do once you’ve protected the master branch on a project, which is also a pretty standard thing to do.

                                                                                      1. [Comment from banned user removed]

                                                                                        1. 2

                                                                                          You’re arguing against personal preference here.

                                                                                          1. 1

                                                                                            I take it you also don’t believe in continuous integration, et cetera?

                                                                                            1. [Comment from banned user removed]

                                                                                              1. 3

                                                                                                Ease up, man. This form of “my method is better – period” does nothing but alienate the argument and vilify the author (you). Imagine how this makes people feel.

                                                                                                I doubt you’re here to stroke your ego, so if you want to get your point across effectively, consider using a different approach than this.

                                                                                                ON TOPIC: There is no right answer here, as whatever works best for teams/groups/individuals will vary wildly.

                                                                                                1. [Comment from banned user removed]

                                                                                                  1. 6

                                                                                                    If you’re right, it’s enough to be right. Being rude to other people doesn’t make you more right.

                                                                                                    Please take a look down your recent threads. The downvotes you’re getting are not incorrect. You’ve sometimes had good technical points to make, but your attitude and communication style has overwhelmed your ability to share your knowledge and be part of this community. If you care about participating effectively, you need to change the way you communicate. And if you don’t care, why bother posting?

                                                                                                    1. [Comment from banned user removed]

                                                                                                      1. 7

                                                                                                        Stop insulting people and assuming their opinions come from ignorance, incompetence, and malice. If you can’t treat others with common courtesy, let alone kindness, you should leave. If you can’t be at all polite or be quiet, I’ll ban you. This is normal for Lobsters and the vast majority of online and offline communities.

                                                                                                        1. [Comment from banned user removed]

                                                                                                          1. 6

                                                                                                            pushcx has my full confidence. I’ve been involved in running various online communities for something like fifteen years now, and he’s doing fine. If anything, he’s doing a better job of parsing out people’s concerns here than I am, lately.

                                                                                                            I urge you to take the advice to examine your own recent words. I don’t think I have the ability to help, beyond giving that advice; this is really something you have to do yourself.

                                                                                                2. 2

                                                                                                  No.

                                                                                        1. 2

                                                                                          I really like some aspects of fossil, like the integrated issue tracker and wiki, but I really dislike not to be able be to squash commits.

                                                                                          1. 1

                                                                                            I also squash commits in my dev branches before merge[1] but it’s an easy philosophy to accept: the local history is permanent. That said, when I was using fossil I had a work flow of creating a temporary dev copy for each feature with all the mess and then a second “real” one that I would rsync the completed changes to and commit. The “real” one had a nice neat version of development.

                                                                                            [1] Does anyone really need to see “and again”, “nope, typo”, “and fix the test”, “bump”, “wtf didn’t that work” and such from integration and what not?

                                                                                            1. 1

                                                                                              [1] Does anyone really need to see “and again”, “nope, typo”, “and fix the test”, “bump”, “wtf didn’t that work” and such from integration and what not?

                                                                                              There’s the germ of an idea rattling around in my head that the answer to this question should be correlated with the answer to the question “should I record for posterity literally every single keystroke made in my text editor?”

                                                                                              1. 1

                                                                                                In my opinion, this relates to version control - in my opinion - being not complex enough. For example, you could have the best of both by having a notion of a “patch bundle” that wraps a couple of smaller changes.

                                                                                                1. 1

                                                                                                  When I squash commits it’s not just about keeping the commit log tidy. Some mistakes or “wip” comments I really don’t want the world to see (though I’m fine with having them in a feature branch which I delete later).

                                                                                          1. 11

                                                                                            I used a Samsung ARM Chromebook for about three years, Arch Linux ARM. It taught me that there are two facets to support:

                                                                                            1. Can other people help you with your device
                                                                                            2. Can you fix your own device

                                                                                            Generally #1 is lower when you use less popular platforms, and I was prepared for that. As someone who is used to fixing everything from hardware (scopes, solder and rosin inhalation) to software (they were sending ARPs how fast?) I was also prepared for #2.

                                                                                            Or so I thought.

                                                                                            Whatever you do: do NOT get a device that demands a signed bootloader. The bootloader on this device was forgetful, easily corrupted, rude (“You’re not running Chrome OS! Please press space twice so I can wipe everything!”) and most of all: not replaceable. Only Google had the keys, and I had to live with it.

                                                                                            Initially I had a second stage of u-boot installed that I had control over. This was brilliant. The Arch Linux ARM install instructions for this device used to have this as part of the recommended setup. That changed at a later point – a story that involves a post-install script for a newer kernel package dd’ing over my root partition.

                                                                                            I was stuck on a very old kernel version provided in the ALARM repos, I believe the one the original ChromeOS shipped with. This caused me many dramas, including making systemd flat out refuse to boot my device. “You don’t have cgroups support? Pah! I’m on strike. You didn’t need your computer to boot anyway, did you?”.

                                                                                            I have a couple of stories written up about my experiences:

                                                                                            A quick summary of the fun side of things used to live in my /etc/issue:

                                                                                            Welcome to Clusterlizard, chamber \\l.  Please praise your selected deity(s)
                                                                                            
                                                                                            Summary of interesting failure stories since December 2013:
                                                                                             - 'debug' on kernel command line -> systemd becomes very verbose -> random race conditions due to text output -> crash
                                                                                             - filesystem death on SSD by power-cycling too rapidly whilst debugging other issues
                                                                                             - btrfs failure from trying to compile firefox ("ran out of inodes" even though btrfs does not use inodes)
                                                                                             - systemd update -> required kernel support for xattrs on folders -> refused to boot
                                                                                             - empty Chinese take-away containers + bag + laptop -> cracked the screen
                                                                                             - systemd update -> prevented kernel from loading userspace wifi firmware
                                                                                             - occasional bootloader corruption, fails to work until battled into a soft-reset after many attempts
                                                                                             - upgraded many packages, write-cache filled memory, OOM -> system hung, filesystem left inconsistent 
                                                                                             - updated kernel -> post-install script dd'd bootloader over my root filesystem 
                                                                                             - updated kernel -> shorter wifi scan argument list support -> can't connect to wifi at uni, too many networks
                                                                                            
                                                                                            Misc self-inflicted
                                                                                             - removed systemd-sysvcompat
                                                                                             - custom init system: spawned gettys with wrong arguments -> no logins
                                                                                             - repeat episodes of systemd firmware issues
                                                                                            
                                                                                            Happy birthday Clusterlizard! (2014 and 2015 and 2016)
                                                                                            

                                                                                            Having many things go wrong with systemd whilst on a remote Greek village mountainside lead me to write my own init. But that’s another story.

                                                                                            What finally forced me to stop using the laptop was a failure of the inbuilt storage coupled with bugs in the evil bootloader. The onboard flash storage (MMC) became very slow over time (down to ~2MB/s write toward the end), but this wasn’t my major concern. What really hurt was when the the laptop started hardlocking when I did heavy disk I/O, such as updating.

                                                                                            Updating became a dangerous game. I’d try to workaround the problem by constantly interrupting the process and forcing disk sync, but this was tedious and slow. Worst of all: when the laptop locked up during updating I would find many of my system libraries left zero bytes long.

                                                                                            After about the third or fourth time that I had this happen I decided I needed some change.

                                                                                            Unfortunately this device had no internal connectors for replacement storage. The internal MMC was soldered directly onto the motherboard (BGA packages, not easily replaceable). But I thought I could use an SD card or USB stick instead.

                                                                                            USB and SD boot were how I originally installed (and repeatedly fixed) the ALARM installation. But now, out of the blue, the signed bootloader had decided that USB and SD card booting were verboten. “Hmm”, I thought, “perhaps those configuration bits had flipped?”. Not only that, but the configuration region had become write-locked. I have no clue why, the bootloader was still in the “developer” mode, and I tried many things to resolve it.

                                                                                            I found it hard to stop using my Arm laptop. I still occasionally get it out for the smell, it brings back many memories of many places. It has been the lightest and longest lasting laptop I have ever owned. It had many physical construction issues, was held together with hot glue, and the performance was non-existant in the graphics department. But it was different, it was something I could afford, and it was fun.

                                                                                            RIP clusterlizard, 2016

                                                                                            Epilogue: I now use an 11.6” refurbished DELL Latitude 3150. It suffers phantom stuck keys, screen backlight stability issues and I had to warranty the battery a month after buying it. It’s heavier, has a smaller keyboard (complete with a keyboard bezel!) and doesn’t smell anywhere as iconic as my ARM laptop did.

                                                                                            But when it breaks, I have many more options to fix it.

                                                                                            1. 1

                                                                                              I think you’re more ranting about Chromebooks than ARM as a processor architecture. I have an Intel Chromebook and probably the same bootloader.

                                                                                            1. 1

                                                                                              Dramatiq is licensed under the AGPL

                                                                                              Now I have three options:

                                                                                              • Make the codebase at work opensource (lol)
                                                                                              • Violate AGPL on purpose
                                                                                              • Use any of the other Redis-based task queues

                                                                                              I really don’t get what the author is trying to achieve with choosing a license like this.

                                                                                              1. 13

                                                                                                You could also buy a license.

                                                                                                1. 1

                                                                                                  Ah, that makes sense. I didn’t see that, shame on me.

                                                                                                2. 4

                                                                                                  I think commercial backing of some sort or another is the only way we can sustainably develop open source software long term and dual licensing seemed like the lowest friction way to get started. I’ll have to highlight that fact a little better in the docs! :D

                                                                                                  1. 2

                                                                                                    You are right of course. Other message frameworks like sidekiq seem to do alright: https://github.com/mperham/sidekiq

                                                                                                    The challenge here is that Celery is in pretty great shape for a free solution. On the other hand Python’s support for high concurrency is changing rapidly so who knows maybe there’s room for a new player in this market.

                                                                                                    1. 2

                                                                                                      I’ve never met anyone IRL who’s worked with Celery and didn’t run into problems, so there’s definitely room for improvement in this area.

                                                                                                      1. 2

                                                                                                        It works like a charm with RabbitMQ as a backend. The rest is pretty experimental and breaks, especially at high volume. (I’ve been using Celery for >5 years)

                                                                                                        1. 4

                                                                                                          I’ve been using Celery professionally for about 3 years and dramatiq tries to solve many of the issues I’ve encountered using it. Some stuff that immediately springs to mind:

                                                                                                          • Celery doesn’t support task prioritization. You have to deploy multiple sets of workers in order to prioritize queues.
                                                                                                          • Celery has poor support for delayed tasks. Delayed tasks go on the same queue that normal tasks go on and they’re simply pulled into worker memory until they can be executed. This makes it hard to autoscale workers by queue size.
                                                                                                          • Celery acks tasks as soon as they’re pulled by a worker by default. This is easy to change, but a bad default. Dramatiq doesn’t let you change this: tasks are only ever acked when they’re done processing.
                                                                                                          • Celery tasks are not retried on error by default.
                                                                                                          • Celery’s not well suited for integration testing. You’re expected to unit test tasks and to turn eager evaluation on for integration tests, but even then task exceptions will be swallowed by default. Dramatiq provides an in-memory stub broker specifically for this use case.
                                                                                                          • The source code is spread across 3 different projects (celery, billiard and kombu) and it’s impenetrable. Its usage of runtime stack frame manipulation leads to heisenbugs.
                                                                                                          • It’s easy for some of its more advanced “canvas” features to drop tasks.

                                                                                                          All of the above are things that are first-class in dramatiq and there are definitely other things I’m not thinking of right now. That’s not to say that celery is bad, but I think we can do better and that’s why I made dramatiq. :D

                                                                                                          1. 1

                                                                                                            Considering your experience, I was wondering what’s your take on rq? (others who used it, are obviously welcomed to chime in too)

                                                                                                            1. 1

                                                                                                              I don’t have much experience with RQ since it is Redis-only and I’ve generally preferred to use RabbitMQ as a message broker. However, a few things that seem like disadvantages to me with RQ are:

                                                                                                              • Messages are pickled so it’s strictly limited to Python and pickled messages are potentially exploitable. This also means you may sometimes send bigger messages than you intended over the network purely by accident.
                                                                                                              • Queue prioritisation is handled like it is in Celery: you have to spawn different sets of workers.
                                                                                                              • It forks for every job, so it’s slightly slower and forks that are killed b/c they’ve surpassed their time limits can leak DB connections if you’re not careful. I understand this may be swappable behaviour, however.
                                                                                                              • Similar to Celery, there isn’t a good integration testing story for RQ.

                                                                                                              Because I’ve criticised both Celery and RQ at this point, I feel it’s important that I mention a couple areas where they’re both currently better than dramatiq:

                                                                                                              • the obvious one: it’s newer than either of those and is less likely to be familiar to users. The extension ecosystem for dramatiq is nonexistent (though I will be releasing integration packages for Django and Flask soon!)
                                                                                                              • dramatiq doesn’t store task results and doesn’t offer a way to retrieve them. Adding that sort of functionality is trivial using middleware, but it’s not there ootb so if you absolutely need something like that and you don’t care about the things I have mentioned so far then you should look at Celery or RQ instead.
                                                                                                              1. 1

                                                                                                                Thank you for taking the time to post this!

                                                                                                                There are two other areas that bother me personally:

                                                                                                                • Python 3 only. While I would love to switch to Python 3, still need to maintain a large project in Python 2.
                                                                                                                • The AGPL license. The above project is open source too, but I want to keep it BSD licensed to stay “friendly” towards potential users. Ironically, for a commercial project I would worry less about your license of choice, as I wouldn’t mind buying the commercial license when needed.

                                                                                                                I share @jscn’s sentiment about Celery. I I was wondering if RQ, despite the above disadvantages might be more stable. At least their codebase should easier to grok (single repo)…

                                                                                                                1. 1

                                                                                                                  Python 3 only. While I would love to switch to Python 3, still need to maintain a large project in Python 2.

                                                                                                                  I’m considering adding Python 2 support, but it’s a hard thing to balance what with 2.x getting EOL’d in a little less than 2 and a half years.

                                                                                                                  The AGPL license. The above project is open source too, but I want to keep it BSD licensed to stay “friendly” towards potential users. Ironically, for a commercial project I would worry less about your license of choice, as I wouldn’t mind buying the commercial license when needed.

                                                                                                                  Understandable.

                                                                                                            2. 1

                                                                                                              Sure, that’s true. Did you ever look at https://github.com/RichardKnop/machinery that project is still really early. Probably much easier to compete with.

                                                                                                      2. 1

                                                                                                        beanstalkd, NSQ, resque, celery, huey, … — pretty much everything in this space is non-GPL. So “use any other queue thing” will definitely be a very popular option :)

                                                                                                        1. 5

                                                                                                          So “use any other queue thing” will definitely be a very popular option :)

                                                                                                          That’s perfectly fine! I just want those people that get value out of my work to contribute back in some way. If someone makes a cost-benefit analysis and decides that they’d rather use celery over dramatiq because they prefer the cheaper option (although it’s worth mentioning that I give out free comm. licenses for one year per company) then that’s their prerogative. I’ll still be around a year later when they realise their mistake ;).

                                                                                                      3. 2

                                                                                                        Trying to achieve you not using this at work? That’s usually what I’m going for when I choose AGPL

                                                                                                      1. 3

                                                                                                        This gets close to a thing I enjoy in Swift:

                                                                                                        struct Vec2 {
                                                                                                            var x: Float
                                                                                                            var y: Float
                                                                                                        }
                                                                                                        
                                                                                                        var pos = Vec2(x: 42, y: -42)
                                                                                                        

                                                                                                        Free memberwise initializer for structs. You can also provide default values by appending = val to the members. The @dataclass proposal looks closer still.

                                                                                                        You don’t get free comparison operators (but it’s getting there) so this is nicer in that regard.

                                                                                                        1. 3

                                                                                                          Yup I think this is basically “value types” for Python! I wanted this a long time ago!

                                                                                                          Namedtuple was close but the syntax is a bit awkward.

                                                                                                          1. 3

                                                                                                            In C99 you can do this:

                                                                                                            typedef struct {
                                                                                                                    float x;
                                                                                                                    float y;
                                                                                                            } Vec2;
                                                                                                            
                                                                                                            Vec2 pos_foo = {42, -42};
                                                                                                            
                                                                                                            // or using designated initializers (x will be 0 in this case):
                                                                                                            Vec2 pos_bar = {.y = 42 };
                                                                                                            
                                                                                                            // or using compound literals:
                                                                                                            draw(foo, (Vec2){42, -42});
                                                                                                            
                                                                                                            // more with designated initializers (everything else will be 0):
                                                                                                            enum { FOO, BAR, BAZ, COUNT };
                                                                                                            Vec2 pos[COUNT] = { [BAR] = {.y = 42} };
                                                                                                            
                                                                                                            1. 2

                                                                                                              It’s funny that statically typed languages like Swift and Go cover this better than a dynamically typed language like Python ;-)

                                                                                                              1. 1

                                                                                                                Not sure what this has to do with dynamic vs static typing.

                                                                                                            1. [Comment removed by author]

                                                                                                              1. 10

                                                                                                                You’re saying that ST was great 4-5 years ago, but apart from the langserver, which one of your points didn’t apply back then as much as it does now? You say that “today there are better editors”, but surely vim is much older than 4-5 years and basically didn’t change.

                                                                                                                1. [Comment removed by author]

                                                                                                                  1. 8

                                                                                                                    The primary reason I stick with Sublime Text is that Atom and VSCode have unacceptably worse performance for very mundane editing tasks.

                                                                                                                    I’ve tried to switch to both vim and Spacemacs (I’d love to use an open source editor), but it’s non-trivial to configure them to replicate functionality that I’ve become attached to in Sublime.

                                                                                                                    1. 1

                                                                                                                      I thought VSCode was supposed to be very quick. Haven’t experimented with it much myself, what mundane editing tasks make it grind to a halt? I am well aware Atom has performance issues.

                                                                                                                      1. 1

                                                                                                                        Neither Atom nor VSCode grind to a halt for me, but I can just tell the difference in how quicky text renders and how quickly input is handled.

                                                                                                                        I’m not usually one of those people who obsesses about app performance, but editors are an exception because I spend large chunks of my life using them.

                                                                                                                      2. 1

                                                                                                                        I’ve tried to switch to both vim and Spacemacs (I’d love to use an open source editor), but it’s non-trivial to configure them to replicate functionality that I’ve become attached to in Sublime

                                                                                                                        This is the reason who I stay with vim, unable to replicate vim functionality in other editors.

                                                                                                                        1. 1

                                                                                                                          Yeah, fortunately NeoVintageous for Sublime does everything I need for vim-style movement and editing.

                                                                                                                  2. 3

                                                                                                                    I think the really ground-breaking feature that ST introduced was multi-cursor editing. Now most editors have some version of that. Once you get used to it, it’s very convenient, and the cognitive overhead is low.

                                                                                                                    As for the mini-map, I suppose it’s a matter of taste, but I found it very helpful for scanning quickly through big files looking for structure. Visual pattern recognition is something human brains are ‘effortlessly’ good at, so why not put it to use? Of course, I was using bright syntax hilighting, which makes code patterns much more visible in miniature. Less benefit for the hilight-averse.

                                                                                                                    I’ve been using ST3 beta for a few years as my primary editor. I tried using Atom and (more recently) VS Code, but didn’t like them as much: the performance gap was quite noticeable at start-up and for oversized data files. The plug-in ecosystems might make the difference for some folks, but all I really used was git-gutter and some pretty standard linters. For spare-time fun projects I still enjoy Light Table, but it’s more of a novelty. I’m gradually moving away from the Mac and want a light-weight open-source editor that will run on any OS.

                                                                                                                    So now, as part of my effort to simplify and get better at unix tools, I’m using vis. I’m enjoying the climb up the learning curve, but I think that if I stick with it long enough, I’ll probably end up writing a mouse-mode plugin. And maybe git-gutter. Interactive structural regexps and multi-cursor editing seem like a winning combination, though.

                                                                                                                    1. 3

                                                                                                                      You might enjoy exploring kakoune as well. http://kakoune.org | https://github.com/mawww/kakoune

                                                                                                                      1. 2

                                                                                                                        I’m an Emacs guy myself and I honestly think that multi-cursor editing is just eye-candy for good ol’ editor macros, and both both vim and Emacs include them since… forever?

                                                                                                                        1. 3

                                                                                                                          I’ve never used Sublime Text, but I’ve used multiple-cursors in vis and Kakoune, and it beats the heck out of Vim’s macro feature, just because of the interactivity.

                                                                                                                          With Vim, I’d record a macro and bang on the “replay” button a bunch of times only to find that in three of seventeen cases it did the wrong thing and made a mess, so I’d have to undo and (blindly) try again, or go back and fix those three cases manually.

                                                                                                                          With multiple cursors, I can do the first few setup steps, then bang on the “cycle through cursors” button to check everything’s in sync. If there’s any outliers, I can find them before I make changes and keep them in mind as I edit, instead of having my compiler (or whatever) spit out syntax errors afterward.

                                                                                                                          Also, multiple cursors are the most natural user interface for [url=http://doc.cat-v.org/bell_labs/structural_regexps/]structural regular expressions[/url], and being able to slice-and-dice a CSV (or any non-recursive syntax) by defining regexes for fields and delimiters is incredibly powerful.

                                                                                                                          1. 0

                                                                                                                            [url=http://doc.cat-v.org/bell_labs/structural_regexps/]structural regular expressions[/url]

                                                                                                                            This might be the first attempt at BBCode I’ve seen on Lobsters. Thanks for reminding me how much I hate it.

                                                                                                                            1. 1

                                                                                                                              Dangit, you can tell I wrote that reply at like 11PM, can’t you. :(

                                                                                                                          2. 1

                                                                                                                            I agree with you. I use Vim, and was thinking about switching until I realized that a search and repeat (or a macro when it’s more complex) works just as well. Multiple cursors is a cute trick, but never seemed as useful as it first appeared.

                                                                                                                          3. 2

                                                                                                                            I thought multiple cursors was awesome. Then I switched to using Emacs, thanks to Spacemacs. Which introduced to me [0] iedit. I think this is superior to multiple cursors. I am slowly learning Emacs through Spacemacs, I’m still far away from being any type of guru.

                                                                                                                            [0] https://github.com/syl20bnr/spacemacs/blob/master/doc/DOCUMENTATION.org#replacing-text-with-iedit

                                                                                                                          4. 2

                                                                                                                            I’ve started using vim for work, and although I’ve become quite fast, I find myself missing ST’s multiple cursors.

                                                                                                                            I might try switching to a hackable editor like Yi. I’ve really enjoyed using xmonad recently for that reason.

                                                                                                                          1. 15

                                                                                                                            I don’t even know how to go offline. I turned on airplane mode, but nothing happened. Do I actually need to be on an airplane?

                                                                                                                            1. 7

                                                                                                                              Apparently this uses https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine

                                                                                                                              Browsers implement this property differently.

                                                                                                                              1. 3

                                                                                                                                If you bring up the JavaScript console, it will prompt you through faking it.

                                                                                                                                1. 24

                                                                                                                                  Sigh. I remember when web pages were just web pages and not interactive text adventures. Something else that works great in offline mode: plain HTML. How amazing is that?

                                                                                                                                  1. 47

                                                                                                                                    Aren’t you the dude with the web site that requires people to register a different Certificate Authority?

                                                                                                                                    1. 13

                                                                                                                                      How you get the HTML is your problem, but once you have it, it just works. Even works in lynx. Right click, save link, read it later. Have you tried doing that with this page? If I actually do decide to go offline, and transfer the file via sneakernet, how well will that work?

                                                                                                                                      1. 5

                                                                                                                                        Your perception of what is and what isn’t the user’s fault is “interesting”.

                                                                                                                                        1. 1

                                                                                                                                          I don’t see “fault” used. Are you referring to @tedu placing the burden on authenticating his blog on the user? I actually don’t understand what this tangent has to do with this offline thing anyways. Does @tedu’s certificate setup somehow mean that web pages were once not plain HTML that worked offline?

                                                                                                                                      2. 7

                                                                                                                                        I don’t suppose tedu dictates the chosen security model of your browser. I can tell my browser to stop whining and just show the friggin page.

                                                                                                                                        No, you do not need to trust the cert or the ca to download and decrypt the page.

                                                                                                                                      3. 6

                                                                                                                                        What strikes me most with your statement, is how this sounds a lot like “it was better before”. Obviously plain HTML works great in offline mode, but it doesn’t help in any way to make the point the author is making.

                                                                                                                                        1. 4

                                                                                                                                          this page’s entire raison d’etre is to be an interactive text adventure, so it seems a bit point-missing to complain that it’s not a web page just because it happens to run in a browser.

                                                                                                                                          1. 11

                                                                                                                                            The author wonders why we’re online all the time. Well, how else am I to complete interactive adventures telling me to go offline? It seems more people than not resorted to using the browser console to read the page (after going online to find help), so I’m not sure how much they learned about the experience of being offline either. I learned (again) that nothing works and the only way to survive to is ask for help online.

                                                                                                                                      4. 2

                                                                                                                                        return your tray table to an upright position

                                                                                                                                        1. 1

                                                                                                                                          Tests showed airplane mode works best on a B-2.