HNHacker News
TopNewBestAskShowJobs

jlokier

6,142 karma · joined October 23, 2018

Mail: jamie@jlokier.co.uk LinkedIn: https://linkedin.com/in/jlokier

Knowledgable & helpful person, available for hire :-)

I'm looking for more work, ideally on a consulting / freelance / part-time basis.

LinkedIn is better than email to make first contact if you'd like to talk, whether for work or just chat about something you liked here on HN! (I often miss interesting one-off mails among the deluge, and don't check it every day.)

I work 80% time at a funded stealth startup as hands-on tech lead, with zero-knowledge (ZK) cryptography, Bluetooth low energy (BLE), and peer-to-peer distributed systems, linking physical devices as well as the usual web stack. Can't say more, but it is intended to become open source. This a really fun and challenging project, with a great team! (It's not on my LinkedIn - stealth).

With my remaining 20% I am currently available and looking for software dev and/or tech leadership and/or business strategy consulting.

I'm versatile but develop mostly low-level or "system" software in C, C++, Go, Rust and Nim, with Linux as my main OS (but MacOS and Windows also). I have about 30 years professional dev experience over a wide range of systems, from embedded to supercomputers, Linux kernel, database engines, as well as GUIs, the web, and even games. Good at performance optimisation, debugging. Also good math & physics.

I've worked as an Ethereum core dev (EVM), so I know that environment well, especially improving EVM database speed, which is a critical factor! Currently my rabbit holes are ZK cryptography speed optimisation, and a novel fast database engine (neither B-tree nor LSM-tree, but with characteristics of both).

(ZK = zero-knowlege cryptography).

submissionscomments
jlokier··on I returned to AWS and was reminded why I left
The GPL has no effect on this issue. For service providers like AWS, who provide the service not the software, the GPL doesn't require them to do anything differently than with more permissive licenses.
jlokier··on Sierra Raises $950M at $15B Valuation
People are rightly concerned that AI chatbots could result in worse customer experience, so I'd like to share my anecdote.

I recently had the best customer support experience I've ever had, and it was an AI chatbot, helping my in ways I would not expect from a first-line support human.

Recently I opened the chatbot window on the site of a supplier of electric vehicle chargers, and asked some obscure things about how I could access and modify the charger in a non-standard way. I explained I was doing some R&D testing of a novel way of using the chargers, and I would need to temporarily reconfigure the public unit we had already installed in an unusual, non-standard way, rewiring its network to intercept traffic via transparent proxy, make it behave a little differently than it normally does, and that I didn't have the credentials.

I was expecting the first-line person or bot on the chat to be unable to handle my non-standard request. What I was hoping for was this would start the process of getting me to someone who could help. I expected to take a few days or weeks to reach someone appropriate in the company, perhaps a sympathetic technician who could understand what I was trying to do.

To my amazement, in the first response it one-shotted a nearly complete answer to every part of my question, including the detailed and implied parts I'd left out for a later interaction. It figured out what I was doing and what that needed, told me exactly what to do and why, and showed me that it understood every aspect of my request. There were things in this I doubt anyone ever asked about before.

Because the answer so complete I didn't really need more. I asked it some things, e.g. about electrical safety, just to confirm my understanding of the one-shotted answer. In every reply, the chatbot was insightful, informative, helpful and correct, and I didn't need to explain things twice, or wait on hold, or be transferred to anyone else.

I don't know what service they were using, but whoever implemented it, hats off to them for using good technology and providing it with high quality data about the products they are supporting.

Honestly, if AI customer support calls or chats can be made that good consistently, that sounds great.

(That was a stark contrast to my awful expereinces with support at banks, where many humans made mistake after mistake, contradicted each other, and seemed to struggle to understand simple things. Particularly the one where a bank required me to fill out a form with basic company info, then it took 14 hours of phone calls and hold time until I got to the one person who understood straight away that the entries on the form were correct, had to be that way, and they could tick the "it's done" box. My execellent AI bot experience suggests a good one will always understand things like that on the first iteration, as if they are the best-trained and best-informed humans available. But other, worse AI bot experiences suggests the 14 hour calls would become infinitely long, never able to resolve the problem, leading to things like unnecessary account closures and locked funds needing a court to resolve.)

jlokier··on DeepClaude – Claude Code agent loop with DeepSeek V4 Pro
That should work, but you need an Ollama Cloud account and for much usage you need to pay the Ollama Cloud $20/mo or $100/mo subscription fee.

Using the API from DeepSeek or OpenRouter also requires a fee, but it's a different, pay-as-you-go payment model.

jlokier··on Removable batteries in smartphones will be mandatory in the EU starting in 2027
I cleaned a Samsung A53 under the faucet about 2 years after purchase brand new, using only a little water.

It failed soon after from water damage. I had to get it dried out and a new screen fitted, and some functions never worked properly since then.

I expected better as the specs claim IP67 ("Submersible in up to 1 meter of fresh water for up to 30 minutes"), and I used only a little water.

jlokier··on SDL Now Supports DOS
It was true! I really do have Turbo C, Unix V7 C and Sun C compilers in my CI workflow, alongside modern GCC for C23 and C++26, Clang, MSVC, Fil-C and Tinycc and others.
jlokier··on Linux 7.0 Broke PostgreSQL: The Preemption Regression Explained
In database engines that use page locks, the locked page size can be different from the file/mapped/allocated page sizes. If you still have excessive locking while using smaller page locks, there are other ways to reduce contention as well, such as CoW to protect concurrent reads, deferred write-merging to assist concurrent writes, and the storage equivalent of RCU.
jlokier··on Your phone is about to stop being yours
As with Google accounts, it's not hypothetical, it's a risk. People do occasionally get locked out of being an Apple developer for reasons they cannot foresee.

> Apple has locked my Apple ID, and I have no recourse. A plea for help* https://news.ycombinator.com/item?id=46252114

> Apple bans entire dev account, no reason given https://news.ycombinator.com/item?id=44601548

jlokier··on SDL Now Supports DOS
Perfect! I was just doing some Turbo C development inside DOSBox-X inside Debian GNU/Linux inside VMware Fusion inside macOS this morning.
jlokier··on An update on recent Claude Code quality reports
That price at Vultr gets you 1GB of RAM, and 25GB of relatively slow SSD.

The KV cache of your Claude context is:

- Potentially much larger than 25GB. (The KV cache sizes you see people quoting for local models are for smaller models.)

- While it's being used, it's all in RAM.

- Actually it's held in special high-performance GPU RAM, precision-bonded directly to the silicon of ludicrously expensive, state of the art GPUs.

- The KV state memory has to be many thousands of times faster than your 25GB state.

- It's much more expensive per GB than the CPU memory used by a VM. And that in turn is much more expensive than the SSD storage of your 25GB.

- Because Claude is used by far more people (and their agents) than rent VMs, far more people are competing to use that expensive memory at the same time

There is a lot going on to move KV cache state between GPU memory and dedicated, cheaper storage, on demand as different users need different state. But the KV cache data is so large, and used in its entirety when the context is active, that moving it around is expensive too.

jlokier··on Linux 7.1 Removes Drivers for Bus Mouse Support
To avoid collisions, you moved physical jumpers on cards that might conflict, to select among a small range of addresses, I/O ports and/or IRQ numbers.

For example if you had two identical network cards, or SCSI disk controllers, you would need to physically reconfigure one of them away from its defaults.

There were only a small number of configurations available on each type of device, and some weren't configurable at all, so you could still get irreconcilable conflicts.

The Linux kernel of the time was full of hard-coded "probe" addresses and I/O ports, probe sequences to see if there was a device there, and IRQ auto-detection routines that triggered an interrupt to find out which IRQ line was asserted. Some of the probes had to be run in a particular order, so that probes for one type of device wouldn't break another type.

Later came ISAPnP, meaning Plug'n'Play for ISA, which allowed the operating system to use a clever protocol to talk simultaneously over ISA with all devices on the bus that support it, identify and select them individually, query what they required and and configure their addresses, I/O ports and IRQs to avoid overlap, or permit overlap where it was ok for IRQs. After the operating system was done configuring them, they operated as if they were configured physically like the older ISA cards. If necessary this could be implemented cheaply by adding an ISAPnP module to an existing ISA card design.

Eventually ISA was superceded by PCI which had better, well-defined enumeration and configuration methods from the start which all devices had to implement. PCI also allowed MMIO and IO base addresses to be set anywhere (32-bit), not just a small number or single option as ISA cards usually had, so there were no more address conflicts. The operating system still had to find the PCI bus registers itself, but after that, probing was simpler and more reliable than with ISA.

USB also arrived around the same time, and also had well-defined enumeration and configuration methods. Many simpler ISA devices were replaced by equivalent USB devices. Although USB was (and is) complex to implement at a low level, the complexity was handled very well by low-cost, generic USB modules on the device side, so it was easy for device manufacturers to use.

jlokier··on 4-bit floating point FP4
For neural net gradient descent, automatic differentiation etc, the widely used ReLU function has infornation carrying derivatives at +0 and –0 if those are infinitesimals.
jlokier··on I run multiple $10K MRR companies on a $20/month tech stack
Apple laptop CPUs have hardware memory compression and exceptionally high memory bandwidth for a CPU, and with their latest devices, very high storage bandwidth for a consumer SSD, so the equation is very different from the old DOS days.
jlokier··on We've raised $17M to build what comes after Git
Here's two "raw" methods:

1. Use "git rebase -i commitid^" (or branch point, tag etc), ideally with editor set to Magit, set that commit to "edit" (single key 'e' in Magit) and let the rebase continue, do "git reset -p HEAD^" and select the hunks you want to remove from the first commit, "git commit --amend", then "git commit -a" (add -c if useful, e.g. to copy author and date from the previous one). or to keep the author date), then "git rebase --continue" to finish.

2. Same, but use "git reset HEAD^" (add -N if useful), then "git add -p" to select the hunks you do want to include in the first commit.

Afterwards you can do the "git rebase -i" command again if you want to reorder those commits, move them relative to other commits, or move the split-out hunks into another existing commit (use the 'f' fixup or 's' squash rebase options).

After doing this a few times and learning what the commands actually do, it starts to feel comfortable. And of course, you don't have to run those exact commands or type them out, it's just a raw, git-level view. "git rebase -i" and "git add -p" / "git reset -p" are really useful for reorganising commit hunks.

jlokier··on "Negative" views of Broadcom driving VMware migrations, rival says
Even though VMware Fusion (for Mac) is free* and very good, Broadcom is pushing me away to Parallels for silly reasons.

The reason: No matter how I try, even as a registered customer, I can't find a way to download current versions.

When I run VMware Fusion it tells me there's a new version, with bug fixes, support for newer macOS, etc. Would I like to download it? (Months ago it said the URL to check for a new version was broken.). Sure, I click, update please. It takes me to a Broadcom page where I'm supposed to sign in or register, give it my personal and work details, then I can download the new version.

I login because I already have an account. In my account, I can see the older versions of VMware Fusion, including the one I'm already running, but the later two versions aren't showing. Even the minor-version increment from the one I'm using isn't showing. I click around until I find where current ones should be, it shows me files in a table. I click the file and it tells me: Not yet, the account is awaiting verification. Come back in a few days.

It's been stuck like that for months.

But wait! I used this account to get VMWare Fusion a year ago. It still lets me download the version I'm using. The account was already verified! Why does it require new account verification just to get a slightly different, minor-version increment with bug fixes of a free product?

Last time I went through this, I ended up using Homebrew. I had a legit Broadcome/VMware account, had signed the agreement to download the update, but Broadcom's site didn't work. So I was delighted to find it in brew, with vastly better packaging than Broadcom's. Unfortunately the brew package is now disabled.

Before that, I had to sign up with Broadcom a second time, because the first account appeared to lose its access to VMware Fusion. I don't know why. Before that, I had to sign up the first time with Broadcom, even though I already had a VMware account as a paying customer of VMware Fusion.

It's been a great product, which I used to pay for and would again. I've used it for over 10 years. It's free now, and still a great product.

Yet I'm looking at switching to Parallels just because Fusion's "free" download process is too broken to use.

I can't imagine Broadcom is making any money from blocking downloads of the supposedly free product. It was their decision to make it free! It must be disheartening to be a developer on VMware Fusion if you know this is going on.

jlokier··on We've raised $17M to build what comes after Git
Working on multiple branches in parallel is literally what Git was created for, and how it's been used since the very first version 20 years ago.

Other commenters mentioned worktrees, which let you check out different branches at the same time from a single local repo. That's convenient, but not required.

Git always supported "fast cloning" local repos as well. You just "git clone" from one directory to another. Then they are independent and you're free to decide what to merge back.

These days, agents can also fork their containers or VMs as often as required too, with copy-on-write for speed.

So that's four ways to work on multiple branches in parallel using Git that we already use.

jlokier··on We've raised $17M to build what comes after Git
> You can just mess around and make it presentable later, which Git never really let you do nicely.

I'm surprised to read that, because that's how I've always used Git (and GitHub).

That's what I've understood to be good practice with Git, and it was liberating compared with what came before. One of the nicest things about Git is you can throw things in locally without worrying about how it looks, and make it presentable later.

jlokier··on Mysteries of Dropbox: Testing of a Distributed Sync Service (2016) [pdf]
Examples I've seen in similar systems:

- Receiver tried to create a file before receiving attributes of the directory containing the file. Receiver author assumed it would always receive directory attributes first and create the directory, so it crashed.

- Receiver created a file before receiving attributes of the directory containing the file. Parent directory was created automatically, but with default attributes so the file was too accessible on the receiver when it should not have been.

- Bidirectional sync peers got into a non-terminating protocol loop (livelock) when trying to agree if a directory deep in a tree should be empty or removed (garbage collected) after synchronising removal of contents. It always worked if one side changed and sync settled before the next change, but could fail if both sides had concurrent changes.

- Mesh sync among multiple peers, with some of them acting as publish-subscribe proxies forwarding changes to others as quickly as possible merged with their own changes, got into a more complicated non-terminating protocol loop when trying to broadcast and reconcile overlapping changes observed on three or more nodes concurrently. The solution was similar to distributed garbage collecting and spanning tree protocols used in Ethernet switch networks.

- Transmission of commands halted due to head of line blocking (deadlock) on a multiplexed sync stream because a data channel was going to a receiver process whose buffer filled while waiting for a command on the command channel, which the transmitter process had issued but couldn't transmit. The fault was separate, modular tasks assuming data for each flowed independently. The solution was to multiplex correctly with per-channel credits like HTTP/2 and QUIC, instead of incorrectly assuming you can just mix formatted messages over TCP.

- Rendered pages built from mesh data-synchronised components, similar to Dropbox-style sync'd files but with a mesh of 1000s of peers, showing flashes of inconsistent data, e.g. tables whose columns should always add to 100% showing a different total (e.g. "110% (11050 of 10000) devices online"), displayed addresses showing the wrong country, numbers of devices exceeeding the total number shipped, devices showing error flags yet also "green - all good" indication, number of comments not matching the shown commments, number of rows not matching rows in a table, etc. Usually for only a few seconds, sometimes staying on screen for a long time if the 3G network went down, or if rendered to a PDF report. Such glitches made the underlying systems look like they had a lot of bugs when they really didn't, especially when captured in a PDF report. It completely undermined trust in the presented data being something you could rely on. All for want of more careful synchronisation protocol.

jlokier··on S3 Files
Technically, SQLite's locking is NFS safe, provided NFS's implementation of fcntl() locking is working correctly.

I don't know if S3 Files implements fcntl() locking or does it correctly. But if it does, I believe SQLite should work on it correctly as well.

There have been many buggy NFS locking or caching implementations historically, which is why reason SQLite recommends against using it on NFS concurrently on multiple machines: https://sqlite.org/faq.html#:~:text=But%20use,time%2E

This SO reply suggests NFSv4 is better at this: https://unix.stackexchange.com/a/432519. But caveat it with this older reply: https://unix.stackexchange.com/a/1887

To the best of my knowledge (I worked a little on this long ago), on Linux even NFSv2 has done correct fcntl() locking for decades, if all the correct services are running and the options are set appropriately and it's Linux on both the client and server. But if something is not configured as it should be, then locking or caching may not work correctly.

jlokier··on Git commands I run before reading any code
Why is it "wade through" if there are 10 clearly distinct but dependent commits, but comfortable if it's 10 stacked PRs instead? They are basically the same thing, presented ever so slightly differently.

I think in most teams I've worked with, the majority of developers (> 85%) barely undestand what Git is doing or what things mean inside GitHub, have never seen commit history as a graph, have never run something like "git log --oneline --graph --decorate" or "--format", and have never heard of "git range-diff" which is very useful for following commit/PR/unit changes.

Personally I review using "git" itself, so I see the graph structure either way, and there's little difference between stacked PRs, commit chains in a single PR, or even feature branches, from that point of view. Even force-push branch updatea aren't difficult to review, because of the reflog and "git range-diff". The differences are mainly in what kinds of behaviour the web-based tooling promotes in the rest of the team, which does matter, and depends on the team.

I agree with you if you're using Graphite instead of GitHub. Having a place to give feedback and/or approval on the individual "units" (commits in a PR, or PRs in a stack) is useful, grouping dependent but distinct changes is useful, and diff'd commit evolution within each unit PR in response to back-end-forth review feedback is useful in some collaborative settings. Though, if you know "git range-diff" and reflog, that shows diff'd commit evolution quite well.

In GitHub, people are confused by stacked PRs both conceptually and due to the GitHub UX around them. Most times when I've posted a stacked PR to a GitHub project, other people didn't realise it was stacked, and occasinally someone else has merged the tip of a stack made by me, and been surprised to see all the dependent PRs merged automatically as a side effect. Usually before they get to reviewing those other PRs :-)

People understand commit sequences in a PR, though I've rarely seen people treat the individual commits as units for review when using GitHub, unfortunately. In the Linux kernel world where Git was born, the PR flow is completely different from GitHub: Their system tends to result in feedback on individual commits. It also encourages better quality feedback, with less nitpicking, and better quality commits.

jlokier··on Claude Code login fails with OAuth timeout on Windows
> the open arms embrace of subscription development tools (services, really) which seek to offload the very act itself makes me wonder how and why so many people are eager to dive right in

Here's a reason not in your list.

Short version: A kind of peer pressure, but from above. In some circles I'm told a developer must have AI skills on their resume now, and those probably need to be with well known subscription services, or they substantially reduce their employment prospects.

Multiple people I know who are employers have recently, without prompting, told me they no longer hire developers who don't use AI in their workflow.

One of them told me all the employers they know think "seniors" fall into two camps, those who are embracing AI and therefore nimble and adaptive, and those who are avoiding it and therefore too backward-looking, stuck-in-their-ways to be a good hire for the future. So if they don't see signs of AI usage on a senior dev's resume now, that's an automatic discard. For devs I know laid off from an R&D company where AI was not permitted for development (for IP/confidentiality reasons), that's unfair as they were certainly not backward-looking people, but the market is not fair.

Another "business leader" employer I met recently told me his devs are divided into those who are embracing AI and those who aren't, said he finds software feature development "so slow!", and said if it wasn't for employment law he'd fire all his devs who aren't choosing to use AI. I assume he was joking, but it was interesting to hear it said out loud without prompting.

I've been to several business leadership type meetups in recent months, and it seems to be simply assumed that everyone is using AI for almost everything worth talking about. I don't think they really are, so it's interesting to watch that narrative playing out.

jlokier··on I quit. The clankers won
I know it's just anecdotal, but I looked for COBOL salaries a couple of years ago, curious about this "paid well".

The salaries were ok but not good for COBOL.

Here's an anecdotal Reddit thread about it. https://www.reddit.com/r/developpeurs/comments/1ixfpsx/le_sa...

jlokier··on Claude Code's source code has been leaked via a map file in their NPM registry
I don't think that's likely to explain jankiness. I do know my way around terminal screens and escape codes, and doing flicker-free, curses-like screen updates works equally well on the regular screen as on the alternate screen, on every terminal I've used.

It's also not a hard problem, and updates are not slow to compute. Text editors have been calculating efficient, incremental terminal updates since 1981 (Gosling Emacs), and they had to optimise better for much slower-drawing terminals, with vastly slower computers for the calculation.

jlokier··on Android Developer Verification
I have that problem too, and it's a banking app I use nearly every day.

Needing to turn Developer mode off and on every time I open the app is really annoying.

It was extra annoying when I needed to log all my phone's Bluetooth HCI protocol activity for a day for product development. I wouldn't be able to take that measurement using a separate dev-specific phone, because it wouldn't contain realistic usage.

jlokier··on People inside Microsoft are fighting to drop mandatory Microsoft Account
*> the clipboard manager [...] If anyone has a recommendation that feels native

I use Maccy (https://maccy.app/). I've been very happy with it, and wish I'd installed it years earlier than I did. It's open source, and does its one job well.

I haven't used the Windows clipboard manager so I don't know how they compare on features.

jlokier··on My Journey to a reliable and enjoyable locally hosted voice assistant (2025)
An extractor fan is the kind of consistent noise that good signal processing and voice recognition ought to be able to strip out, especially if using a dispersed mic array. Even if your voice is much quieter (to your human ears) than the fan. It's a channel separation problem.
jlokier··on Zig – Type Resolution Redesign and Language Changes
Indeed, and this change of philosophy shows up in the pthread (POSIX threads) API, which returns error values directly (as a negative integer) instead of setting the errno variable.
jlokier··on MacBook Pro with M5 Pro and M5 Max
> in fact Apple does bundle a power adapter with their laptops, just not on the cheapest models.

Here in the UK, they no longer include the power adapter even with the top models. I just specced out a fully-loaded M5 Max Macbook Pro, 128GB RAM, 8TB storage on the Apple Store, and it doesn't include a power adapter by default.

The 140W power adapter can be added as an option to the MacBook Pro for an additional £99 + VAT, or purchased separately. If you purchase separately you can of course choose a lower-power adapter for a lower price.

Now that a power adapter isn't included and you have to pay for it separately, it might make more sense to get one of the good brands of GaN power adapters instead, because they are smaller than the Apple ones for the same power, and have more ports.

jlokier··on Anthropic Cowork feature creates 10GB VM bundle on macOS without warning
I'm on 5G right now and it just struggled to load the HN front page due to local network congestion. At times of day when it's not congested it reaches 60-90Mbyte/s in the same physical location

Spotify just gave up while trying to show me my podcasts. I can't listen to anything not already downloaded right now.

Yet at 3am I'll be able to download a 100GB LLM without difficulty onto the same device that can't stream a podcast right now.

Unfortunately I don't think 5G is the streaming panacea you have in mind. Maybe one day...

jlokier··on The Age Verification Trap: Verifying age undermines everyone's data protection
I think the idea is for the child see their friends in person... not call, text, or internet.

So even if their own child has no phone at all, they have access to the internet through other children's unlimited mobile access.

jlokier··on I tried building my startup entirely on European infrastructure
Something I didn't see in the other comments is users who are using the startup's service for work, as an employee.

Why wouldn't you choose the simplicity of "sign in with Google" if your work email is on Google Workspace, using the entire Google suite of business tools for everything (gmail, chat, meet, docs, drive, auth, etc) any everything you do at work is known to Google anyway?

Making an email/password account with your work Gmail is just extra steps, one more password to store, and perhaps the inconvenience of one more 2FA thing. Google gets the same information either way.

Similarly why wouldn't you choose the "sign in Microsoft" if your work is all in on the Microsoft suite of business tools (teams, office, onedrive, auth, etc.) and everything you do at work is known to Microsoft anyway?

← PreviousPage 2 of 34Next →