Cryptographer, Security Engineer/Architect, humanist, with a taste for offensive security as well.
Posts
#RocketLang update:
I added support for "Union types": You can now declare variables (and function parameters of types like int32 | None. The variables can hold values of both types (and functions can be called with parameters of both types).the functionality is still a bit rough around the edges (not as comfortable to use as I'd like), but the core functionality is there.
This is actually on the "critical path" towards my current goal of implementing a unit testing library: When discovering tests (iterating through folders, finding test files, loading them and then finding the test cases in them), I need a list of test-cases. Currently only ArrayLists are (kind-of) implemented. But they require... arrays - and if a type doesn't have a default value, you can't initialise the array.
Concretely: When I'm building a list of test cases, that's a ArrayList[func() -> None]. But func() -> None doesn't have a default value, so creating a RawArray[func() -> None] fails, so there's no list.
Now, with union types I can create an ArrayList[func() -> None] that uses a RawArray[(func() -> None) | None] as backing storage.
Project #RocketLang update:
While working towards my current goal of having a unit-testing library in #Rocket, I came across a few bugs:
string_1 + string_2actually didn't work when one or both of the strings where empty. Fixed and added test cases.os.scandir(path)actually wasn't working properly. Most of my test cases used mocking, but the function errored out when run without mocks. The test cases without mocking didn't properly check the results. Now I implemented a proper testcase that creates a temporary directory, puts some files there and checks for those.
The os.scandir() test case above actually turned out to be a bit flaky: It worked locally, but failed in my CI/CD pipeline. The reason was that os.scandir() returned the files in a different order on the CI/CD server. So I tried sorting them by name which ... requires supporting <, <=, >, and >= for strings. So I implemented that, too (lexicographic sorting).
And ByteString got a new method: ends_with.
Another update on #RocketLang (my pet #programming language):
I just implemented the dir() function for modules, so that you can discover what's declared in a module. (Really, I had most of it stashed already.)
Another step towards implementing a unit-testing library for #Rocket, more specifically: auto-discovery of test cases.
#RocketLang update:
Yesterday I implemented typecasting (with runtime checks), so you can now write:
x = cast_to[T](y)
where T is the target type.
This required first implementing function templates (generic functions) at all, that's another new feature.
As a consequence, using the cast_to functions, it's now possible to call dir() on all types, including Type itself.
That's one step closer to my current goal of implementing a unit-testing library: When you get a test class (inheriting from unittest.TestCase) you have to find it's methods. That's where dir() comes in.
Today I rented a server for the first time in my life. I ordered it on Monday, today I finally got access. Obviously, I've used #SSH many times before, since years. I know the ssh-keygen -t ed25519 by heart.
I wanted to have the server config reproducible, so I asked #claude #opus (you know, the "smart" one) to write an ansible playbook for me. (Because I've never really used ansible before.)
Within two/three hours I had gotten myself twice into a situation where I needed to access the server through some fallback method (server console in the browser). 
The reason is that I wanted a somewhat hardened SSH setup. So Claude produced a config with PermitRootLogin no. Sensible. I saw it.
I ran ansible, afterwards I couldn't log in anymore, because #Claude recommended to defer creating a non-root user account to the second step. I didn't think it through enough. That was issue 1.
The fix was simple enough:
I restored SSH access for root. I adapted the ansible playbool so that PermitRootLogin would only be set if there are other admin users. That fixed issue 1.
So I continued.
I set the config for adding the new user. It got added to the sudo group, but I didn't want to allow sudo without password. The user got it's own SSH key, the .ssh folder and the .ssh/authorized_keys had the right permissions. I ran ansible again. It worked, the new user was created. Now that there was another admin user in the config, ansible reestablished the PermitRootLogin no.
I tried to log in as the new user, no problem. I tried running sudo and... it asked for the new user's password. But the user didn't have a password. That was issue 2.
Fixing it was again simple: Log in as root (via the web console), set a password for the user.
Still, I'm quite annoyed by myself screwing up two times in so short succession. Normally I pride myself in knowing what I'm doing (in most things I'm doing).
I had to deal a bit with the "Supply-chain Levels for Software Artifacts" (SLSA) "standard":
https://slsa.dev/
IMO it's a joke, since they do not properly deal with threats from "Includ[ing] a vulnerable dependency (library, base image, bundled file, etc.)". They essentially say "A future version of this standard might deal with that":
https://slsa.dev/spec/v1.2/threats
This has been the main entry point of the past supply chain attacks (XZ backdoor, litellm, Shai-Hulud, ...). A supply-chain security standard that doesn't properly deal with vulnerabilities in dependencies completely misses the point. It's like installing alarms on your windows (to catch burglars trying to enter your home through the windows) when your front door doesn't have a lock.
#SLSA #supplychain #supplychainsecurity #xzbackdoor #ShaiHulud #litellm
I think #Germany has some strategic #efficiencyreserves that could be unlocked very easily, all that has to happen is for chancellor #Merz and Katherina #Reiche to resign.
Read about "#efficiency #reserves" today:
https://archive.ph/R3ela
That's definitely my #euphemism of the day.
Imagine someone saying:
"It's a good thing that in our company we have some strategic efficiency reserves that we can tap into to boost productivity in times of need."
It's so nonsensical, I love it.
On a side note: German minister for energy Katherina #Reiche is an absolute disgrace. Every day she's in office is (in the best case) a missed chance to drive #renewableenergy and #sustainability . Most days she seems to be more busy undermining the transition to #greenenergy (thus shoving money to her previous employers) than doing anything more sensible (like playing #minesweeper ).
After a few months of break, over the last week or so I finally had some time to work on my pet programming language #Rocket again.
My main goal was to fix a bug that prevented some built-in types (ints, booleans, ...) from being used as instances of a protocol (as in #Python - think interfaces in #Java, traits in #Rust or ...). The reason was that for these types I didn't have any runtime type info. If they were stored in a variable (or function parameter) of type `MyProtocol` that was that - there was no more information on the type except just that: It implements the protocol `MyProtocol`. No way of knowing the actual type or finding the implementation of the methods required by the protocol.
So I had to refactor how ints and booleans were represented internally. As you can imagine, that's a change quite deep in the language. It affected arrays (which store their length - an integer), strings (which under the hood ultimately are arrays of integers) and some other stuff. Changing the representation of booleans required adjustments in parts of the language that deal with booleans: lazily evaluating logical `and`s and `or`s, `if` statements, `while` loops, etc.
Anyway, after the refactoring I think the code is a bit cleaner. And once I had this, fixing the bug was literally a two line change (plus imports and tests).
Also found and fixed another bug: When importing two submodules of the same top-level module (e.g. `import mymodule.submodule_1; import mymodule.submodule_2`) the second import statement used to fail because the name `mymodule` already existed (was already taken) in the code doing the imports (it was created by the first import statement).
And then there was a third bug I introduced in the refactoring of the representation of ints. It lead to `-some_unsigned_int` to be treated as another unsigned int (rather than a signed one) in some regards. My test case converting `-9223372036854775808` (the minimum value a signed 64 bit integer can hold) to a string caught it.
On a side node: I'm so grateful I started writing lots of test cases for this project. The amount of bugs they've caught that would have gone unnoticed otherwise is worth a million. Always write test cases if you care about your software.
It looks like we're in for another few years of high #inflation, due to surging prices for #RAM and consequently about anything that uses #electronics:
https://www.wsj.com/tech/ai/memory-ram-shortage-2026-f55324b0
Question is: How will this affect the #AI #bubble? Will it finally burst or will investors just throw in even more money to be burned?
Edit: Another question is: How will this affect #politics, e.g. the #midterms in the #US? Further surging prices should be to #Trump|s disadvantage, right? (#uspol) Or will #Trump just issue an executive order banning export of #chips (not that so many are produced in the #USA, but still...)