1.  

      I wonder if thats to better make use of performance/cost benefits between cloud suppliers or that they actually have redundant backups at each supplier and those services just happen to be pointing towards certain providers now.

      1.  

        A theory put to me was that they’re taking freebies where they can get them, as a charity.

    1. 5

      I see all of these articles about what messenger app to use. None of those address the real problem: they don’t work for the people I talk to.

      A lot of my friends are furries and we use telegram exclusively because it supports stickers. It’s impossible to understate how important stickers are for us.

      The Furry Writers’ Guild, moved our Slack server to Discord. It’s been hugely popular. We couldn’t get anyone to use Slack.

      My church uses Facebook. I’m not on it and I’ve effectively not been a member since March as a result.

      A few of my friends use Twitter direct messages.

      My family uses SMS. (And my uncle keeps trying to push everyone to LinkedIn.)

      I know exactly one person on Earth who uses Signal. He’s on Telegram because he can’t get his friends to use Signal.

      1. 5

        I remember a time when it was MSN Messenger, YIM, AIM, ICQ or IRC and you could have one open source client that was able to provide a single interface for the lot.

        1. 1

          You can do the same thing with Matrix but it’s no where near as simple or accessible as Pidgin/Trillian/Audium/etc. Signal and Telegram have APIs, but Facebook and Google make it incredibly difficult to interface with their messengers.

        2. 2

          Signal has stickers. Though I guess that’s not super relevant to this discussion, since Delta Chat apparently doesn’t.

          1. 2

            The Signal folks, at least, seem to understand this. It supports sending emoji, has sticker packs, and makes it very easy to share photos (as in, UI in the mobile app for taking a photo and sending it, just like WhatsApp). The big missing feature is the ability to have video / audio calls with more than two people. That said, the Signal desktop clients (unlike WhatsApp) do support video calling. This is the killer feature for some of the non-technical folks I talk to - everyone has had to have the hardware for video conferencing on a laptop to be able to join work calls while working from home during the pandemic and going from a Teams or Zoom call on a laptop (with or without an external monitor) to having to use a tiny phone screen for WhatsApp calls is frustrating. With Signal, you can call directly from the desktop app and answer calls in it. We have used that feature with my mother quite a lot over the last year.

            1. 1

              Signal supports video/audio calls with up to 8 people. The most recent release raised it from 5 to 8.

              1.  

                Huh, looks like it was added in the middle of December. I’m a month out of date. Here’s the announcement.

          1. 32

            Well written article and an enjoyable read. Only part I disagree with is your stance on “early exit”, it turns out that this is the tiny hill i’m willing to die on, one I was unaware I cared about until now. I think this is primarily because if I read code that has a return within an if block then anything after that block is inferred else.

            I could become pedantic and retort that all control flow is a goto at the end of the day but I wont, because that would be silly and this was a genuinely good read, thank you for sharing.

            1. 17

              I also was surprised how much I disagreed about the early exit.

              When I originally learned programming, I was told that multiple returns were bad and you should restructure your code to only return once, at the end. After learning go (which has a strong culture of return early and use returns for error handling), I tend to favor early returns even in languages that don’t use returns for error handling.

              The thought process I’ve adopted is that any if/return pair is adding invariants, eg if I’m at this point in the program, these previous statements must be true (or they would have exited early). If you squint at it, you’re partway to pre/post-conditions like in Eiffel/Design By Contract.

              1. 3

                I had a similar experience, from “only one return” to “return early” And I think it depends on the domain and language you are using too.

                One project I worked on was initially written in C and then moved to C++ and started by people who mostly wrote java. There is a common pattern in C to use goto near the return statement to free memory when you exist (think of it as a defer in go but written by hand), and since goto‘s are the hallmark of bad programmers and returning early was not an option the dev’s came up with an ingenious pattern

                int result = -1;
                do {
                  if (!condition) {
                    break;
                  }
                  result = 1;
                } while (false)
                
                return result;
                

                it took a while to decipher why it was there but then become common place because your promotions were heavily influenced by your “coding capability”

                1. 3

                  When I originally learned programming, I was told that multiple returns were bad and you should restructure your code to only return once, at the end.

                  Ah, so functional programming </sarcasm>

                  1. 2

                    Pure functional programming is all about early returns, if anything. There’s just no return keyword. When everything is an expression, you can’t store now and return later.

                    1. 1

                      In a pure functional language the whole function is a single expression – I fsil to see how it is “all about early returns”? Certainly you can simulate imperitive return or raise using various tricks, but ultimately there is always just one expression and that is what gets returned, anything else is syntactic sugar.

                      1. 3

                        Conditionals and pattern matching are expressions. This means you’d have to put effort to avoid an early return.

                        Consider a function that converts boolean values to string in the canonical structured style with a single return.

                        function bool_to_string(x) {
                          var res
                          if(x) { res = "true" } else { res = "false" }
                          return x
                        }
                        

                        In a functional style it’s most naturally written like this:

                        bool_to_string x = if x then "true" else "false"
                        

                        We could put an extra effort to store the return value of if x then "true" else "false" but it looks like obviously useless effort:

                        bool_to_string x =
                          let res = if x then "true" else "false" in
                          res
                        
                2. 2

                  I think early exit is OK in the sense of basically guards against invalid inputs and your language lacks the ability to express it in other says - you know, C. (Probably the same for freeing resources at the end, since you don’t have finally or defer.)

                  1. 2

                    Strongly agree with you.

                    I first came upon early returns as a recommended style in Go, under the name of “line of sight” (the article makes a good case for its benefits), and have since become a huge advocate, and use it in other languages as well.

                    Knowing all your if-indented code represents a “non-standard” case makes the code really easy to scan and interpret. Aside from leading to flatter code, it leads to semantically uniform code.

                    1. 1

                      +1 on early exits. They’re clarifying: the first thing I do in many functions is check various corner cases and then early exit from them, freeing up my thought process for everything afterwards. Knowing that those corner cases no longer apply means I don’t have to worry that someone — and “someone” might even just be me, in the future — adds some code that doesn’t handle the corner cases well after the terminating } of the else block (or de-indent, or insert syntax here for closing an else block).

                    1. 3

                      I love seeing procedural art like this, doubly so when how its produced is described in this kind of detail.

                      1. 1

                        Back around that time there were a lot of e-commerce shops running software called Actinic (which has at some point in the time since I last used it been bought and suffered from synergy.) This software ran as a windows application in to which you could add all your stock details, images, etc and select from a handful of e-commerce templates, and/or modify/create your own.

                        From that local database it could generate a static website with a handful of cgi scripts and upload it to your host of choice (while they would prefer you use their service.) None of the Actinic e-commerce websites I saw used https but all handed purchasing and most handled payment collection within the website itself. How was that done securely you ask?

                        As far as I could tell at the time, the card details form had some js that would encrypt the input and post it to the cgi script which would then store in a txt file. The Actinic desktop software had a sync button that once pressed would download any pending orders from the website, to which you would enter the card details into your card machine manually, print off the receipt, pack and ship the lot off to the customer.

                        The one I worked on got quite popular, so much so that we “invested” in a third party card processor which acted a lot like paypal in that the shopping cart would redirect the user to the third party payment processor, they would using https collect the payment details and charge the card before redirecting back to the cgi script with the status.

                        TL;DR For the majority of the time I worked there their e-commerce website worked without https.

                        1. 1

                          Im currently reading Game playing with BASIC, a book authored in the 70s and The People Vs. Tech.

                          I have a shelf of vintage computing books from the late 50s to the early 90s that I like to digest alongside modern books on astrophysics, sociology and various theories around quantum mechanics.

                          1. 5

                            One addition to add to this list, compiled source files from js and/or css. For some reason my build environment was compiling our webapps with hashed filenames but not cleaning the public folder between runs. With hot reload and a hundred to a thousand compilations a day I just managed to delete nearly 120GB of redundant js+css files.

                            1. 2

                              This is a problem I am currently facing at work.

                              We run virtual events of up to fifty participants, for 99% of the time the server stack remains at near zero load until the event gets moved into a new phase and there is a tsunami of activity (~100 req/min to ~100 req/sec) for a brief moment in time.

                              I’d like to be able to automate load testing but it would involve spinning up 50 user agents able to connect a fake video and audio source to our av solution, and then running through at least one cycle of our event schedule entering data, navigating, etc.

                              So far my solution to this has been to get everyone in the office together a few times a month for a real world load test. If someone can offer a better more automated alternative I would snap it up.

                              1. 2

                                Oh hey, that’s almost identical to the traffic patterns that we have! We have very low traffic until the moment things start, then it’s a huge spike of traffic as everyone starts at the same time.

                                If you can generate enough load with everyone in the office that seems pretty reasonable (especially since you could do that by dogfooding your product for something like a town hall or internal conference). If you do look into automating more I’d love to have a chat about the problems you run into or how you approach it because it sounds like we’re facing similar problems in different markets.

                              1. 2

                                This came up in my feed on YouTube over the weekend; it was a lovely watch and I would go so far as to say the best #DOSCEMBER video I have seen so far! They seem to be a relatively unknown creator so it gives me a warm feeling to see their work get recognition.

                                1. 36

                                  Our UI was showing a lot of activity in the tiny island nation of Niue. We didn’t expect to see a lot of information security incidents involving a country of fewer than 2000 people, so we suspected a bug.

                                  Turns out the UI was looking up locations by the two letter ISO country code. The first two characters of NULL, converted to a string, is “NU”…the ISO country code for Niue.

                                  1. 12

                                    Fun fact, the Niue TLD is very popular in Sweden, because “nu” means “now” in Swedish. So you get snappy domain names like vecka.nu, which is a single-serve website that displays the current ISO week number.

                                    1. 4

                                      In Yiddish, “Nu” means “so?”

                                      1. 2

                                        Interesting, “nu” also means “now” in Dutch, but the Niue TLD is not popular at all here. Apparently you need some domains to bootstrap the popularity.

                                        1. 3

                                          I think that is because it became known when a whole bunch of cheap second-rate brands and stores started to use .nu as a substitute for .nl and now it feels as a TLD for fake and low quality content.

                                        2. 1

                                          Serendipitously I was looking for something that could give me the current ISO week number at a glance rather than searching “current weeek of year” in Google. Bookmarked this for just those cases.

                                          1. 1

                                            You can use date +"%YW%V" for ISO weeks, date +"%YW%U" for US weeks (1st day of week is Sunday).

                                            BTW next week will be week 53 as NYE falls on a Thursday.

                                            I think I filed a bug at vecka.nu years and years ago where they missed that corner case…

                                      1. 1

                                        I have often pondered that as machine learning becomes increasingly more complex and able, reasoning about why it has come to a conclusion will become equivalent to reasoning about why an animal made a decision.

                                        To that end I don’t believe machine learning is fundamentally unexplainable, but that as it becomes more capable that reasoning will shift from analysing it as a machine towards analysing it as a mind.

                                        1. 3

                                          This is a well written essay! I have seen people poke fun at months starting from zero in JavaScript a few times and always responded with “its a little more complicated than you might think.” Every decision has a history, usually the answer is “because it was a good idea at the time.”

                                          1. 3

                                            Every decision has a history, usually the answer is “because it was a good idea at the time.”

                                            I disagree with this; I think it’s more “because the people who made the decision did an insufficient job of understanding the breadth of the impact of their decision”.

                                            1. 2

                                              Things change, technology advances and make possible better solutions. It’s easy to point at a decision with hindsight and say it should have been made differently.

                                              1. 4

                                                Sure; in some cases they never could have known how long we would be dealing with the fallout of a short-sighted decision. In every case they were wrong, but in some cases they couldn’t have been expected to be right.

                                                But in the case of Java specifically, they had decades of experience shouldering the burden of decisions that lingered long after they made sense. They implemented the JVM largely in C++, for pete’s sake. Every line of code in the JVM was typed on a keyboard whose design reflected hacky workarounds for constraints that had not been relevant for nearly half a century. Every person on that team had a tangible reminder of this kind of problem sitting on their desk that they spent hours every day touching.

                                                Learn from history.

                                                1. 3

                                                  I think a better example might be the relationship between the 1990s fad for “interactive TV” setups where you’d have a box that you plugged in to the television set, and Python’s GIL.

                                                  Python predates Java (Python in 1991, Java in 1995). And it came out of the UNIX scripting-language world where if you needed to write a program that could multitask, you did it by forking new processes. Then Java came along, and one of its original targeted use cases was constrained systems like… those “interactive TV” boxes, which generally could not do true process-based multitasking. So Java went with threading, and threading became a hugely popular model.

                                                  At the time, several things were true:

                                                  • A huge part of Python’s popularity was the relative ease with which it could wrap and interface to C. There wasn’t an ecosystem of Python libraries, so much as there was an ecosystem of C libraries for which people had written wrappers to allow access from Python.
                                                  • Neither the Python interpreter, nor most of that wrapper/C code, was thread-safe.
                                                  • Most people who would want threading would be using it for I/O-bound tasks like writing network daemons.
                                                  • Most people, even if they were writing multitasking code, still had only single-processor/single-core hardware on which to run it.

                                                  So a decision was made to open up the ability to write threaded code in Python: there would be a lock which gated access to the interpreter and its C API, and only a thread – and only one at a time – which held the lock could execute Python bytecode or use the interpreter’s C API. Thus, the Global Interpreter Lock.

                                                  This was a perfectly reasonable decision then, and for quite some time into the future, and allowed people to keep using Python and all those handy wrapped C libraries as before, but with the addition of threading. And since your hardware was unlikely to be able to actually execute multiple threads simultaneously, and you’d almost certainly have lots of threads idling, doing things like waiting for data from a socket, it didn’t really restrict you that much or impose too much performance penalty compared to the normal overhead of just using Python itself.

                                                  But fast forward a few decades. Now we all have multiprocessor/multicore hardware, even in the phones we carry around in our pockets. And Python grew from a UNIX-y scripting language to something that’s used in scientific computing with heavy CPU-bound number-crunching loads.

                                                  And now we have endless wailing and gnashing of teeth about the GIL, and endless projects that try (and, so far, fail) to remove it, because making the whole thing thread-safe without the GIL today would still require a huge rewrite of all the legacy non-thread-safe code people wrote and wrapped in the past.

                                                  (incidentally, the implementation of the GIL has evolved to try to reduce the overhead for some now-popular types of work, and number-crunching libraries like NumPy are careful to delineate – there are macros for this – which parts of their C code require access to the interpreter and thus the GIL, and which parts don’t and can release the GIL while continuing to do work that doesn’t involve the Python interpreter)

                                                  1. 3

                                                    Well, they’re kind of … two examples of opposite things, I guess? java.util.Date is a classic “come on, you could have seen that one coming” situation because examples of precedent were abundant, while the Python GIL is a good example of a “difficult to predict the impact” situation because multi-core CPUs sounded like science fiction at the time.

                                                    1. 3

                                                      A lot of people react to hearing the historical design tradeoffs behind the GIL the same way you’re reacting to the date thing, though.

                                                      (ask me how I know, or, on second thought, you probably don’t want to)

                                                      1. 2

                                                        Yeah, the difference between “come on, you could have seen that one coming” and “difficult to predict the impact” is how good you are at prediction (which itself is built on domain knowledge & familiarity with history).

                                                        Also, generally speaking, when we see discussion about these decisions from the time they were made, it turns out that often somebody DID see that one coming & was shouted down on the grounds of “being practical” and “meeting deadlines”. It’s fascinating to read TBL’s mailing list posts from the early 90s about how important it is to create a URI/URL distinction and a reliable distributed URI to URL resolution system in order to avoid domain squatting and broken links.

                                                  2. 2

                                                    Absolutely agree, it would seem in some cases people have just kept with the status quo without questioning why it exists and whether those reasons are now obsolete; I would argue that this is more often than not because in order to do so the decision maker would have to think outside of their narrow field of vision which is easier said than done.

                                                    1. 1

                                                      Case in point: http://lists.busybox.net/pipermail/busybox/2010-December/074114.html

                                                      The /bin vs /usr/bin split (and all the others) is an artifact of this, a 1970’s implementation detail that got carried forward for decades by bureaucrats who never question why they’re doing things.

                                                  3. 1

                                                    Yeah, a better phrasing might be “it sounded like a good idea at the time” (where “sounding like a good idea” includes both reasonably-predictable and unpredictable future problems). A lot of people think things sound good because they haven’t actually considered them, and instead are doing shallow pattern-matching on words. Some of these people are in charge of major technical decisions that directly impact millions of users.

                                                1. 1

                                                  Oh this sounds positive.

                                                  1. 1

                                                    I make heavy use of Github issues in my blogs repository for drafting posts; you have gone one step further to use them as a rudimentary CMS. I love it.

                                                    1. 4

                                                      Isn’t this how Facebook’s Hack started out as well, before moving on to a JIT? Interesting how Facebook’s Russian competitor is doing the same years later.

                                                      1. 2

                                                        According to https://github.com/vk-com/kphp-kdb, they did this in 2009.

                                                        1. 1

                                                          Yep! Though according to the disclosure it has been used in production for a while. It is interesting to see a different take on this approach; personally I think JIT is the winner here but nonetheless it’s intriguing.

                                                          1. 1

                                                            Am I right in thinking that with PHP8 it will begin compiling hot areas of code to native in order to get the best performance? I remember there being an option with PHP7 to do something like that but it had to be switched on and configured.

                                                          2. 1

                                                            You never know for sure, but the plan is that it’s always going to be AOT compiled and it’ll not become a completely different language like Hack.

                                                            KPHP is a compiled (and quite strict) subset of PHP with some features like tuples that are easily emulated with kphp-polyfills in normal PHP.

                                                            Developers use normal PHP during the development phase, so no KPHP VM is needed. When the code is deployed, it’s being compiled. It’s tempting to create your own language, but sometimes you need to limit your desires to stay practical. :)

                                                          1. 9

                                                            This is just the kind of content I joined lobsters to be introduced to. Well written, interesting and authored by someone who has both experience-in and an admiration-of the subject. Thank you for sharing.

                                                            1. 1

                                                              Finally an explanation I can understand.

                                                              1. 34

                                                                I haven’t bought a new dev machine in … eight years. Reconditioned, ex-corporate, Lenovo ThinkPads are where it’s at for me.

                                                                Currently I’m running a W540 - high-res screen, 16GiB RAM (up to 32GiB), 500GiB SSD dual-booting Ubuntu (for play) and FreeBSD (for work). Cost me AUD$400 less the SSD. Prior to that, for several years, I was running FreeBSD on an X220 that I purchased for around AUD$300.

                                                                https://duncan.bayne.id.au/photos/Working-_Hacking-_Making/x220_at_fresho.jpg

                                                                My three children run Ubuntu on ThinkPad X250s. Having identical hardware and OSs makes management easy. Also purchased refurbed ex-corporate; most recently an 8GiB / 128GiB X250 for AUD$345 including shipping. Lightning fast with Ubuntu, and they can do all their kid stuff: Minecraft, Starbound, Spotify, Wesnoth, DOSBox (for retro games), etc.

                                                                I might break the habit, though, with my next dev machine. Since the COVID-19 pandemic I’m looking at buying a new desktop (or maybe rackmount?) system and just using a laptop as a client when I’m not at my desk. If I do, though, it’ll be another refurbished X-series.

                                                                1. 6

                                                                  My three children run Ubuntu on ThinkPad X250s

                                                                  Wow, you really spoil your kids; mine are on a T410 and T420. =) Works great for Minecraft, TIC-80, and SNES/Playstation emulation, and they don’t have to use a chiclet keyboard. The kid with the T420 has to put up with a 16:9 aspect ratio, but … life is never perfect.

                                                                  1. 5

                                                                    They used to run older X-series (our eldest, for example, had my old X220). But I standardised on current-generation power adaptors and docking stations for convenience (so we can share equipment). One of the reasons I’m looking at the X-series again for myself after the W is that the W requires 170W power adaptors o_O

                                                                    Our family tradition is that, when you turn three, you get your big boy / big girl’s bed, and you get your first ThinkPad with Ubuntu.

                                                                    1. 2

                                                                      Standardizing on power adapters is also part of why I won’t buy the newer ones with the chonky rectangles. I must have ten or twelve of the barrel jack adapters in various places around the house. =)

                                                                      1. 2

                                                                        You can get barrel -> rectangle adaptors I believe. If you don’t have docking stations to consider, that might be an option.

                                                                        The only reason I upgraded from my old X220 to a W540 is that I was doing a lot of work on trains at the time, and the 768px screen was a bit of a liability.

                                                                        I’m seriously tempted to switch back to an X200. They’re old, now, but I still think they represent the pinnacle of X-series design: old IBM-style ThinkPad keyboard, ThinkLight, no trackpad (only TrackPoint). Would make a fine client for a desktop / server, especially with a newer screen panel and CoreBoot.

                                                                        1. 1

                                                                          I’m seriously tempted to switch back to an X200.

                                                                          I used to have an X200 and I’d suggest considering the X301 instead; full-size classic keyboard, just as light, same 1440x900 resolution but slightly larger, and the palm rest is done with rubberized carbon fiber instead of plastic. Back in the day it also had a bonus of having two battery bays, but sadly these days you can’t buy a battery for the second bay unless you want to take a chance on a cheap one that will likely balloon up and crack your chassis from the inside. The main downside is that it requires a special 1.8-inch SSD.

                                                                          1. 3

                                                                            Ooh, thanks for letting me know - that looks perfect. Found this article while Googling the 301, too: http://panacek.net/post/x301-rebuild/

                                                                  2. 4

                                                                    I too look for reconditioned ex-corporate, Lenovo ThinkPads and have been using a i7 X230 for a while, I was so impressed with it that on the day after it arrived I ordered another from the same re-conditioner, except I asked them to add the maximum RAM it would support and a bigger SSD so I could use it in a professional capacity.

                                                                    The only reason I might upgrade now is to a machine that plays Minecraft as I find that game a great relaxing exercise akin to colouring or reading a book.

                                                                    If you don’t mind a quick question: Would you say a X250 would suffice, or should I be looking at something newer?

                                                                    1. 2

                                                                      The X250 is just fine for Minecraft - in fact it played perfectly well on my old X220. It’d make a perfectly acceptable development system, actually, unless you were doing a lot of work with containers at which point 16GiB might become an issue.

                                                                    2. 4

                                                                      I haven’t bought a new dev machine in … eight years.

                                                                      I typically buy a new desktop computer every 5 years, so try to find a sweet spot in terms of good components that’ll be sufficiently performant for that long and allow for a bit of upgradability (usually a new GPU a few years in).

                                                                      I’m presently at 7 years on this machine. CPUs haven’t gotten majorly faster compared to previous cycles, so I’ve found it difficult to justify the expense for only a 2-3x speedup. The Ryzens look like they might be worth it though.

                                                                      1. 5

                                                                        Ryzen is absolutely worth it. The increase in core count is amazing for certain workloads (including compiling, if you’re into that)

                                                                        1. 1

                                                                          My main work use of more cores would be benchmarking to optimise some multi-core locking, as I’m limited to the 4 real cores I currently have. Might also be use for gaming, while a few other applications are running.

                                                                          1. 1

                                                                            I’m generally a fan of re-use but I totally agree. Not every workload or work pattern needs a monster machine, but I think many of us who do software environment on the regular could probably benefit from one.

                                                                            One question I’ve been pondering though is “Does my LAPTOP need to be something beefy?”

                                                                            I’ve been experimenting along these lines with my PineBook Pro for the last few months and for me and my use cases thus far the answer is a resounding no.

                                                                            I have my monster beast machine on my desktop, but for a laptop I am loving something that’s light and very energy efficient. It does 90% of what I need 90% of the time, and that’s plenty enough for me for a laptop :)

                                                                            1. 3

                                                                              Oooh! What’s your experience of the PineBook Pro been? I’m tossing up between one of those and a refurbished X-series ThinkPad as a next machine. My main sticking point is the lack of FreeBSD support; I’ve only recently switched back from Ubuntu as my work OS, and would hate to have to switch back again.

                                                                              1. 2

                                                                                Hiya! Expect to see a write-up posted here from me today or tomorrow, but real quick:

                                                                                I know there is a FreeBSD port underway but… RealTalk - if you plan to actually USE the laptop for productive work you should either A) suck it up and plan to use the already specially tuned Manjaro or Debian Linux images OR B) plan some sincere time for kernel hacking and tuning. The Pinebook Pro has a ‘big/little’ CPU combo that’s not something you see in the X86 world. If your kernel isn’t tuned specifically for that, performance will be utter crap.

                                                                                1. 3

                                                                                  Thanks :) Yeah I’d assumed (a) - which isn’t a deal-breaker mind you, especially if I’m using it essentially as a client for a FreeBSD desktop / server.

                                                                              2. 2

                                                                                I agree, I did a significant amount of development on a Lenovo IdeaPad with a super light wm and vim. I didn’t need anything more for what I was working on. Now my day job is a different story… I regularly make all 12 cores hurt.

                                                                          2. 1

                                                                            I haven’t bought a new dev machine in … eight years

                                                                            My main machine is over 10 years old, though I recently added RAM and a new gfx card.

                                                                            1. 1

                                                                              Amazing story. During the last 12 months me and my wife got used laptops.

                                                                              We got 2 laptops (A Lenovo Ideapad and Acer Nitro/VX series), mine with a better processor but her with a way better GPU(she does some rendering for his work/jobs) and we paid as much as 2/3 of what we would pay on her notebook alone. Both already equiped with 240GB ssds and 1TB HDs.

                                                                              Also, i had a FX-9370 on my desk and that thing was power hungry. Sold it to a friend by a modest price cause he wanted to play old games and do some console emulation.

                                                                              1. 1

                                                                                Where do you buy used in Australia?

                                                                              1. 4

                                                                                I like this for its purity, however for my sanity I would still opt for utilising third party libraries rather than writing everything myself.

                                                                                1. 2

                                                                                  Definitely, see my other answer :)

                                                                                1. 15

                                                                                  One I can not live without anymore is hstr: https://github.com/dvorka/hstr

                                                                                  1. 7

                                                                                    Worth noting: If you use set -o vi (highly recommend anyway), you can search command history with /<search term> and then n (any number of times) to flip through the matches.

                                                                                    1. 1

                                                                                      omg, this is life changing!!

                                                                                      1. 3

                                                                                        how? it is just fancy ctrl-r

                                                                                        1. 3

                                                                                          Yes it’s fancy ctrl-r but for people like myself who find ctrl-r clunky to use and also find remembering long command strings difficult it’s a huge help.

                                                                                          1. 1

                                                                                            With regex search though

                                                                                        2. 1

                                                                                          Any reason to prefer this over fzf’s built-in fuzzy history search?

                                                                                          1. 1

                                                                                            I found it faster and more intuitive, but I am using it for years now and never tried fzf again, so things may have changed wrt fzf