What are you doing this week?
16 points by caius
16 points by caius
What are you doing this week? Feel free to share!
Keep in mind it’s OK to do nothing at all, too.
At work: Low-level protocol fiddling, and also some compliance work.
At home: Since I'm doing a bit better in general, I'm going to experiment a bit with spite-driven development.
("Fuck this and fuck them. I'm gonna write myself some code, the way I like to.")
At home:
At work:
Working on my own search engine! I wanna see how good of a lexical search engine I can make by myself.
I’ll probably be playing around with the crawler some more. Writing a web crawler is a surprisingly fun task.
Yeah internet search is a surprisingly accessible, but also very deep and rewarding rabbit hole.
Can recommend Search Engines and Information Retrieval in Practice as a free e-book if you want some meat on your bones. Is a few years old but a lot of stuff still holds up.
Applying to another wave of openings and hoping for the best.
Continuing my dive into deptypes, and traveling to Portugal for a week's vacation.
Anyone have any suggestions for places to go in or around Porto?
Gotta work on a talk for QCon and practice juggling routines for a friend's bday party this weekend
I am working on a little minimalist RSS reader inspired by Taskwarrior
Jumping back into some scheme-rs work after a bit of a break after the first release and being busy for a while. Excited to do some intense optimizations!
I’m playing around with zig. so far i have nothing but high praise for the language.
random thoughts: packed structs are amazing — bitCast + packed structs = heaven. the level of control you have over memory in zig feels better than c. this feels like the right way to talk to a computer. what a work of art of a pl.
edit: the language reference document is so so good. i have only used this page to learn the language and i am delighted.
Work: landing a multi week infra project, ideally with as little impact as possible. Then we get to tidy up (read: delete the old stuff.) That’ll help keep my stats having deleted more loc than added in the repos since joining. Also stability work, solving things like a catch-22 of the autoscaler not adding more workers because the metric doesn’t exist because the system is too busy to emit the metric for the autoscaler.
Home: wife’s going abroad without me (🥲) so I get to fiddle with things at home and resolve the teenagers’ pointless arguments.
My entire life is https://developer.apple.com/events/view/TUHA23T82K/dashboard if anyone wants to watch me mess up live
I spent a couple of weeks learning about the format and implementation of Apple's "more-typeable" passwords. E.g., funrus-Hommez-kazjo7.[1][2[3] As part of that, I implemented generators for that style of password in C and Go. I'm hoping to release the Go version this week.
Nobody really needs a Go library that generates Apple's "more-typeable" passwords, but I wrote it, so why not?
Links for the curious. Link [3] is not directly related to these passwords, but it's a very good talk about how to measure the strength of passwords.
[1] https://rmondello.com/blog/page/2/
[2] https://developer.apple.com/password-rules/scripts/generator.js
[3] https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler
Getting inspiration from the themeing colour submission from a couple of days ago, working on using rampensau and fettepalette to build dynamic colour palettes based on an image, for my ActivityPub service.
Creating a graphics programming resource page. Still working in progress and not ready to be merged to main
I'll be spending some time on an HTML parser and XPath evaluator for Gleam. Right now I'm writing Erlang bindings to html5ever through rustler, borrowing a bit of code from Elixir's meeseeks. After that I wanted to implement the XPath evaluator and a typed query builder directly in Gleam. XPath syntax parsing is out of scope for now :)
I just looked at the XPath spec and realized that most of XPath is made up of a very complex expression language, and that Gleam is a perfectly cromulent expression language... so I think I'll just be implementing axis navigation and leave the expression part to a fn(Node) -> Bool. Maybe I'll implement XPath some other time.
Finishing Why's Ruby guide. DB/ postgres little projects/practicing :) Advancing on this Maigret's hopefully.
Why was such a treasure. I mourn his disappearance tho it was by choice
I'm not really informed abou his person. All I know is what is on Klabnik's recent interview and the book. However, I'm having a great time with the book which is more than enough to be thankful for <3
Work: Hopefully finishing up some projects that have dragged on for far too long. Building new images for our VDI has become a massive problem due to internal configuration tools expecting all new machines to be physical laptops, and treating them as such, causing virtualization software to break in all sorts of ways.
Personal: Continuing to work on Writing an Interpreter in Go. I've just finished implementing the Pratt Parser. Very fun project, and the book is pretty well done.
A lot of things, actually:
I'm working on a workflow engine with the aim of explicitly separating implementation details from the execution graph. My goal is to provide structure for building large applications out of small components that can be reasoned about independently and reused. We can break applications up by treating them as state machines. Then for any workflow you can draw out a state chart where you have nodes that do some computation, and then the state transitions to another node in the graph.
The problem with traditional coding style is that we implicitly bake this graph into function calls. You have a piece of code that does some logic, like authenticating a user, and then it decides what code should run after that. And that creates coupling, cause now you have to trace through code to figure out what the data flow actually is. This can be difficult to do because it causes context to quickly grow in unbounded way.
The key idea is to do inversion of control. Instead of having nodes in the call graph call each other, why not pull that logic out. We could pass a data structure around that each node gets as its input, it does some work, and then returns a new state. A separate orchestration component manages the workflow and inspects the state and decides which edge of the graph to take.
The graph can be visually inspected, and it becomes easy for the human to tell what the business logic is doing. The graphs are declarative in nature focusing on the state transition logic. They’re decoupled from the actual implementation details that live in the logic of each node abstracted over by its API.
Going back to the user authentication example. The handler could get a parsed HTTP request, try to look up the user in the db, check if the session token is present, etc. Then update the state to add a user or set a flag stating that user wasn’t found, or wasn’t authenticated. Then the orchestrator can look at the result, and decide to either move on to the next step, or call the error handler.
Now we basically have a bunch of tiny programs that know nothing about one another, and they have a fixed context that doesn’t grow in unbounded fashion. On top of that, we can have validation boundaries between each node, so we can check that the component produces correct output, handles whatever side effects it needs to do correctly, and so on. Testing becomes much simpler too, cause now you don’t need to load the whole app, you can just test each component to make sure it fills its contract correctly.
What’s more is that each workflow can be treated as a node in a bigger workflow, so the whole thing becomes composable. And the nodes themselves are like reusable Lego blocks, since the context is passed in to them.
This whole idea isn’t new, workflow engines have been around for a long time. The reason they don’t really catch on for general purpose programming is because it doesn’t feel natural to code in that way. There’s a lot of ceremony involved in creating these workflow definitions, writing contracts for them, and jumping between that and the implementation for the nodes. But the equation changes when we’re dealing with LLMs, they have no problem doing tedious tasks like that, and all the ceremony helps keep them on track.