Sign in

rkletr

@merkletr.ee
344 followers 191 following 3.9K posts

cryptography liker. ctf player. array languager? music enjoyer. en/frCA. SPDX-License-Identifier: 0BSD

PostsRepliesMedia
rkletr @merkletr.ee · 10/10/2026
turns out you can just make a sandbox better than openai's in a day it's really not that hard
 ~/c/ggez (main)
 ssh root@ez
Last login: Fri Oct  9 23:12:20 2026 from UNKNOWN

[root@ez:~]# uname -a
Linux ez 6.18.55 #1-NixOS SMP PREEMPT_DYNAMIC Sat Oct  3 10:39:03 UTC 2026 x86_64 GNU/Linux

[root@ez:~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever

[root@ez:~]# ping google.com
ping: google.com: Name or service not known

[root@ez:~]# nix shell --log-format raw -v nixpkgs#hello --command hello
this path will be fetched (73.6 KiB download, 273.1 KiB unpacked):
  /nix/store/2y3s86m1yj9xnypd44vivfz3mwybzlki-hello-2.12.3
copying path '/nix/store/2y3s86m1yj9xnypd44vivfz3mwybzlki-hello-2.12.3' from 'https://cache.nixos.org'...
Hello, world!

[root@ez:~]# git clone https://github.com/TechnoJo4/tame.git
Cloning into 'tame'...
remote: Enumerating objects: 3815, done.
remote: Counting objects: 100% (1144/1144), done.
remote: Compressing objects: 100% (616/616), done.
remote: Total 3815 (delta 707), reused 890 (delta 510), pack-reused 2671 (from 1)
Receiving objects: 100% (3815/3815), 708.97 KiB | 4.69 MiB/s, done.
Resolving deltas: 100% (2350/2350), done.

[root@ez:~]# cd tame && git push
fatal: unable to access 'http://127.0.0.1:5003/github/TechnoJo4/tame.git/': The requested URL returned error: 403
110
rkletr @merkletr.ee · 06/09/2026
isn't it
it's virji

(sammy virji at off piknic, fizz stage, jean-drapeau, montreal)
000
rkletr @merkletr.ee · 03/09/2026
i:(1_'i)@=`s$*'i:" "\'(97>*:')_0:`i w:640;s:w,h:480 v:@[+.''i`v;1;-:] p:0.5*s+h*(2#v)*\:q:1%1-0.2*v@2 f:((.*"/"\)''i`f)-1 d:{-/x*|y} (a;b;c):++'p[;f] D:1%d[b-a]c-a "o.ppm"1:("P6\n640 480\n255\n"),,//{{`c$$[#k:&~0>&/e:(1-B+C;B:D*d[x-a]c-a;C:D*d[b-a]x-a);_255*e[;k@*>Q:+/e[;k]*+q@f@k];&3]}'(!w),\:x}'!h
120
rkletr @merkletr.ee · 01/09/2026
oh shit turns out clang-format works. sure i'll use clang-format for typescript why not
---
BasedOnStyle: Microsoft
IndentWidth: 4
---
Language: JavaScript
AllowShortBlocksOnASingleLine: Always
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
BreakBeforeBraces: Attach
Cpp11BracedListStyle: Block
InsertNewlineAtEOF: true
JavaScriptWrapImports: false
SpacesInContainerLiterals: false
UseTab: ForIndentation
...
040
rkletr @merkletr.ee · 14/08/2026
wtf
priv grafana dashboard. there are multiple changes up _and down_ in the last hour, and -356 posts in the last 24 hours.
000
rkletr @merkletr.ee · 06/08/2026
this is a video of me pressing ctrl-backspace in jetbrains rider
121
rkletr @merkletr.ee · 03/08/2026
i dont keep request metrics but i wouldnt be surprised lol there are only 129 people who even followed someone with the feed, let alone actually use it
grafana stats for priv: posts, follows and users, all-time and from the last 24 hours
110
rkletr @merkletr.ee · 16/07/2026
so true!
Album cover of Yard Act - You're Gonna Need A Little Music
000
rkletr @merkletr.ee · 09/07/2026
i use tauonmusicbox.rocks on mine; the "airsonic" option works for other subsonic servers just fine
tauon accounts settings. has lfm, "airsonic"
110
rkletr @merkletr.ee · 27/06/2026
you can tell i vibecode this typescript because it looks like a slow descent into madness
const idArgs = () => {
    args._.filter(it => typeof it !== "number").forEach(it => console.error(`warn: ${it} is not a valid item id`));
    return args._.filter(it => typeof it === "number");
};
const requireDef = <T>(t: T, msg: string): NonNullable<T> => { if (t === undefined) throw new Error(msg); return t!; }
const requireArg = <T extends keyof typeof args>(arg: T) => requireDef(args[arg], `argument ${arg} is required`);
const J = (x: unknown) => console.log(JSON.stringify(x)); // TODO: --human
const cmds = {
    "prime": async () => {
        const parts: Record<string, string> = {
            itemTypes: itemTypes.join("|"), statuses: statuses.join("|"),
            linkArgs: linkTypes.map(([a,b]) => `--${a} <id> --${b} <id>`).join("  "),
            wqSrc: resolve(src, "wq"),
        };
        console.log(await Deno.readTextFile(resolve(src, "PRIMER.md"))
            .then(it => it.replaceAll(/\{([^\}]+)\}/g, (_,k) => parts[k])));
    },
    "show": () => J(idArgs().map(id => show(id) || console.error(`warn: item ${id} does not exist`)).filter(it => it)),
    "create": () => J(show(db.cItem(requireArg("type"), args.status || "open", requireArg("name"), requireArg("description"))!)),
    "update": () => pipe(pipe(issueFields.filter(k => args[k]), fields => pipe(E(`UPDATE item SET ${binds(fields)} WHERE id = ?`), stmt =>
        pipe(fields.map(k => args[k]), vals => pose<[number], RestBindParameters, void>(stmt, id => [...vals, id])))), doUpdate =>
            J(idArgs().map(id => { doUpdate(id); return show(id); }))),
230
rkletr @merkletr.ee · 25/06/2026
oh shit maybe i shouldve been paying attention to the c# releases this has been a pain point for so damn long
The field keyword
The token field enables you to write a property accessor body without declaring an explicit backing field. The token field is replaced with a compiler synthesized backing field.

For example, previously, if you wanted to ensure that a string property couldn't be set to null, you had to declare a backing field and implement both accessors:

private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

You can now simplify your code to:

public string Message
{
    get;
    set => field = value ?? throw new ArgumentNullException(nameof(value));
}
280
rkletr @merkletr.ee · 12/06/2026
fuck you CN
An overhead digital display inside a VIA Rail train showing the train to Ottawa is stopped at 0 km/h.
250
rkletr @merkletr.ee · 25/05/2026
progress on @tame/plugin-web after ~36 hours of deepseeking code actually looks decently maintainable too? i havent read all of it but what i have seen is fine kinda looks ass right now but tweaking the design stuff should be easy (ignore the agent ids showing, session titles are broken rn)
@tame/plugin-web
010
rkletr @merkletr.ee · 22/05/2026
ah fuck rwc talks are out but the names are just so not descriptive sob
030
rkletr @merkletr.ee · 21/05/2026
this might just be the best you can do
010
rkletr @merkletr.ee · 20/05/2026
man tauon dropping your whole music library into one contiguous playlist/queue sure does result in some funny transitions
PrototypeRaptor into PSY Gangnam Style
140
rkletr @merkletr.ee · 28/04/2026
thanks vscode very useful
Code snippet showing a private method #min(), followed by an empty private method #add(). VSCode interpreted #add as a color code and added a colored square.
130
rkletr @merkletr.ee · 18/04/2026
you should get into private trackers
010
rkletr @merkletr.ee · 18/04/2026
total shosetsu victory
custom css editor
030
rkletr @merkletr.ee · 28/03/2026
for like a year or two this was the setup new homeserver also had a fridge period but it was only like a few weeks-months till i found floor space for it
laptopsrv under a chair on top of the fridgehs1 on the fridge
120
rkletr @merkletr.ee · 12/03/2026
THERE'S A SECOND ALBUM OF MORE OF THIS??
140
rkletr @merkletr.ee · 10/02/2026
been thinking about writing a language again chat what do yall think of this design
daul v4(?); k-ish but readable for normal people?

1+2*3-4 // 3
var a = 1 // mut
val b = a // const
[1, 2, 3] // array
["a": 1, 2: 3] // table
[3,2,1][1] // 2
[3,2,1][:-1] // [3,2]
[3,2,1]@[1,2] // [2,1]

// scalar extension & implicit each
[0, 1] + 1 // [1, 2]
[0, 1] + [2, 3] // [2, 4]
[[1,2],[3,4]] + [1,5] // [[2,3],[8,9]]

// functions
\{ 1; 2 } // f() // 2
\a{a+1} // f(1) // 2
1+ // f(1) // 2
/2 @ 1+ // f(3) // 2
\a,b{b} // f(1,2) // 2
\a\b{b} // f(1)(2) // 2
\a[a] // f(2) // [2]
\[1, 2] // f()[1] // 2
\["recursive": self]
\["v":2,"m":\{self.v}] // val o = f(); o.m() // 2

// for loops work the same but val of a for loop is val of its last iter
// list/table comprehensions give values of all iters
[for(x:X) x+1] [for(k,v:tbl) k: v+1] // each
[for(x,y:X,Y) x*y] [for(x,y,z:X,tbl) ...] // zip
[for(x:X) for(y:Y) x*y] [for(x:X; y:Y) x*y] // cartesian product
\f,X[for(x:X) if(f(x)) x] // filter
\f,X,a{for(x:X) a = f(a,x)} // foldl k: a f/X
\f,X,a[for(x:X) a = f(a,x)] // scanl k: a f\X
\f,X[for(a,b:X,X[1:]) f(a,b)] // eachprior k: f':X
\A,B[for(a:A) fold(+)(a*B)] // matmul k: (+/*)\:
3110
rkletr @merkletr.ee · 31/01/2026
holy shit is it fucking happening
XerahS: A cross-platform port of the popular ShareX

https://github.com/ShareX/XerahS
2120
rkletr @merkletr.ee · 28/01/2026
looks caught up to me (after like, 20 minutes; the cliff after is the pruning)
010
rkletr @merkletr.ee · 26/01/2026
i found it. the one thing gitlab does better than github
the Bluesky item in the social section of Gitlab's profile settings. The placeholder is a DID.
3180
rkletr @merkletr.ee · 22/01/2026
"there are 600 people on the internet"
empty room after puzzle from The Beginner's Guide
0123
rkletr @merkletr.ee · 11/01/2026
anyways here's the other project i've been posting about doing generalized personal task log & reminder system github.com/TechnoJo4/sc...
the scrobbly main interface with a little bit of example data. in order:
buttons for "inject EEn (4mg)" and "pay rent ($1000)", the latter colored blue
a list of active reminders, with one item: "you should pay rent (2 weeks ago)"
number input and buttons for 4 tasks: inject EEn, go outside, pay rent (again blue), buy stupid shit (this one colored red)
a table of two recent events
management links for buttons, reminders, quotas, tasks, units
3100
rkletr @merkletr.ee · 10/01/2026
i usually try to avoid CTEs as much as possible, i assumed nth_value was like built for this and would be fast, but apparently this is the best it gets
010
rkletr @merkletr.ee · 04/01/2026
67 users
current stats for @priv.merkletr.ee: 825 posts, 312 follows, 67 users
050
rkletr @merkletr.ee · 04/01/2026
with atcute, the whole thing took less than 6 hours of work and 250 lines of code still find it crazy that nobody else had done this yet
tables of files, lines, blank lines, comment lines, and code lines per programming language:

On the line for TypeScript, the amount of code line, 231, is highlighted
1270
rkletr @merkletr.ee · 02/01/2026
coming back from the holidays sure is Fun
040
rkletr @merkletr.ee · 01/01/2026
2025
Top albums of 2025

1. clipping. — Dead Channel Sky
2. KAYTRANADA — Timeless
3. P.O.S. — Never Better
4. The Prodigy — Invaders Must Die
5. KAYTRANADA — 99.9%
6. Black Eyed Peas — The E.N.D. (The Energy Never Dies)
7. Mr. Oizo — Lambs Anger
8. LCD Soundsystem — Sound of Silver
9. Fox Stevenson — Killjoy
10. The Dare — What's Wrong With New York?
11. LCD Soundsystem — LCD Soundsystem
12. Yard Act — Where’s My Utopia?
13. The Dare — The Sex EP
14. Sammy Virji — Same Day Cleaning
15. The Prodigy — The Day Is My Enemy
16. Streetlight Manifesto — Everything Goes Numb
17. Nitepunk — HUMAN
18. Fatboy Slim — Halfway Between the Gutter and the Stars
19. Infinitefreefall — Belief Systems
20. Black Eyed Peas — Monkey Business
21. Black Eyed Peas — The Beginning
22. Death Grips — The Powers That B
23. Justice — Hyperdrama
24. Viagra Boys — Cave World
25. Franz Ferdinand — Franz Ferdinand
230
rkletr @merkletr.ee · 31/12/2025
real ones know
110
rkletr @merkletr.ee · 07/12/2025
day 4 one-liner, both parts, ngn/k explanation already up on merkletr.ee/aoc/2025 fun day today, even if this *was* a particularly easy problem for array language users
(+//<':;+/*|:)@\:(83=*i){(x*~y)+(1_b,0)+0 :':b:x*y}\94=i:0:"i/7"
000
rkletr @merkletr.ee · 06/12/2025
aoc day 6 in goal (cause of some ngn/k limits) 75% of this code is string manipulation. there was zero puzzle today. extremely boring
o:(+/;*/)@"*"=rx/ +/\*|i:=-read"i/6"
\+/o@'+"v"$-1_i
\+/o@'"v"$1_'rx/^ *$/_"","c"$+"c"$-1_i
110
rkletr @merkletr.ee · 05/12/2025
aoc day 5 in ngn/k not golfed, and i won't be explaining this one because it fucking sucks and i hate it profoundly
(r;s):"\n"\'"\n\n"\1:"i/5"; s:.'s
r:@[+@/1<:\.''"-"\'r;1;1+]
r:r@\:&~<':*|r
r:r@'&'~1(,[;0]1_)\~>/@[r;1;0 :':]

+/~2!(,/+r)'s /p1
+/-/|r /p2
110
rkletr @merkletr.ee · 04/12/2025
aoc day 4 in ngn/k i don't think this is really golfable?
i:"@"=0:"i/4"
f:&/1(5>2(+3+/':,[;0]0,)/)\
+//f i /p1
+//i-{x-f x}/i /p2
210
rkletr @merkletr.ee · 03/12/2025
day 3 one-liner, both parts, ngn/k final solution because it's perfect now (golfed to 69 chars)
+/'(.*|)'',\:[,'0:"i/3";""]{(1_v_*x;x[1],(*x)v:*>y_*x)}/\:/:-|'!'2 12
130
rkletr @merkletr.ee · 03/12/2025
day 3 was easy enough initial un-golfed solution cause i gotta get to work, if i significantly improve on this i'll post it tonight
i:.''0:"i/3"
f:{v:*>(-y)_*x;(1_v_*x;x[1],x[0;v])}
+/{10/*|(x;!0)f/1 0}'i /p1
+/{10/*|(x;!0)f/|!12}'i /p2
120
rkletr @merkletr.ee · 01/12/2025
aoc 2025 day 1 in ngn/k
+/~100!i:50+\.'@[;0;"--"5!]'0:"i/1" /p1
+/50(-/-100!@/1>:\-/1>/\,)':i /p2
1110
rkletr @merkletr.ee · 12/11/2025
lesson learned: haskell in docker absolutely destroys iteration speed
root@redacted:~# docker compose up -d --build
[+] Building 1037.0s (14/14) FINISHED
280
rkletr @merkletr.ee · 08/11/2025
the effect applied on the same image with a few different sets of parameters
inputshifted 4,4 and xor'd 3 timesshifted 8,0 and xor'd 16 timesshifted 8,8 and xor'd twice
030
rkletr @merkletr.ee · 08/11/2025
some examples
inputshifted 2,0 and xor'd 27 timesinputshifted -30,20 and xor'd 2 times
130
rkletr @merkletr.ee · 02/11/2025
this doesnt feel great either but i guess it works
data Did = DidPlc Text | DidWeb Text

parseDid :: Text -> Maybe Did
parseDid (stripPrefix "did:plc:" -> Just v) = Just $ DidPlc v
parseDid (stripPrefix "did:web:" -> Just v) = Just $ DidWeb v
parseDid _ = Nothing
030
rkletr @merkletr.ee · 02/11/2025
successfully consuming jetstream from haskell now comes the fun part
some jetstream record creation and deletion messages, shown in the haskell's usual Show format:

Just (JetstreamMsg {did = "did:plc:qzozzub46fuyaosodwdgdjii", time_us = 1762102112711625, commit = Commit {operation = "create", collection = "app.bsky.feed.post", rkey = "3m4nxjb2g722k", record = Just (PostRecord (Just (ReplyRef {parent = Ref "at://did:plc:3uxrjyskvgpjaotpkbahemfv/app.bsky.feed.post/3m4nei2qkd22i", root = Ref "at://did:plc:3uxrjyskvgpjaotpkbahemfv/app.bsky.feed.post/3m4nei2qkd22i"})))}})
1100
rkletr @merkletr.ee · 28/10/2025
remade my "ctf team" "logo" in handwritten svg
the logo: a diagram of a molecule with the secp256k1 elliptic curve seamlessly integrated
260
rkletr @merkletr.ee · 22/10/2025
26tb for 340cad.... www.seagate.com/ca/en/produc...
CA$339.99 (was CA$489.99, 31% off)
140
rkletr @merkletr.ee · 11/10/2025
oh SHIT
070
rkletr @merkletr.ee · 04/10/2025
just a bunch of fun little noises highly recommend
Album cover of Ochre - Lemodie

https://ochre.bandcamp.com/album/lemodie
010
rkletr @merkletr.ee · 03/10/2025
lets fucking goooooo
downloading momentum mod on steam
020