HNHacker News
TopNewBestAskShowJobs

cstrahan

1,132 karma · joined January 10, 2012

Charles Strahan cstrahan.com

Software Developer in Washington, DC

[ my public key: https://keybase.io/cstrahan; my proof: https://keybase.io/cstrahan/sigs/yV0wzDolQldJ9GSMuflLE9_PIggrsCf9jzIQPUHqzKE ]

submissionscomments
cstrahan··on Acer Aspire 1 ARM Laptop Has Nearly Complete Upstream Linux Support
> Need more power? The new Macs are absolutely great. I'm eyeing Asahi Linux too. It seems it can't do USB-C video yet, which is how I've so far avoided having a KVM switch.

Unless something changed very recently, Asahi can’t do any external video on the Mac Books (only HDMI on the Mac Mini, and maybe not all variants thereof).

External video on Asahi Linux is the only thing keeping me from considering a Mac Book Pro purchase. I simply can’t stomach working without a 27” 4K monitor.

cstrahan··on The day I started believing in unit tests
> It’s also not possible to write a non-trivial program in Rust.

You should probably clarify that it’s not possible for you to write non-trivial programs in Rust.

And that’s okay! No one comes into this world knowing how to do any thing, but we can all learn if we choose to.

If you have a particular sticking point, I’d be glad to give advice.

cstrahan··on FFM (Foreign Function and Memory API) Goes Final
> You know a lot about JRuby's use of FFI!

Back when IronRuby (the Ruby implementation for .NET) was still actively developed, I decided to work on a port of the ffi gem for it. The JRuby code base provided some great ideas, thus my familiarity (but that was well over a decade ago now — time flies and memories fade, haha). Sadly, I reached 100% test success rate the same week Jimmy Schementi announced his departure and the writing was on the wall for IronRuby and the other IronX languages, so I never released my work.

Thanks for all you’ve done, btw! Your efforts and general enthusiasm definitely inspired me to dig into language implementation and other explorations.

> One correction though, JRuby uses a reimplementation of jna called jnr, which is generally much faster (close to jni for simple calls).

Thanks for the correction. I might have to take a look at JNR sometime!

> We are working with folks on the FFM team to re-implement the core jnr back end. It's very exciting work, and I will present it this weekend at RubyConf Taiwan!

That’s exciting news - I’ll keep an eye out for the talk once it’s available online.

cstrahan··on Pornhub, XVideos, and Stripchat hit with tough new EU safety regulations
I thought it was pretty clear that the GP comment is suggesting that PornHub et al will simply stop serving to the EU, which is a perfectly fine, legal thing to do.

If that’s what happens, you will need to use a VPN to access these sites, should you want to do that.

cstrahan··on Show HN: Interactive ECS Systems/Component Explorer for Cities: Skylines 2
> it's one of the first games that is using ECS and that I also have a deep interest into

FWIW, I did read to the end of the line, but I parsed that as two separate assertions (with “and that” being a means to introduce the second assertion):

1) it is one of the first games using ECS

2) that you also have an interest in it

Rather than the intersection of:

1) the set of games using ECS

2) the set of games that you have an interest in

Or, expressed another way, it’s this (how I read it):

(it's one of the first games that is using ECS) and that (I also have a deep interest into)

Vs

it's one of the first games that: (is using ECS) and that (I also have a deep interest into)

I suppose I would have written this:

It’s one of the first games using ECS which I have also had an interest in.

I’m fairly certain I’ve almost always seen something like “[of] which” to introduce another qualifier, whereas “and” almost always introduces a new statement that stands on its own (the exception being in more formal contexts where there’s a sentence structured along the lines of “consider such [insert class of objects here] which are both: [this] and [that]”).

I think it’s the “and that” which threw me (and others here who misread you) off.

cstrahan··on Beeper Mini is back
Which other 3 platforms come preinstalled?

Edit: wait, are you talking about iMessage being preinstalled? If so, how does iMessage being preinstalled make it dwarfed by other non-preinstalled platforms? Are you suggesting it’s human nature to use third party apps, or maybe you mistook the meaning of “dwarfed by”?

cstrahan··on FFM (Foreign Function and Memory API) Goes Final
JNI allows one to write C code that bridges the gap between the Java VM and existing C libraries. That C code must be compiled, and must follow some rather tedious patterns (regarding method signatures and other little details). It’s a bit of a pain to write and compile, if all you want to do is quickly call some function from an existing C library.

Also, because symbol resolution is done at compile-time, this is a non starter for something like JRuby, wherein one would want to write plain Ruby code to call a C function — rather than writing Ruby, Java and JNI flavored C code. Ruby is an interpreted language, so calling into or out of C requires dynamic symbol resolution, and for the C->Ruby callback case, a closure must be created on the fly (that is, a C ABI function must be JIT compiled for that method or proc). This isn’t particular to Ruby — any interpreted language will run into this issue on the JVM (picture Python and its ctypes and/or cffi libraries).

You can see some of the hoops that JRuby had to jump through to support this use case, in order to provide a JRuby implementation of the ‘ffi’ gem interface:

https://javadoc.io/doc/org.jruby/jruby-core/9.2.13.0/org/jru...

https://www.igvita.com/2009/01/15/bridging-mri-jruby-rubiniu...

It’s been a minute, so my recollection may be wrong, but IIRC JRuby uses Java and JNI to call into a C shim that then calls into libffi to handle things like creating C ABI conforming closures and such on the fly (the ffi gem on CRuby also uses libffi for the same purposes).

Correction: I believe JRuby uses JNA, which in turn is Java+JNI to call C that then calls into libffi, which is then leveraged to call whatever other functions (or create C callbacks back into the JVM). So I’m pretty sure FFM would be an officially supported replacement (maybe superset?) of JNA. (I’m on vacation and typed all of this out on my phone, so forgive me if I got some details a bit off)

I’m pretty sure that just about all of that complexity can be ripped out once FFM is generally available.

cstrahan··on Ripgrep 14 Released
I’ll also throw in Leah Neukirche ‘s xe as a better alternative to xargs: https://github.com/leahneukirchen/xe
cstrahan··on Nvidia sued for stealing trade secrets: blunder showed rival company's code
One more possible explanation:

Maybe the employee sees greater potential at another employer (whether for positive impact on the world, or just better execution of their own vision, or whatever) and wants to pick up where they left off, instead of having to restart.

Everyone seems to assume some explanation involving money or laziness, but it could be for a less selfish (though still illegal/immoral) reason.

While I wouldn’t steal IP, I can appreciate a somewhat similar sentiment: looking forward to patents expiring. There are too many scenarios where a company creates and patents some new invention, only to produce some product that kinda sucks… until the patent expires and someone comes along and does it right and at a lower price.

cstrahan··on Vehicles with higher, more vertical front ends pose greater risk to pedestrians
> No truck should be able to go above 60 mph; that alone will make them much more unattractive.

So people spend longer getting to their job site? I don’t get it. Sounds like a waste of human potential, keeping people on the highways longer.

cstrahan··on How I got here
> How does that work exactly? How does one end up with a tint amount for personal consumption if someone else couldn't legally allowed to have enough to sell?

Same way people acquire guns illegally in US states that prohibit gun ownership: involved parties choose to break the law.

> Seems really strange that the government would have bothered decriminalizing consumption if the supply itself is illegal.

These governments take the stance that drug dealers exploit the addictions/circumstances of their customers, exposing them to more harm. So they make selling (or possessing enough that an intent to sell seems probable) illegal.

Because the users are at worst harming themselves (assuming they aren’t doing something like driving while intoxicated, or parenting under the influence, but there are laws that already handle these scenarios), these governments don’t see the point in further harming the users of these drugs by locking them away in prison. So drug use is legal, and possessing a small amount (so small that it would be unlikely you’re selling) is legal. Also, because the use of drugs is not illegal, this makes users more likely to seek help, whether from their community or resources provided by their government.

cstrahan··on macOS Sonoma Boot Failures
> No, that seems pretty super-user to me.

Here's a play-by-play scenario.

1) Grandma is prompted to update to Sonoma, and so she does.

2) But note that the installer does not update the recovery partition.

3) Laptop reboots, and grandma sees an Apple logo for exactly 2 seconds, and then the screen goes black. Manually rebooting results in the same thing, every time.

4) Grandma now tries to roll up her sleeves and see if she can fix it. She googles around, and discovers that the she should be able to get into the Recovery OS and maybe fix things there... but when she tries to do that, same thing: apple logo for 2 seconds and then black screen.

How did I come up with this play-by-play? Well, because today I was said grandma.

Where does this involve the average user going back in versions of their on volition? That's the whole point of why this bug is horrible: you get no say in the matter. You upgrade to Sonoma, and depending on your refresh rate, you can't boot into your OS. Wanna use the Recovery OS? Too bad: that's too old to know to use a functioning refresh rate settings (because the installer left the old Recovery OS version in place), and instead it uses whatever was set in NVRAM (or similar) from when you last configured the refresh rate.

Wasted today using another MacBook to update the Recovery OS via DFU (using Apple Configurator), and now I'm reinstalling Sonoma from that recovery, and praying that this will unbrick my laptop for work tomorrow.

cstrahan··on macOS Sonoma Broke Grep
Apple introduced a bug in grep that, under certain circumstances, causes grep to assert.
cstrahan··on Software disenchantment
> I'm suggesting that the blanket assertion doesn't hold true that slow software is painful software. Software can be so slow that it's painful but "slow" from the point of view of absolute does not immediately make something painful.

I agree with this. Though my interpretation of the blog post was that the complain was directed at the subset of "slow" software that is specifically "perceptibly slow, to a frustrating degree".

> A counter-example that the author used when describing people with a pride in inefficiency was to quote:

>> @tveastman: I have a Python program I run every day, it takes 1.5 seconds. I spent six hours re-writing it in rust, now it takes 0.06 seconds. That efficiency improvement means I'll make my time back in 41 years, 24 days :-)

Yeah, that quote (and attached commentary) did seem a bit out of place.

> I'm also asserting that slow and painful software that does what I want is better than fast software that doesn't or that I can't afford.

I agree here.

I suppose whether the blog post is is likely to resonate with someone comes down to one's prior notion of why frustratingly slow software is the way it is.

Some may believe that such software is developed by experienced, motivated developers who want to do their best work, but run up against a hard choice between allocating time to important features vs clever/tricky/novel optimization.

Others, like myself (based on my firsthand observations), believe that software can be just as feature complete while also being "fast enough (to not be frustrating)" all while using the same resources (dev time, money, etc). Developers just choose not to. It's not that anyone consciously thinks "hey, I think I'll go out of my way to write slow software" -- in the same way that (almost) no one thinks "hey, I'm going to strive to be morbidly obese"; rather, it's the lack of a conscious decision to employ self discipline and:

- Do not add layers of indirection because it "feels" right (I've seen countless changes that, upon questioning, can't be motivated beyond "I dunno, it 'felt' right"); instead, think through what you're doing. Just because you've thumbed through a design patterns book, or saw a blog post about dependency injection, or recently discovered runtime type reflection, doesn't give you license to cargo cult any of these things. If it was discovered that a bridge was constructed out of some material because the engineer(s) thought it "felt right", because the raw materials were "pretty" and "sparked joy", or maybe even "tasted good", I'm sure almost everyone would be horrified at such spectacular negligence. Somehow, similar behavior in the software world is perfectly acceptable.

- Do not add libraries and frameworks and orchestrators and pipelines because your ADHD compels you to play with new, shiny things. I have ADHD, and the compulsion is there, but I choose to ignore it.

- Do not use some tech just because it's popular, with zero critical thought, thus applying the wrong tool to the problem at hand. That's a recipe for slow software that requires more development time, as whatever time you save by not engaging your brain will almost certainly be eclipsed by the time wasted trying to contort the tool you're abusing.

- If you're about to spend the next hour working on something, first spend 5 seconds to see if the standard library has a ready-to-go, optimal solution to your problem. An example from firsthand experience: early in my career, I worked on a desktop GUI application, using Windows Presentation Foundation (WPF). One of our devs needed to add an underline to a text label. At our standup, he reported that he expected to spend the rest of the day working on that one change. He and the lead developer discussed how he could develop a new, custom control, and how the custom rendering routine would work, and gotchas to watch out for (naturally, you'd need to gather subtle font/layout metrics to know where / how wide to draw the underline), etc. I mentioned that an underline decoration is something that the standard WPF text label control already supports out-of-the-box -- the change would be something as simple as adding underline="true" to the respective XML element that declares that control. That was uncritically shot down with "No... no. I don't think that's a thing". The only reason we didn't lose 8 hours+ of developer time that day was because I did a 5 second Google search after that meeting, found the MSDN documentation page for that "underline" setting, and sent it to the developer, and he chose to implement that 5 second change instead of creating a custom component. Of course, the lead developer rejected the changes as "this wouldn't compile", though I had already compiled and spun up the app; because I'm diplomatic, I asked if he could look at something, and inquired "so, I know this underline probably isn't quite what we need, but I was curious if you could give some pointers on how our custom implementation would need to differ?" -- he was stunned, finally realized that the existing, bog standard control already had this functionality, and then approved the change.

I would bet anything that 99% of painfully slow software could be pretty snappy (or at least "snappy enough") if the developers thereof wouldn't create more work for themselves by doing inane things. No hyper optimization, bespoke algorithms, nor heavy R&D required.

cstrahan··on Software disenchantment
> Admittedly, I stopped reading just over half way, but the crux of the argument appeared to be that software should be fast, though I don't recall any justification for that philosophy other than suggesting that it is basically a truth.

Are you suggesting that maybe users (including you and me) should have to put up with painfully slow, stuttering software? I don’t see why his claim requires any justification - to my mind, it should be just as self evident as the fact that inflicting physical pain upon others should be avoided.

> […] modern software developeres tend to aim to be "fast enough" in the way that an structural engineer would choose "strong enough."

But they don’t aim to make software fast enough. My experience last week: Windows 10 file Explorer took ~2.5 seconds to open. Close it and re-open it: same thing. Open it, right mouse click another folder to open a new Explorer window: same thing. Fresh install of Windows 10 on a top of the line workstation-type laptop with 64gb of RAM.

Not all, but a frustratingly large proportion of modern software is dog shit slow.

The reason doesn’t need to spelled out in the article: if the developers of these slow apps cared, they could figure it out. From my experience, it usually looks something like this:

Some developer has an emotional attachment to Protocol Buffers, and will stop at nothing to see its adoption within the org. But their software is pretty heavily invested in JSON. So they rewrite the software to read the existing JSON files from disk (or REST web service response bodies, whatever), and reserialize them to protobuf in memory. Tada! Now we’re using protobufs, great. Of course, nothing meaningful was actually achieved here - they already had a perfectly fine, ready to use, deserialized, in-memory data structure before they added protobuf to the mix. Oh, and that plain struct in memory was faster than traversing a protobuf: the former had small substructures laid out in the same allocation as the parent, whereas substructures in protobuf involves multiple allocations and chasing pointers. Next step: realize that REST is lame, and gRPC is hip. But it’ll be practically impossible to rewrite everything from REST to gRPC, so they do the only reasonable thing: create proxies that sit between the client and server that translate REST requests/responses to/from gRPC! Now that we have that in place, we can add an additional proxy to the mix: Envoy. Envoy is a super popular layer 7 proxy, so it’s gotta be good. What functionality will be used? Any load balancing? RBAC policies? TLS termination? Nope. None of it. But because Envoy is “good”, adding it to the stack with no justification must also be intrinsically “good”, right? Right!

(Edit: do you see how long winded and boring this example is? This is precisely why the author shouldn’t expound on the “why” - anyone involved in the development of needlessly slow software (who isn’t blind to the problem because they are part of it) can recount similar craziness. Adding this to their blog would make for boring reading, and distract from the aim of their article.)

Buzzword/resume driven development, unwarranted layers of indirection (for no gain), absolution of responsibility via appeal to authority (if the top 10 software companies created and/or use some software, then surely we can blindly use that software too and enjoy the same success, despite not giving any consideration to whether it’s even remotely the right tool for the problem at hand), cargo culting, etc.

The reason software is painfully slow usually boils down to lack of critical, rational thought: either out of laziness and/or deferral of responsibility, or because of some emotional attachment to some type of software component.

cstrahan··on Jumperless: Breadboard Without Jumper
> Needs a README imho

Is the “Description” section at the top not sufficient?

“Description

Using a bunch of analog crosspoint switches wired together into one bigger switch, Jumperless makes real, fully analog hardware connections between any points on the board or the Arduino Nano header at the top via serial, instead of needing to use jumper wires.”

Admittedly, the HackADay layout is pretty atrocious, and at east on an iPhone, the description is several pages down, after the picture gallery and a bunch of empty white space. Nonetheless, the “description” section is at the very top of the main textual content of the page.

Not much the project creator can do to fix HackADay’s bad layout, sadly.

cstrahan··on Fair coins tend to land on the same side they started
> that's what the host does in the other scenario to me.

Is it, though? It seems apparent that, after the first guess, the host opens all but the last two doors, which just so happens to be 1 door.

To check the math:

Start with the $NUM_DOORS open doors. Now open all but the last two. So that’s $NUM_DOORS-2, which is 3-2, which equals 1 open door.

cstrahan··on Indoor wood burning raises women’s lung cancer risk by 43%
Why should you expect ~2 million years of evolution to bread that out of us?

The ability to start and control fires for warmth and cooking purposes greatly increases the odds of survival for individuals and their offspring.

If I may personify evolution as form of rhetoric: evolution doesn’t care if you limp along through a painful life, or if your genes guarantee a horrific death at the end of it. Evolution only cares about your ability to produce offspring that in turn reach maturity and produce offspring of their own, and so on.

Resources are finite in this world, so sure, the fittest tend to outcompete less fit creatures, and the former will perpetuate its genes while the latter won’t. This is where the notion of “survival of the fittest comes from”. But it is a mistake to interpret that implication the other way around: that is, survival does not necessarily imply greater and greater fitness over time.

Evolution isn’t about species becoming the best they could be, it’s only about being good enough.

cstrahan··on DKIM: Rotate and publish your keys
> Other people being able to verify that an email really was sent by me does serve my interests, because such verification establishes trust. That's like claiming signing a contract isn't in your interest, because others will be able to prove that you agreed to its terms.

Are you saying that you do want people who are not your intended recipient(s) to be able to check copies of your emails to be able to verify that you actually wrote/sent those emails? Do you have an example of when this comes up in practice?

If you mean that you do want your recipient(s) to be able to verify your emails, the article is in agreement with you. The article states:

> When you send an email, that’s between you and the recipient. Normally you don’t intend for anyone, anywhere, who happens to get a copy, to be able to verify that it was really you that sent it.

where "anyone, anywhere, who happens to get a copy" is to say "an arbitrary person other than your intended recipient(s).

cstrahan··on DKIM: Rotate and publish your keys
> Proving something always comes with assumptions and caveats. Even if we're talking about proving something cryptographically, the underlying assumption is that crypto primitives are unbroken or that participants retain control of their keys.

Absolutely. Propositions have a premise and a conclusion. In regular conversation, it is usually safe to omit part of the premise when it is assumed that everyone is on the same page, otherwise communication would be overly laborious. I agree 100%. An example in my response: I said nothing of the assumption that the cryptography in use hasn't been broken through quantum computing or other means as I think it's pretty obvious that, if verification of authorship hinges on the cryptography functioning as intended, it should be apparent that "the cryptography hasn't been broken" should be part of the premise. Communication would be practically impossible if we all have to add in an infinity other ground truths, like "the brains of humans of earth haven't been taken over by extraterrestrial parasites", or "we're not talking about a point in time before humans came into existence", or whatever.

> In this context, DKIM definitely proves a user sent an email if you're willing to accept the assumption that the email provider is not arbitrarily sending emails that users did not write.

I was waiting for this comment.

I'll restate your proposition, to make it more explicit:

"If an email provider won't arbitrarily send emails that users did not write, then a valid DKIM signature for a given email entails that the author as indicated in the FROM header was indeed the actual person/entity that wrote the email."

And that's fine!

So, if we take the premise to be true (as it seems you do), then we arrive at "a valid DKIM signature for a given email implies that the author as indicated in the FROM header was indeed the actual person/entity that wrote the email". Great!

However, to clarify why I wrote my original comment, here's the important bit from the OP:

> A DKIM signature does not prove that an individual sent the email, the key is not personal. A DKIM signature proves that the sending service is a delegated sender for the domain. Meaning that a correct DKIM signature proves that the part after the '@' symbol in the sender address is authentic. Not the part before that. If you want to use a personal signature, you can use S/MIME.

There's nothing about this that suggests that this commenter would find the earlier proposition invalid. More than that, if we are charitable (as we should be, if we want civil, productive discussion) and assume that they actually do consult in this space, there is no reason for us to assume that they don't already hold this proposition to be valid.

What the original commenter wrote could be restated as:

"If an email provider is not trusted to not send arbitrary emails, then DKIM is not sufficient proof to trust that the supposed sender actually authored the email -- it is only sufficient proof to trust that the email was delivered via the respective email service."

Looking at your response to the original commenter:

> You are technically correct (the best kind of correct), but in practice the nuance you're referring to does not make as much difference as you think. Yes, email senders could send email from whatever user they want or change the body from what the user wrote, but in practice of course they aren't doing that for the kind of email providers like Gmail that most people use.

Okay. Sure. You trust Gmail or whoever. That doesn't invalidate the second proposition -- that just means that (under your world view) it is not satisfiable.

Ultimately, what I was initially responding to:

> You should probably stop "consulting on email security" if you don't understand that a DKIM-signed message proves the mailhost was authorized, and at least some of the headers could easily prove who sent the message.

comes off as uncharitable at best, and undeservedly antagonistic and offensive at worst. Your response thus far hasn't provided a valid counterpoint.

And, to be clear, I actually disagree with the original commenters assertion:

> So the proposed scheme would only work in a situation where you are owner of the DKIM key (thus in practice where you are the owner of the host sending the email), and where you also own the domain. It is trivial for a prosecutor to prove the owner of the domain, or the owner of the host that used the DKIM key. No amount of publishing keys will help you deny that ownership.

(edit: TBC, I think this statement is true but doesn't effectively refute the utility of publishing the keys -- that, if everyone has the old key, the signatures of old emails become useless, while the signature of a new email can still be used to check authenticity... that authenticity, of course, being predicated on the assumption that Gmail or whoever isn't sending fraudulent emails, which admittedly is a pretty safe bet)

But that's orthogonal to what this sub-thread is discussing (whether second proposition above is valid), which started with someone snarkily implying that someone else is incompetent in their field.

cstrahan··on Apple TV, now with more Tailscale
Their homepage literally says it is a “Zero-config Business VPN”. Not “implied” — directly stated.

> That’s why I think it’s not a great press release.

Press release? This a blog. It should be self evident that this is for customers and other already interested parties.

When you visit friends and family, do you regularly reintroduce yourself? I’m going to guess you probably don’t. If someone did that, it would both be weird and wasteful of everyone’s time.

Blogs work similarly. The majority of traffic is expected to be people already following you, in which case reiterating who you are, what you do, etc, would all be a waste of everyone’s time — with the minor exception of the occasional person that stumbles upon your blog for the first time. Even then, such individuals usually end up on an unfamiliar blog because they are explicitly searching for something topically relevant, and thus are already familiar with what is being described.

It’s kind of bizarre, IMO, to arbitrarily follow links from a link aggregator (Hacker News, in this case), with no prior knowledge of the related topic, skim through a blog on said unfamiliar topic, and then complain that the author didn’t spell out what 99% of their readership already knows. Like… why? If you like exploring things you don’t know, why not check out their homepage? You already clicked one link without knowing what you were getting into, what’s one more click to go to the very page that describes what they do? Or if you don’t like discovering new things, what compelled you to click a link, when the link text was completely foreign to you?

Car maintenance books don’t describe the usefulness of cars.

Calculus books don’t assume you have zero familiarity with numbers and counting.

Recipe books don’t remind you that, as a human being, you need food to survive.

The Netflix tech blog doesn’t tell you what Netflix is, describe “streaming” in the abstract, nor explain what movies are and why people watch them.

How little familiarity would you recommend that Tailscale expect from the reader of their blogs? Should plumbers be able to understand what’s being talked about? If they should tell you that they are a VPN service, should they also describe what a computer network is, what you can do with a network, and why they’re useful? Do they need to describe what a computer is?

I just… I just don’t get it.

cstrahan··on DKIM: Rotate and publish your keys
> […] if you don't understand that a DKIM-signed message proves the mailhost was authorized, and at least some of the headers could easily prove who sent the message.

I’d love to hear more about this. If I send an email from the Gmail UI, at a high level, how does DKIM ensure that Google can’t deliver the message with a different FROM header?

And, to clarify: your answer can’t involve trust/reputation because, well, both you and the person you quoted chose to use the word “prove”. Something being inadvisable and unlikely (Google forging emails) does not prove the opposite thereof.

cstrahan··on Tell HN: Enterprises spend 10x more to build no-code solutions than coded ones
Anecdote: early in my career, I worked on a dev team that feared software development. They tried to push as much logic as possible into Microsoft SQL Server stored procedures (the average length was around 10 pages). Look at all the code that wasn’t written (because SQL doesn’t count), and less code means less bugs!

Where stored procedures wouldn’t do, they put these of the logic into SQL Server Integration Services, which provided a visual programming environment — think Scratch but for visually connecting ETL pipelines. But, invariably, the existing components wouldn’t suffice, so they’d stuff 100s of pages of C# into these components, which would be hidden away behind a little “code block” rectangle in the SSIS flow-diagram-esque interface. Zero code reuse, no way to run unit tests, no strong typing (beyond primitive types mapped 1-to-1 with the underlying SQL queries), no codification of invariants/preconditions/etc. But hey, that C# code hidden away doesn’t count as code, so look at all the code we avoided! And SSIS is from Microsoft, so by using something they bless then we must be on the right track! What’s that you said? Should we consider if this particular tool is appropriate for our particular needs? No way! If SSIS wasn’t the optimal tool for all problems, why would Microsoft develop and market this product?!

Anyway. I think the trap people fall into is this: Critical thinking is tiring, and many people are lazy. Putting such people in a position that they must actually weigh the merits of multiple options is a sure fire way to become deeply resented. Also, critical thinking makes you responsible for the consequences of your choices, whereas appealing to authority absolves you of any and all responsibility (the old saying “no one was ever fired for buying IBM”). So many attempt to reduce the amount code as much as possible. But the problem is that many worthwhile endeavors are inherently difficult, and require real, hard, critical thought to arrive at a solution, and for such things code often happens to be the best medium for reifying those thoughts into software solutions. Consequently, countless companies will choose to jump through no-code hoops, and unsurprisingly suffer the consequences. They won’t learn from it though: instead, those responsible will deflect with excuses like “well Zapier is the issue, you see”, or “imagine how much longer it would have taken if we actually coded the solution!”, or “that’s just the nature of software/tech”, etc.

cstrahan··on Show HN: Nav – A terminal navigator for interactive `ls` workflows
Nice! For inspiration, you may want to look at `lf`: https://github.com/gokcehan/lf
cstrahan··on Text editing on mobile: the invisible problem
> You can use that for selection as well, tap somewhere else on the keyboard.

Doesn't appear to work.

What does work is pushing a little harder (i.e. "force touch") with the same finger/thumb that initiated the move-cursor-via-spacebar gesture.

Only problem there is that sometimes the forcetouch doesn't register (no matter how hard you pinch the screen), or is too trigger happy and starts selecting text when you only wanted to move the cursor.

cstrahan··on Show HN: Tome, aka Tom's Editor – a new command-line text editor
It's been a while since I looked at Alacritty, so I've tried to double check things, but feel free to add corrections in the comments in case I get some of this wrong.

Features WezTerm has that Alacritty doesn't:

1) iTerm Image Protocol (inline image display)

2) Kitty Keyboard Protocol (allows for keybindings that otherwise wouldn't be possible)

3) Semantic prompts (e.g. you can configure a keybinding to navigate in your scrollback to the previous/next prompt)

4) Built-in SSH support. Creating new tabs or panes will each create a new channel in your existing session so you won't need to re-authenticate for additional tabs that you create.

5) Alternatively, you could use WezTerm's multiplexing support. Think tmux (remote sessions persist even when you disconnect, and reconnecting gives you all of the existing windows/tabs/panes again), but graphical and built into the terminal emulator.

6) Config is written in Lua, and you can use that for clever automation, new keybindings, custom formatting of window/tab titles, etc.

7) Multiple fonts can be specified, where glyph rendering will attempt to fallback to the other fonts when not found. Advanced font shaping configuration -- you could do things like enable/disable ligatures, enable font options (if the font supports it) for alternative styling, like having zeros render with a dot or slash (to differentiate from a capital letter 'O').

Those are just some of the things I could think of real quick. Definitely recommend skimming the WezTerm documentation site.

cstrahan··on Show HN: Tome, aka Tom's Editor – a new command-line text editor
Easy fix: Use a more featureful (and more spec compliant) terminal emulator, like Kitty or WezTerm, and enable the Kitty keyboard protocol.

If you’re using iTerm, or Konsole, or Gnome Terminal, or urxvt, or… pretty much anything other than Kitty or WezTerm, you owe it to yourself to make the switch.

Personally, I use WezTerm.

Support for Windows, macOS and Linux. Better configuration. Better font rendering. Built-in fallback to Nerd Font for vscode-like icons in your editor of choice (I use neovim), so you don’t need to patch your font. Supports the Kitty keyboard protocol, and image display. Tons of features, too many to list here.

https://wezfurlong.org/wezterm/

https://sw.kovidgoyal.net/kitty/

cstrahan··on Apple TV, now with more Tailscale
Tailscale is a company that provides a VPN (“Virtual Private Network”) service. If you don’t find yourself thinking “man, I really wish this one computer over here could share the same network with that computer over there, despite not being on the same WiFi access point or physical Ethernet network”, then their service (and the news regarding it) aren’t for you.

Why would someone want a VPN? There are a bunch, but here are some examples:

1) You want to connect to one of your machines at home while you’re at a coffee shop, or on vacation. Maybe so you can check security cameras, I dunno.

2) You’re on vacation outside of your home country, and you would like to watch a video stream that is blocked in the country you’re vacationing in. I experienced this in the Bahamas — If I recall, I was wanting to watch a UFC fight, but the UFC app refused to stream to the Bahamas (it was this and/or other Disney/Hulu whatever services refusing to play in the Bahamas). By routing traffic through your ISP back home: problem solved. (This what “exit node” is referring to — a computer through which internet traffic flows on your behalf)

3) You want to play a game with a friend that only supports multiplayer play on the same network, but your friend isn’t physically there with you in the same house. So just put the two of you on the same virtual network and now you can play together.

cstrahan··on You're online all day. Why not use the browser to remind you of things?
Counterpoint: I found out the other day that friends and family were messaging me on Instagram, and I had no idea Instagram even had direct messaging support.

For several years people were messaging me and I was completely oblivious.

cstrahan··on Chronic fatigue syndrome may have a post-viral infection origin
Hehe, you sound like almost every doctor I’ve had… despite having at least one objective metric to show that something was wrong immediately after contracting EBV: Testosterone and Estradiol dropped by (and remained at) about 65%. Took three years of joint pain (common low estrogen side effect, what a surprise), muscle soreness/weakness, and the death of a formerly lively sex drive (2 months into a fantastic relationship — maybe I was depressed by having it too good?), etc — before I said “screw it, I’ll go to a TRT clinic”.

I’m still a far cry from my former self, but everyone around me has seen the positive difference that unfucking (at least part of) my hormones has made. But hey, maybe that’s all psychosomatic, including the swollen lymph nodes that for a year were visibly protruding out.

← PreviousPage 7 of 17Next →