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 tried building my startup entirely on European infrastructure
Both available choices "share the information with Google" for most people. The majority of email account creations use a Gmail or Google Workspace address, so Google gets the information either way, and in Europe most use Android so can't sign in with Apple.
jlokier··on GrapheneOS – Break Free from Google and Apple
My comment was about push service sharing generally, not banks, from a technical point of view that many people aren't aware of but may find interesting.

Clearly, real-time notifications are useful with many apps, notably real-time messaging, even if you don't think they have a place with bank apps.

For bank and credit card apps, I find their push notifications to be very useful. They are among the most useful notifications I get, because they tell me about things I find important, which I wouldn't notice otherwise.

They tell me things about transactions that have gone through, sometimes after a long delay, transactions that need confirmation right now or they will be blocked, balance being too low, or too high (credit cards), payments that are required today, refunds that came through after a product was returned, transfers that completed on the receiving said, payment received from a client, direct debits that are going out tomorrow so I will need to make sure there's enough in the account, customer service messages that require a response from me or they will eventually close the account, and so forth.

"Just open the app" doesn't work: All of those, except transaction confirmations, are things where I wouldn't know to open the app if I didn't get a message of some kind to tell me.

These days, in some juristictions it's also required to send real-time notification to confirm some purchases, because the phone's security is considered better than card details alone. Depending on how the purchase is made (e.g. in-person vs online, different payment terminals), you might not know the reason a transaction is blocked or held is because it's waiting for you to confirm in the app, so the notification is useful for this.

All these used to be done by SMS, and that was useful too. But SMSs are just push notificatons with a worse UI and worse visual cues.

jlokier··on planckforth: Bootstrapping a Forth interpreter from hand-written tiny ELF binary
.COM binaries yes, but a.out binaries do have a header, similar in size to ELF.

When ELF was added to Linux, I think it used a bit less RAM than a.out.

ELF made it easier to build and deploy shared libraries, and the design was more consistent at keeping code sections read-only despite run-time linking (the PLT stuff), so more RAM pages ended up automatically shared between processes by the kernel, compared with a.out.

jlokier··on GrapheneOS – Break Free from Google and Apple
> They do it so they don't have to stand up their own push servers

I don't agree with this dependency on being in good standing with Google either.

But there is a technical reason that isn't wanting to avoid using their push servers. It is about battery usage and radio bandwidth.

Keeping open an idle connection over WebSocket, long-poll HTTP or TCP/IP needs regular pings (typically 30 seconds are used), one ping per connection. Otherwise your app can't be sure to receive messages from the server in real time, as the connection can disappear into CGNAT or similar hole where it doesn't receive messages sent by the server. To an app not using pings to check, such a blackholed connection is indisinguishable from an idle connection with no pending messages.

Waking the radio every 30 seconds, times 2 (back and forth), times the number of registered applications, would be quite battery draining. It drains battery both for background CPU usage and radio processing. Those pings in aggregate can even amount to a significant amount of data usage for users on smaller plans.

So there is a battery and radio advantage in using a shared push service, which only need a single idle connection to be kept live with 30 second pings.

There's another level to this, not available to regular developers using TCP/IP, HTTP or WebSockets.

The mobile network itself has to maintain handset connection liveness to the nearest tower, at a lower level than IP pings, and this is obviously optimised for battery and radio performance, and always running.

With arrangements in place with the mobile networks (which Google and Apple have), the mobile OS can leverage that for more reliable, lower power push notifications, by either guaranteeing the network will send something technically similar to a low-level SMS when there's an outstanding message, or by guaranteeing their special push IP connection will stay live by itself (no CGNAT blackhole) or be notified if something happens to it.

This allows the mobile OS to offer a shared push service that's fairly reliable at real-time notifications, with zero continuous CPU and radio power overhead for the idle connection.

jlokier··on GrapheneOS – Break Free from Google and Apple
> when you can just open the thing in a website anyway. I can use my bank on some linux distro

Unfortunately not.

I'm in the UK. Two of my personal banks, all four business banks that I need to use, and several credit cards, require authentication using their phone app to confirm login on their website.

None of those I've seen are using TOTP or SMS, for which I could use a general security service. All use their own phone or tablet app. One does something interesting where the website shows a unique QR code on each login, the phone app reads it with the phone camera, and then website login proceeds instantly without clicking anything.

Oh, and some of them also require phone app confirmation for card purchase transactions.

When my last phone's screen stopped working, I called one bank's "phone banking" line (using another phone of course) to make an urgent transaction, and they told me they can't do that, as only service they offer by phone is registering a new phone or tablet. They told me explicitly that it's not possible to login to their web-based banking service without using their app for authentication, and on a registered device.

It's the reason I have my current phone. I had to buy a cheap-ish Android in a hurry from a local shop, in order to proceed with my bank transaction.

Back to the main topic: I love the idea of a properly open source phone, I used to own not one but two Nokia N900s, and I once toyed with the idea of building my own Linux phone from scratch, big project though that is.

But the security ecosystem around logins has changed, and so have the services I depend on. These days I use many bank and other financial-service related apps, and I'm not, in practice, free to switch providers. So I couldn't use a Nokia N900 or modern equivalent any more as my only mobile device. I'd have to carry a second phone as well.

(Banking and other service authentications are also the only reason I have my current passport. I resented having to pay to renew my expired passport, given I had no plans to travel (small children) and the expired passport used to be accepted, but I found some banks, credit cards and even government services increasingly requiring to see a non-expired passport from time to time. When I asked one of them what do they do for the large number of people who don't have one, they simply told me they close those people's accounts and that's ok, they don't need to serve everyone. But that's another story.)

jlokier··on It's all a blur
Good point, though you have to beware that text-aware image enhancement sometimes replaces characters with what it thinks is a more likely character from context.

I've seen my phone camera's real-time viewfinder show text on a sign with one letter different from the real sign. If I wasn't looking at the sign at the same time, I might not have noticed the synthetic replacement.

jlokier··on Oxide raises $200M Series C
That's because flat structures are often, or often turn into, "flat-in-name-only" structures.

I don't think the Tyranny of Structurelessness is arguing in favour of hierarchy, or against other forms of organization than hierarchy.

I don't think it's arguing against "flat" or "anarchy" style organizations either.

In essence, I think it's asking us to do whatever we're doing better, more honestly, more effectively, and less stressfully. By acknowledging, clarifying, communicating, and seeking to understand the real operating structures, what's really going on. And then to improve them, using that understanding.

An actually flat organization might be good, I don't know. I've never seen one. I've been in some that claimed to be flat, and became stressful places to work, for the same usual reasons hierarchies can be unpleasant, including incompetent bosses (not called bosses). But I've also had some pleasant experiences in flat organizations, and I prefer it that way, if it's designed and run well.

jlokier··on Xcode 26.3 – Developers can leverage coding agents directly in Xcode
It depends which key combination or trackpad gesture is used to trigger the desktop switch, because they use different animation curvdes. It looks like they have different application focus or redraw behaviour too.

- Control-Left/Right takes about 1 second.

- Four-finger swipe left/right takes about 1 second.

- Alt-Tab to an app on another desktop takes about 0.25 seconds.

I'm using Sonoma 14.8.3, but from the comments it sounds like the timing distinction is similar on other versions.

jlokier··on Efficient String Compression for Modern Database Systems
I've worked on a hobby database that did something like this, but instead of "flat" dictionary compression over columns, it used a tree of compression contexts - trillions of them.

Data was compressed in interior and exterior trees, where interior trees were the data structure inside blocks (similar to B-tree block contents), and exterior trees were the structure between blocks (similar to B-tree block pointers, but it didn't use a B-tree, it was something more exotic for performance).

Each node provided compression context for its children nodes, while also being compressed itself using its parent's context.

As you can imagine, the compression contexts had to be tiny because they were everywhere. But you can compress compression contexts very well :-)

Using compression in this way removed a few special cases that are typically required. For example there was no need for separate large BLOB storage, handling of long keys, or even fixed-size integers, because they fell out naturally from the compression schema instead.

The compression algorithms I explored had some interesting emergent properties, that weren't explicitly coded, although they were expected by design. Some values encoded into close to zero bits, so for example a million rows would take less than a kilobyte, if the pattern in the data allowed. Sequence processing behaved similar to loops over fast, run-length encodings, without that being actually coded, and without any lengths in the stored representation. Fields and metadata could be added to records and ranges everywhere without taking space when not used, not even a single bit for a flag, which meant adding any number of rarely-used fields and metadata was effectively free, and it could be done near instantly to a whole database.

Snapshots were also nearly free, with deltas emerging naturally from the compression context relationships, allowing fast history and branches. Finally, it was able to bulk-delete large time ranges and branches of historical data near instantly.

The design had a lot of things going for it, including IOPS performance for random and sequential access, fast writes as well as reads, and excellent compression.

I'd like to revive the idea when I have time. I'm thinking of adding a neural network this time to see how much it might improve compression efficient, or perhaps implementing a filesystem with it to see how it behaves under those conditions.

jlokier··on When Every Network is 192.168.1.x
That's the addressing problem, although I have some bad news on that: NAT is used with IPv6 in some places.

The reachability problem is, even with public addresses, sometimes you have to do the same thing to "configure port forwarding" with stateful IPv6 firewalls as with double or triple NAT IPv4.

jlokier··on Television is 100 years old today
Some recent HN comments about CRT implosions people have experienced.

https://news.ycombinator.com/item?id=46355765

"I still have a piece of glass in back of the palm of my right hand. Threw a rock at an old CRT and it exploded, after a couple of hours I noticed a little blood coming out of that part of hand. Many, many years later was doing xray for a broken finger and doctor asked what is that object doing there? I shrugged, doc said, well it looks like it's doing just fine, so might as well stay there. How lucky I am to have both eyes."

https://news.ycombinator.com/item?id=46354919

"2. Throwing a big big stone to an abandoned next to the trashcan CRT TV while I had it placed normally because it didn’t break when I threw it facing up and the next thing I remember after opening my eyes which I closed from the bang was my friends who were further down the road looking at me as it I were a ghost since big big chunks for the CRT glass flew just right next to me.

CRTs were dangerous in many aspects!"

https://news.ycombinator.com/item?id=46356432

"I'll never forget the feeling of the whoosh when I was working as a furniture mover in the early 2000s and felt the implosion when a cardboard box collapsed and dumped a large CRT TV face-down on the driveway, blowing our hair back. When the boss asked what happened to the TV, I said it fell, and our lead man (who had set it on the box) later thanked me for putting it so diplomatically."

jlokier··on LG UltraFine Evo 6K 32-inch Monitor Review
Some people don't have a choice. See https://news.ycombinator.com/item?id=46698278

"The company I work at gives all new developers a pair of 1080p displays that could have come right out of 2010."

I have the same problem. The monitors at the office where I currently work are all low-DPI.

Work is quite irrational when it comes to spending decisions. It's not just penny pinching. They waste a lot of time and money at the same time as they block and worry about much smaller expenses. Asking them to provide one or two good, modern monitors at non-trivial cost would likely be described something as a "luxury" or "treat", which is how they described my personal laptop when they found out how much it cost.

At least I'm able to use my own laptop at the current job. It's much more powerful than anything the company would provide.

jlokier··on Government drops plans for mandatory digital ID to work in UK
It's not from the 2014 changes.

From https://commonslibrary.parliament.uk/research-briefings/sn06...:

"Someone who was born British and has no other nationality cannot be deprived of their citizenship in any circumstances."

"Deprivation now affects people born in the UK, not just naturalised citizens"

"Until 2003, however, deprivation was only possible for naturalised citizens."

"The Nationality, Immigration and Asylum Act 2002 extended citizenship deprivation to British-born dual nationals for the first time."

jlokier··on Government drops plans for mandatory digital ID to work in UK
> If you are British at birth they can't strip your citizenship and kick you out

Not true. If you have dual nationality at birth, typically because you have one British parent and are born in the UK, then you are British at birth but the Home Secretary has the power to strip you of British citizenship anyway.

So, paradoxically, a child born in the UK to a British mother can end up with stronger UK citizenship rights if the mother doesn't reveal who the father is.

That's not as bad as if you are a naturalized British citizen. In that case, the Home Secretary has the power to strip you of British citzenship and leave you entirely stateless (you have no citizenship anywhere), which you can imagine is a very difficult status to live with.

jlokier··on Fabrice Bellard's TS Zip (2024)
Pi falls out of infinite sums, exponentials and differential equations all over the place. It's a universal constant, first discovered via geometry, but it's independent of geometry.

For example,

pi = the square root of the sum of 6/x^2 over x = (1, 2, 3...).

pi = the smallest positive value of ln(-1)/i.

pi = half the period of non-zero solutions to the differential equation f = -f''.

jlokier··on Vector graphics on GPU
> If the input image is only simple lines whose coverage can be correctly computed (don't know how to do this for curves?) then what's missing?

Computing pixel coverage accurately isn't enough for the best results. Using it as the alpha channel for blending forground over background colour is the same thing as sampling a box filter applied to the underlying continuous vector image.

But often a box filter isn't ideal.

Pixels on the physical screen have a shape and non-uniform intensity across their surface.

RGB sub-pixels (or other colour basis) are often at different positions, and the perceptual luminance differs between sub-pixels in addition to the non-uniform intensity.

If you don't want to tune rendering for a particular display, there are sometimes still improvements from using a non-box filter

An alternative is to compute the 2D integral of a filter kernel over the coverage area for each pixel. If the kernel has separate R, G, B components, to account for sub-pixel geometry, then you may require another function to optimise perceptual luminance while minimising colour fringing on detailed geometries.

Gamma correction helps, and fortunately that's easily combined with coverage. For example, slow rolling tile/credits will shimmer less at the edges if gamme is applied correctly.

However, these days with Retina/HiDPI-style displays, these issues are reduced.

For example, MacOS removed sub-pixel anti-aliasing from text rendering in recent years, because they expect you to use a Retina display, and they've decided regular whole-pixel coverage anti-aliasing is good enough on those.

jlokier··on A web developer posted a payment shaming message on their client's site
They did it, so both of those are ruled out by context.

That's how I talk, and admittedly some people find how I talk confusing when I think it's clear. Thanks for the amusing heads up on language interpretation!

In pseudo-code: (clear (not (eq (reason for doing it) (to get out of debts))))).

jlokier··on A web developer posted a payment shaming message on their client's site
In the case of a URL it might be.

If the domain is registered with the client named as the formal owner, the client may well be the owner even if they haven't paid for it yet.

jlokier··on A web developer posted a payment shaming message on their client's site
The company owner didn't dissolve it, the registrar did as a penalty for not filing accounts within about 4 months of the due date. The owner might not even know it's dissolved yet.
jlokier··on A web developer posted a payment shaming message on their client's site
My guess is it wasn't deliberate. They might not even know it's dissolved yet.

It's dissolved by "compulsory strike-off", which means the registrar did it as a penalty for late filing of accounts about 4 months after their due date, and failing to send an email saying "the company is still required" to the registrar, which is enough to prevent the dissolution.

It happened before in 2021 to this company. The company was restored a few months later, which is permitted when it's been dissolved by the registrar for filing accounts late.

Restoring a company also restores its liabilities (debts), so it's clear they were not doing it in 2021 to get out of debts.

My guess is it's an oversight by the owner, who is prone to filing things late and doesn't have an accountant. It's quite common in the UK for single-person companies to not have an accountant, and to not know all the rules.

Plenty of health conditions or life events can cause an oversight like this, especially for someone who is already prone to filing close to the deadlines.

After the company is dissolved this way, it's unlawful to continue trading, which includes paying suppliers from company funds. The owner immediately loses all company assets. Their bank accounts may be frozen or closed quickly, so they might suddenly find themselves without access to their funds. That can be a awkward if the owner wasn't expecting it, or if they don't even know it's dissolved. Business banks in the UK freeze account access for other inscrutable reasons sometimes, so it's not always obvious when the reason is dissolution.

This doesn't excuse not replying to the supplier to explain, unless they are really unlucky and lost access to their paid Google account or similar as a side effect as well. Or if they had the kind of sudden health condition or life event that causes a person to miss filing deadlines.

jlokier··on Assorted less(1) tips
I recommend -FX instead of -EX. They both quit immediately if the output is smaller than the screen size, but -FX does not quit if the output is larger and you jump to the end of a large file, so you can continue to do things like scroll back or search.

git uses "less -FRX" by default. This is how I learned about -F.

(To be pedentic, git uses "LESS=FRX less", which accomplishes the same thing.)

jlokier··on More on whether useful quantum computing is “imminent”
The amplitudes aren't small in the 512-dimensional subspace where 256-qubit calculations take place.

2^256 states are comfortably distinct in that many dimensions with amplitude ~1. Their distinctness is entirely direction.

The obvious parallels to vector embeddings and high-dimensional tensor properties have some groups working out how to combine them in "quantum AI", and because that doesn't require the same precision (like trained neurel nets still work usefully after heavy quantization and noise), quantum AI might arrive before regular quantum computation, and might be feasible even if the latter is not.

jlokier··on Instagram chief orders staff back to the office five days a week in 2026
> 5% above their requested pay with

Not enough to move the needle. 25% would move the needle.

> with mentions that I could double it in one year

They didn't believe you, or didn't after a short time working there. So it didn't move the needle.

More so if they're experienced. Similar mentions of prospects are common in interviews, and rarely followed through. You eventually learn to be skeptical of them, while rolling with it, just in case.

Also, if you might be willing to pay double their requested salary, they start realising their value on the open market is much higher than they'd previously thought, or could be with a little presentation and experience.

On the other hand, if you'd put it in the contract that their salary will double after 1 year, subject to well-defined criteria and a history of actually doing it with existing employees, then they'd believe you, and that would move the needle a lot.

From your story I speculate you were right to fire them, but you never figured our how to get the best out of them. In recent years it's possible you were subject to employment fraud, as clarity of analysis can disappear if it's a different person doing the work than the person answering interview questions.

Progress that's entirely stalled or negative can happen for many other reasons than moonlighting, and many other reasons than not putting enough time.

jlokier··on Mozilla's latest quagmire
> - but it wasn't obviously better than Firefox.

Ah, but Chrome was obviously better than Firefox.

When Chrome was released, the advertising I recall focused on one killer feature that Firefox didn't get for many years after that: Speed.

Chrome's JIT JavaScript was so much faster than everyone else's interpreted JavaScript that you could run a materially different kind of software in the browser. It was like the difference between a slow interpreted language and a fast compiled one. Chrome's rendering was also fast.

There was even a cartoon explaining how the new JavaScript engine worked.

Chrome felt like the next generation of browser.

I say this as someone who remained a fan and user of Firefox throughout. I stuck with Firefox through its relatively slow years.

Firefox caught up, but it took years. It got its own JIT JavaScript, but there were a few years after that where Firefox's rendering was relatively slow by the new standards. However, Firefox has excellent performance all round by now.

I was disappointed when Chrome came out that JIT JavaScript could even be a marketable feature and wasn't already the default in the best open source browsers, because it seemed like such an obvious thing to do for many years prior, and not particularly difficult. I guess market forces resulted in nobody deciding to do it in Firefox, or any other open source browser, until competition made it a necessity. I was quite surprised, because Firefox seemed like the product of passionate technology nerds, and performance JITs are very fun and satisfying things to make, with visible results.

jlokier··on High-income job losses are cooling housing demand
> $1700 per month pays off a $350k loan in 17 years, does it not?

No, it does not. You forgot the interest. Let's call it 6%, close to the current US average.

The interest by itself comes to more than $1700 a month!

Paying $1700 per month, you'll never pay off $350k, even with a 1000 year mortgage.

To pay in 17 years, you'd need to pay $2741 (plus fees) per month. Most of that will be interest at first, but it tapers down. If you want to start out not paying mostly interest, you'll need to pay at least $3500 (plus fees) per month.

jlokier··on A Repository with 44 Years of Unix Evolution
If the original develoeprs had used Git, they'd be mostly fast-forward merges. Those are the default merge operation in Git, and they don't appear as merge commits in a repo.

However, there commits start 33 years before Git was created. Merge commits were not even a concept back than.

jlokier··on Show HN: I wrote a minimal memory allocator in C
> For example, suppose you allocate 1000 page sized objects and then free all but the last one. With an mmap based heap, you can free all 999 other pages back to the OS whereas with sbrk you're stuck with those 999 pages

Actually... you can free those 999 sbrk() pages using munmap() on Linux and Darwin (so most likely the BSDs too). You can also change the mappings within the sbrk()-allocated range, much like any other mmap.

This feature is not well known, nor particularly useful :-)

jlokier··on Europe is scaling back GDPR and relaxing AI laws
> Most people don't care about these things. Who are you to say that the harm is severe to people who don't care?

I'm not the one deciding.

I said some of the harms are severe. Not everything. It refers to things like people losing their online accounts, having their bank account drained, their credit rating ruined, private photos shared, passwords changed or published, losing files to ransomware, all as an indirect result of poorly handled data collection resulting in identity theft and similar.

I'm pretty sure most people affected by those things do consider them severe, and that many people upon learning about those things also consider them quite severe, even if they didn't care before they learned.

If most of those people consider those things severe, that's enough to call them severe.

You don't need my opinion for that.

jlokier··on A surprise with how '#!' handles its program argument in practice
> /usr/bin/env and /bin/sh are part of the POSIX standard, this is why NixOS has those available.

Contrary to popular belief, those aren't in the POSIX standard.

The following are not in the POSIX standard, they are just widely implemented:

  - "#!" line.
  - /bin/sh as the location of a POSIX compliant shell, or any shell.
  - /usr/bin/env as the location of an env program.
  - The -S option to env.
jlokier··on Europe is scaling back GDPR and relaxing AI laws
But far more than 1% are harmed by it.

Sometimes the harm is severe. Vast oceans of poorly handled personal data collected in exquisite and unnecessary detail by dark patterns, copied around to everyone who might be interested with low regard for security, kept forever, analysed by the best algorithms and sold to whomever will buy it, raise the risks and consequences of identity theft and fraud for everyone.

Those are the sorts of things GDPR is designed to limit.

The GDPR isn't about cookies or websites. It applies to non-web-based businesses too. It's basically just insisting on security best practices in every part of a business that handles personally identifying or sensitive data.

Limiting its collection to what is necessary and consented to, deleting or anonymising it when it's no longer required, respecting wishes of the individuals the data, and giving people some confidence that security best practice is taken seriously.

← PreviousPage 3 of 34Next →