revisiting some of my pre-AI blog posts
first up is my sokoban solver
currently trying to hillclimb my way to a SOTA solver with the latest models π§
first up is my sokoban solver
currently trying to hillclimb my way to a SOTA solver with the latest models π§
0
0
5
333
I spent a few days decompiling my favorite childhood game, Fast Food Tycoon 2, and figuring out:
β£ world rendering
β£ sprite animations/character movement
β£ light mechanics
so much to dig through and discover the dev team were on fire here: healeycodes.com/decompiling-faβ¦
β£ world rendering
β£ sprite animations/character movement
β£ light mechanics
so much to dig through and discover the dev team were on fire here: healeycodes.com/decompiling-faβ¦
1
1
15
836
the stronger the searcher, the more dangerous metadata about the existence of an answer becomes
in security: "just a rumour of a bug is enough to find an exploit these days"
in chess: Carlsen would be MUCH stronger with just one bit per game: "this position is critical"
in security: "just a rumour of a bug is enough to find an exploit these days"
in chess: Carlsen would be MUCH stronger with just one bit per game: "this position is critical"
0
0
1
194
I wrote about the performance of LLM tokenizers
like most things you want to go fast, it's better to use compact contiguous state instead of complex data structures!
healeycodes.com/what-makes-llmβ¦
like most things you want to go fast, it's better to use compact contiguous state instead of complex data structures!
healeycodes.com/what-makes-llmβ¦
0
1
15
650
I wanted to write a blog post titled (provocatively) "We Could Have Had Coding Agents in 2019"
I used the GPTβ2 XL weights (no post-training) and backported several later agent-design breakthroughs (action/observation loops, filesystem tools, etc.)
I used the GPTβ2 XL weights (no post-training) and backported several later agent-design breakthroughs (action/observation loops, filesystem tools, etc.)
1
0
9
441
but GPT-2 can't reliably emit JSON, or call tools in a meaningful way.
the only hint of agency came from leaning into text completion: Programmer β ACTION, Computer β observation, etc.
to get it to fix tests, the examples were so close to the answer that it was kinda useless
the only hint of agency came from leaning into text completion: Programmer β ACTION, Computer β observation, etc.
to get it to fix tests, the examples were so close to the answer that it was kinda useless
2
0
2
193
however, I haven't given up and have high hopes for "We Could Have Had Coding Agents in 2Μ΄0Μ΄1Μ΄9Μ΄ 2021"
0
0
3
95
I added πππππ to the typescript compiler
but along the way, I realised that what I want is different syntax for πππππ
I just want to be able to write:
πππππ ππ πππ ππππ.πππππππ()
but you can't
β§
healeycodes.com/adding-defer-tβ¦
but along the way, I realised that what I want is different syntax for πππππ
I just want to be able to write:
πππππ ππ πππ ππππ.πππππππ()
but you can't
β§
healeycodes.com/adding-defer-tβ¦
0
1
13
954
new post!
I wrote a tiny compiler that lowers simple kernel loops into explicit data-parallel code (lanes! masks!)
ofc I made up a language to make the input/output code easier to read
I wrote a tiny compiler that lowers simple kernel loops into explicit data-parallel code (lanes! masks!)
ofc I made up a language to make the input/output code easier to read
1
0
4
633
quickjs is GOATed
delightful API surface
I was able to hack together a tiny runtime and event loop v quickly with it
delightful API surface
I was able to hack together a tiny runtime and event loop v quickly with it
1
1
24
1,670
I built a tiny shell with C so I could learn more about syscalls and pipes
great fun
I found C to be quite suited for the task (fork, execvp) ... until I had to manage some string lifetime stuff π₯²
great fun
I found C to be quite suited for the task (fork, execvp) ... until I had to manage some string lifetime stuff π₯²
2
4
49
3,787
read my notes and code snippets and thoughts
healeycodes.com/building-a-sheβ¦
healeycodes.com/building-a-sheβ¦
0
0
6
301








![Screenshot of:
To recap a bit, I'll step through what happens when ls $HOME | grep foo is entered.
It's tokenized into ["ls", "$HOME", "|", "grep", "foo"].
Then expanded into ["ls", "/Users/andrew", "|", "grep", "foo"].
The flat token list is separated into structured pipeline commands:
["ls", "/Users/andrew"]
["grep", "foo"]
The shell creates a pipe to connect the output of ls to the input of grep.
The child commands start via fork, and execvp swaps them into the target programs.
By the wonderful design of Unix: if grep reads faster than ls writes, it blocks waiting for more data; if ls writes faster than grep reads, the pipe buffer fills and ls temporarily blocks. This synchronization happens automatically through the pipe, while the shell simply waits for both child processes to finish.
The output of grep isn't connected to a pipe as it's the last command, and any results are displayed to the user.](/pic/media%2FHDm8upfacAAg6Ak.jpg)
