<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>sizeof(cat)</title><link>http://sizeof.cat/</link><description>Recent content on sizeof(cat)</description><language>en</language><managingEditor/><webMaster/><lastBuildDate>Mon, 03 Nov 2025 11:02:26 +0000</lastBuildDate><atom:link href="http://sizeof.cat/index.xml" rel="self" type="application/rss+xml"/><item><title>Quake 2 Thunderdome - this time in video</title><link>http://sizeof.cat/post/quake-2-thunderdome-in-video/</link><pubDate>Fri, 31 Oct 2025 23:12:51 +0000</pubDate><author/><guid>http://sizeof.cat/post/quake-2-thunderdome-in-video/</guid><description>&lt;video controls preload="none" poster="/post/quake-2-thunderdome-in-video/img/quake.jpg">
&lt;source src="http://sizeof.cat/post/quake-2-thunderdome-in-video/video/quake.mp4" type="video/mp4; codecs=&amp;quot;avc1.64001F, mp4a.40.2&amp;quot;" label="hd720" selected="true">
&lt;source src="http://sizeof.cat/post/quake-2-thunderdome-in-video/video/quake.mp4" type="video/mp4; codecs=&amp;quot;avc1.64001F, mp4a.40.2&amp;quot;" hidequalityoption="true">
&lt;source src="http://sizeof.cat/post/quake-2-thunderdome-in-video/video/quake.mp4" type="video/mp4; codecs=&amp;quot;avc1.42001E, mp4a.40.2&amp;quot;" label="medium" selected="false">
&lt;source src="http://sizeof.cat/post/quake-2-thunderdome-in-video/video/quake.mp4" type="video/mp4; codecs=&amp;quot;avc1.42001E, mp4a.40.2&amp;quot;" hidequalityoption="true">
&lt;p>Sorry, your browser doesn't support HTML5 video. Here is a &lt;a href="http://sizeof.cat/post/quake-2-thunderdome-in-video/video/quake.mp4">link to the video&lt;/a> instead.&lt;/p>
&lt;/video>
&lt;p>You know about &lt;a href="http://sizeof.cat/post/the-quake-2-thunderdome/">The Café&amp;rsquo;s Quake 2 Thunderdome&lt;/a> by now, but the images don&amp;rsquo;t satisfy you? Well, in this case I got your back, here is a video to enjoy: the original demo was recorded on an iMac G5 (I played Quake 2 on it), converted into a movie by recording it in OBS on a MacBook Air, edited in Final Cut Pro on the same iMac G5 and transcoded into mp4 using Handbrake. The beginning is missing for a simple reason: in the heat of the moment, I forgot to start recording. Sorry about that :(&lt;/p>
&lt;p>The end result is 13 minutes of blood and carnage. Enjoy.&lt;/p></description><category>cafe</category><category>quake</category><category>games</category></item><item><title>Tim Cook must go</title><link>http://sizeof.cat/post/tim-cook-must-go/</link><pubDate>Fri, 24 Oct 2025 11:21:56 +0000</pubDate><author/><guid>http://sizeof.cat/post/tim-cook-must-go/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/tim-cook-must-go/img/cover.png" alt="Apple">&lt;/figure>&lt;/p>
&lt;p>Controversial opinion, right? I mean, it&amp;rsquo;s not like the latest Apple design choices were out of the ordinary or just batshit-crazy, starting with the famous butterfly keyboard, or the famous Intel Core M-powered 12&amp;quot; MacBooks that struggled to even open Finder, or the one-USB-C per laptop meme that evolved into the two-USB-C per laptop meme, or the Touchbar meme, or the notch-gate, or Liquid Ass, or the orange iPhone that turned pink faster than Taylor Swift panties after a night in SoHo. 2014 to 2025, excepting the 2020 moment when Apple launched their own silicon, was funtime. For the people who used Windows, or heaven&amp;rsquo;s forbid &amp;hellip; Linux.&lt;/p>
&lt;p>No sir, Apple shifted from a hardware company into a services/subscriptions company and now is a fashion one. In an alternate universe I would be writing this shit on a watercooled Quad PowerPC G5 Powerbook while carrying the pump like a colostomy bag and enjoy every moment of it. In that universe I&amp;rsquo;d watch Jobs coming on stage with a baseball bat and proceed to smash the latest IBM-compatible to pieces, while Steve Ballmer chants &amp;ldquo;DEVELOPERS, DEVELOPERS, DEVELOPERS&amp;rdquo; all coked out. But unfortunately I&amp;rsquo;m stuck in a worse universe, writing this on an iBook G4, because everything launched by Apple since 2015 has been plagued by the &amp;ldquo;creations&amp;rdquo; of people like Jonny Ive and Tim Cook, strangely, both of them some of the oldest Apple employees. Maybe Steve Jobs was a really good manager and could keep everybody in line, who knows. Or maybe he was supreme in fistfights.&lt;/p>
&lt;p>And no, I&amp;rsquo;m not acting as if during Jobs&amp;rsquo; time Apple didn&amp;rsquo;t had its share of &amp;ldquo;fun&amp;rdquo; times with GPU-gate of iBooks and Powerbooks, or the flaming balls of fire that Apple called (and re-called) &amp;ldquo;Powerbook batteries&amp;rdquo;. Or the iMacs that could be opened only with suction cups, after you got your very own degree in engineering. But the Apple of that time had some guts, while the Apple of today has Liquid Ass and the pink iPhone that&amp;rsquo;s actually orange; and I can&amp;rsquo;t for the love of God (or Allah) comprehend why Tim Cook lacks the power, or ability, or common sense as to do something different (and no, adding another notch to the laptops and call it a day doesn&amp;rsquo;t count, does the world really need a Dual Notch-Powered MacBook Pro?) and woo the market. Make us watch the next WWDC or whatever it&amp;rsquo;s called, with our eyes glued to the screen (see what I did there?) while crying like little bitches (but please, no more $7000 MacBooks). What would the Apple fanboys and fangirls do, buy an Asus with Windows 11 and preinstalled malware? No, they will not. The market is saturated with aluminium laptops and glass phones, so why don&amp;rsquo;t you give us a white polycarbonate MacBook Pro with proper USB-A ports AND HDMI AND MagSafe AND USB-C and Ethernet, Apple? Or make it out of pinewood, just stop with the aluminium, titanium, unobtainium and glass. Just stop.&lt;/p>
&lt;p>On the other hand, let&amp;rsquo;s give Tim Cook lion&amp;rsquo;s share in growing Apple to the heights of today, I&amp;rsquo;m not saying &amp;ldquo;kick Tim in the teeth and fire him&amp;rdquo; because he did amazing things. For the shareholders. For the company. But absolutely nothing for Apple&amp;rsquo;s and his own legacy.&lt;/p>
&lt;p>I don&amp;rsquo;t know, maybe I expected more from a company I used to love (both hardware and software) and now I dislike from the bottom of my heart (both hardware and software), maybe I expected modern macOS not to be a steaming pile of donkey turd, maybe I expected iPhones to have a battery that is useful for more than watching five TikToks, maybe I hoped Apple&amp;rsquo;s hardware wouldn&amp;rsquo;t turn into the closed ecosystems of today, where you can&amp;rsquo;t launch an app unless Tim Cooks knows your cock girth or pussy depth. And where you can&amp;rsquo;t install neither Windows (I know) not Linux (I double know) unless you jump through endless hurdles that will make you question your (in)sanity of buying this MacBook Pro that&amp;rsquo;s only Pro if you choose to stay under Apple&amp;rsquo;s umbrella. I mean, really, how do you get from &amp;ldquo;the fastest laptop in the world&amp;rdquo; to &amp;ldquo;the pinkiest orange phone in the world&amp;rdquo;? Maybe the same way we got from the original iPhone to antenna-gate and &amp;ldquo;it works if you hold it like this&amp;rdquo;?&lt;/p>
&lt;p>And speaking of running other &amp;ldquo;authorized&amp;rdquo; operating systems on your&amp;hellip; I mean Apple&amp;rsquo;s hardware, installing a Linux distro that&amp;rsquo;s &amp;ldquo;made&amp;rdquo; by some autist in his mom&amp;rsquo;s basement doesn&amp;rsquo;t count as actually doing something useful, positive or enhancing on your $3k+ machine. And neither is installing Windows for Arm in Parallels (even if Parallels is an amazing piece of machinery).&lt;/p>
&lt;p>Maybe what I really need is this new Apple M(+1) silicon that&amp;rsquo;s almost 3% faster than the old M(-1) one (&lt;small>3% in ideal circumstances, with the CPU cores cooled by virgin blood and only singlecore benchmarks that are officially authorized by Apple™&lt;/small>), and Tim Cook is right about everything. Just like Jonny Ive was right about everything, until he wasn&amp;rsquo;t anymore. Or maybe it&amp;rsquo;s something cyclical, we had the great Sculley era, the shitstorm that was Spindler era, the so-so Amelio era, the Jobs era and now it&amp;rsquo;s the return of the Spindler era, only named Cook.&lt;/p>
&lt;p>But if someone wants the return of the old Apple versus PC &amp;ldquo;fights&amp;rdquo;, it looks as if there are no other solutions but the title of this article.&lt;/p></description><category>apple</category><category>opinions</category></item><item><title>The Café's Fishy puzzle</title><link>http://sizeof.cat/post/cafe-fishy-challenge/</link><pubDate>Sat, 18 Oct 2025 13:10:07 +0000</pubDate><author/><guid>http://sizeof.cat/post/cafe-fishy-challenge/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/cafe-fishy-challenge/img/badges.png" alt="Café badges">&lt;/figure>&lt;/p>
&lt;p>Well, you probably know about &lt;a href="http://sizeof.cat/cafe/">The Café&lt;/a> by now: it&amp;rsquo;s a private, invite-only community I have started on &lt;em>August 29, 2025&lt;/em>, after being in development for about one month before. We currently have about 160 members so far, and we talk about various stuff (both on the Café and its dedicated IRC channel), &lt;a href="http://sizeof.cat/post/cafe-weekend-round-1-quake2/">we plan events&lt;/a> and do puzzles. And the latest puzzle challenge was something I named &lt;strong>Fishy&lt;/strong> and it involved virtual fishing in the Café&amp;rsquo;s wate&amp;hellip; API for clues and secrets. The reward is a unique member title (&lt;em>&amp;lt;Master baiter&amp;gt;&lt;/em>) for the first solver + &lt;a href="http://sizeof.cat/cafe/img/badges/303.png">a cool Café badge&lt;/a>, and a different title (&lt;em>&amp;lt;Fisher&amp;gt;&lt;/em>) + the same badge for everybody who solves it after.&lt;/p>
&lt;p>I&amp;rsquo;ll let the one and only &lt;strong>bonk&lt;/strong> tell you how the puzzle can be solved, since he&amp;rsquo;s the first to solve it, and therefore will be forever known in the Café annals as &lt;em>&amp;lt;Master baiter&amp;gt;&lt;/em> &lt;strong>bonk&lt;/strong> (because he baits masterfully and not for other reasons, you perverts!):&lt;/p>
&lt;hr>
&lt;p>The puzzle started by sizeofcat hinting us by saying &lt;em>&amp;ldquo;There might be something Fishy here, if you&amp;rsquo;re looking for a puzzle :D&amp;rdquo;&lt;/em> and linking us the Café badges page.
The first clue was the &lt;a href="http://sizeof.cat/cafe/img/badges/303.png">303th badge&lt;/a>&amp;rsquo;s label that says: &amp;ldquo;Fishy says L2ZpbGVzL3tiYWl0LGZpc2h5fQ==&amp;rdquo;.&lt;br>
At first glance, you can see it&amp;rsquo;s base64. Decoding it reveals: &lt;code>/files/{bait,fishy}&lt;/code>.&lt;br>
In bash and many other Unix(-like) shells that would expand to: &lt;code>/files/bait /files/fishy&lt;/code>. These are probably files on this website, so &lt;a href="http://sizeof.cat/files/bait">bait&lt;/a>, &lt;a href="http://sizeof.cat/files/fishy">fishy&lt;/a>.&lt;br>
Bait is a plain text file with the contents being: &lt;code>p6EHsgP79RMUOcanpt8qlUWHC36XaseC&lt;/code>, fishy is a 403 - Forbidden page&amp;hellip;&lt;br>
I have tried all kinds of things with the contents of bait to get past the 403; GET, POST arguments, HTTP authorization headers, cookies, I even thought it could be a PHP session id, nope.&lt;br>
Just a few days back we got our hands on the shiny new Café API, that gave me an idea&amp;hellip;&lt;br>
I requested the API with &lt;code>controller=fishy&lt;/code>, it was just a guess lol&amp;hellip; and I hooked onto something&amp;hellip;&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -X POST https://sizeof.cat/cafe/ -d &amp;#39;action=api&amp;#39; -d &amp;#39;token=&amp;#39; -d &amp;#39;controller=fishy&amp;#39;
{&amp;#34;version&amp;#34;:&amp;#34;1.5.66&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;Wed, 15 Oct 2025 20:09:31 +0000&amp;#34;,&amp;#34;message&amp;#34;:{&amp;#34;error&amp;#34;:true,&amp;#34;text&amp;#34;:&amp;#34;Fishy demands secrets.&amp;#34;}}
&lt;/code>&lt;/pre>&lt;p>Hmm, fishy demands secrets? How about &lt;code>secret=p6EHsgP79RMUOcanpt8qlUWHC36XaseC&lt;/code>?&lt;/p>
&lt;pre tabindex="0">&lt;code>{&amp;#34;version&amp;#34;:&amp;#34;1.5.66&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;Wed, 15 Oct 2025 20:10:32 +0000&amp;#34;,&amp;#34;message&amp;#34;:{&amp;#34;error&amp;#34;:true,&amp;#34;text&amp;#34;:&amp;#34;Fishy doesn&amp;#39;t know you.&amp;#34;}}
&lt;/code>&lt;/pre>&lt;p>I think about giving &lt;code>name&lt;/code> as a POST argument, nope. &lt;code>username&lt;/code>, &lt;code>uid&lt;/code>, nope, nothing works. The only thing I noticed was that no matter what&amp;rsquo;s being passed in &lt;code>secret&lt;/code> it would always say &amp;ldquo;Fishy doesn&amp;rsquo;t know you&amp;rdquo;.&lt;br>
Everyone was stumped. Every person on the IRC was losing their sanity (:D), saying things like &amp;ldquo;RAAAAAAH&amp;rdquo; non-stop, just see for yourselves:&lt;/p>
&lt;pre tabindex="0">&lt;code>2025/10/15 21:37:06 &amp;lt;bonkbonk&amp;gt; cat you bastard!!11!
2025/10/15 21:37:02 &amp;lt;sizeofcat&amp;gt; what? :D
2025/10/15 21:37:11 &amp;lt;Myrdincx&amp;gt; ARGHHH
2025/10/15 21:37:12 &amp;lt;Myrdincx&amp;gt; aJDODIAHODAHd
2025/10/15 21:38:24 &amp;lt;bonkbonk&amp;gt; RAAAAH
...
2025/10/15 21:42:27 &amp;lt;sizeofcat&amp;gt; new badge, count the number of &amp;#34;RAAAAH&amp;#34; in the irc channel
2025/10/15 21:42:35 &amp;lt;Myrdincx&amp;gt; fr
2025/10/15 21:42:38 &amp;lt;Myrdincx&amp;gt; RAHHH
2025/10/15 21:43:52 &amp;lt;bonkbonk&amp;gt; RAAAAAAAH
...
2025/10/15 21:45:19 &amp;lt;bonkbonk&amp;gt; https://inv.nadeko.net/watch?v=PL9iMPx9CpQ
2025/10/15 21:45:21 &amp;lt;bonkbonk&amp;gt; egggh
2025/10/15 21:45:23 &amp;lt;bonkbonk&amp;gt; fibsh
...
2025/10/15 21:55:49 &amp;lt;sizeofcat&amp;gt; i don&amp;#39;t understand how you get onto a forbidden access page :D
...
2025/10/15 21:57:10 &amp;lt;sizeofcat&amp;gt; oooh, a change!
2025/10/15 21:57:17 &amp;lt;sizeofcat&amp;gt; no more RAAAAAAh?
2025/10/15 21:57:19 &amp;lt;rosetta&amp;gt; fking 403
2025/10/15 21:57:34 &amp;lt;bonkbonk&amp;gt; RAAAAAAAH
2025/10/15 21:57:25 &amp;lt;sizeofcat&amp;gt; haha
2025/10/15 21:57:26 &amp;lt;rosetta&amp;gt; RAAAH
2025/10/15 21:57:34 &amp;lt;rosetta&amp;gt; WHAT MEAN FORBIDDEN
2025/10/15 21:57:49 &amp;lt;rosetta&amp;gt; i deserve access im pure of heart
...
2025/10/15 22:07:44 &amp;lt;Myrdincx&amp;gt; fishy doesnt like me either :(
...
2025/10/15 22:14:11 &amp;lt;Myrdincx&amp;gt; Im not quite sure what type of secrets fishy demands..
2025/10/15 22:14:20 &amp;lt;Myrdincx&amp;gt; Ive tried all kinds of things
2025/10/15 22:14:35 &amp;lt;sizeofcat&amp;gt; well, you gave fishy the bait?
2025/10/15 22:14:38 &amp;lt;Myrdincx&amp;gt; yeah I did
2025/10/15 22:14:46 &amp;lt;Myrdincx&amp;gt; fishy didnt like my bait :(
...
2025/10/15 22:19:33 &amp;lt;Myrdincx&amp;gt; sizeofcat, fishy doesnt know me :(
2025/10/15 22:19:38 &amp;lt;sizeofcat&amp;gt; :(
...
2025/10/15 22:25:57 &amp;lt;Myrdincx&amp;gt; Im angry at fishy
2025/10/15 22:26:05 &amp;lt;Myrdincx&amp;gt; Ive tried to tell fishy who I am
2025/10/15 22:26:09 &amp;lt;Myrdincx&amp;gt; and he just doesnt care :&amp;#39;)
2025/10/15 22:26:14 &amp;lt;Myrdincx&amp;gt; He still doesn&amp;#39;t know who I am..
2025/10/15 22:27:58 &amp;lt;bonkbonk&amp;gt; sounds dramatic lol, &amp;#34;after all these years... fishy doesn&amp;#39;t even know who i am...&amp;#34;
2025/10/15 22:28:29 &amp;lt;Myrdincx&amp;gt; Fishy demands secrets, I give him secrets (i dont know the secret) and fishy doesnt want to know me..
...
2025/10/15 23:55:48 &amp;lt;bonkbonk&amp;gt; this was the saddest attempt
2025/10/15 23:55:50 &amp;lt;bonkbonk&amp;gt; curl -X POST https://sizeof.cat/cafe/ -d &amp;#39;action=api&amp;#39; -d &amp;#39;token=&amp;#39; -d &amp;#39;controller=fishy&amp;#39; -d &amp;#39;secret=fishy please let me in&amp;#39;
2025/10/15 23:55:50 &amp;lt;bonkbonk&amp;gt; {&amp;#34;version&amp;#34;:&amp;#34;1.5.66&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;Wed, 15 Oct 2025 20:10:32 +0000&amp;#34;,&amp;#34;message&amp;#34;:{&amp;#34;error&amp;#34;:true,&amp;#34;text&amp;#34;:&amp;#34;Fishy doesn&amp;#39;t know you.&amp;#34;}}
2025/10/15 23:55:56 &amp;lt;sizeofcat&amp;gt; haha
&lt;/code>&lt;/pre>&lt;p>(also come join us on &lt;code>irc.libera.chat&lt;/code>, channel &lt;code>##cafe&lt;/code> :D)&lt;/p>
&lt;p>And then&amp;hellip;&lt;/p>
&lt;pre tabindex="0">&lt;code>2025/10/15 22:52:15 &amp;lt;sizeofcat&amp;gt; oh, that was a big mistake on my side, the rights on the fishy file were not world read
2025/10/15 22:52:23 &amp;lt;sizeofcat&amp;gt; so, go and download the fishy file again :(
&lt;/code>&lt;/pre>&lt;p>(It&amp;rsquo;s okay cat, everyone makes mistakes.)&lt;br>
So, finally we can move forward again&amp;hellip; just until I saw the contents of fishy&amp;hellip; It&amp;rsquo;s a file that&amp;rsquo;s &lt;strong>exactly&lt;/strong> 300KiB with its contents being encrypted.&lt;br>
The first two things that I though to do were:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ file fishy
fishy: data
$ file --mime-type fishy
fishy: application/octet-stream
&lt;/code>&lt;/pre>&lt;p>Manually inspecting the start of the file also didn&amp;rsquo;t help&amp;hellip; there is no header.&lt;br>
Here are some of my attempts on trying to read the contents of the file:&lt;/p>
&lt;pre tabindex="0">&lt;code>$ gpg --decrypt fishy
gpg: no valid OpenPGP data found.
gpg: decrypt_message failed: Unknown system error
$ algorithms=({A LOT OF DIFFERENT ALGORITHMS IN ARRAY HERE}); for i in &amp;#34;${algorithms[@]}&amp;#34;; do openssl enc -d -in fishy -pass file:bait -$i -nosalt; done
&lt;/code>&lt;/pre>&lt;p>Suddenly I remembered one of &lt;a href="http://sizeof.cat/post/encrypted-luks-volume-inside-a-file/">sizeofcat&amp;rsquo;s old posts&lt;/a>. The file is &lt;strong>exactly&lt;/strong> 300KiB, could it be a LUKS volume?&lt;/p>
&lt;pre tabindex="0">&lt;code>$ cryptsetup open fishy fish
Device fishy is not a valid LUKS device.
&lt;/code>&lt;/pre>&lt;p>Stumped again.&lt;/p>
&lt;img style="width:300px" src="img/stumped.png" />
&lt;pre tabindex="0">&lt;code>2025/10/16 14:25:09 &amp;lt;bonkbonk&amp;gt; sudo cryptsetup open fishy fish
2025/10/16 14:25:09 &amp;lt;bonkbonk&amp;gt; Device fishy is not a valid LUKS device.
2025/10/16 14:25:20 &amp;lt;sizeofcat&amp;gt; doublebonk, you might be onto something there
&lt;/code>&lt;/pre>&lt;p>This clue was what got me on the track. I then checked; the LUKS header itself is 2MB, so it couldn&amp;rsquo;t be LUKS. But I &amp;ldquo;was onto something&amp;rdquo;. Might it be Veracrypt then???&lt;br>
&lt;em>&lt;strong>DING DING DING DING DING!!!&lt;/strong>&lt;/em> I opened the container using &lt;code>p6EHsgP79RMUOcanpt8qlUWHC36XaseC&lt;/code> as password. Before my very eyes I saw fishy&amp;rsquo;s beautiful &lt;code>readme.txt&lt;/code>. It finally explained what exactly to pass in the &lt;code>secret&lt;/code> POST argument.&lt;/p>
&lt;pre tabindex="0">&lt;code>API
http(s)://sizeof.cat/cafe/
ENDPOINT
index.php
PARAMS
action=api
token=
controller=fishy
secret=md5(sha256(bait)+token)
RESULT
enjoy fishy
&lt;/code>&lt;/pre>&lt;p>Okay, bait = &lt;code>p6EHsgP79RMUOcanpt8qlUWHC36XaseC&lt;/code>, token is your API access token from The Café, let&amp;rsquo;s say token = &lt;code>XYZ&lt;/code>.&lt;br>
You can use coreutils from or your operating system or a website (&lt;a href="https://emn178.github.io/online-tools/sha256.html">sha256&lt;/a>, &lt;a href="https://www.md5hashgenerator.com/">md5&lt;/a>).&lt;br>
sha256(bait):&lt;/p>
&lt;pre tabindex="0">&lt;code>$ echo -n p6EHsgP79RMUOcanpt8qlUWHC36XaseC | sha256sum
6e216b1f0ba01ae4001bd3d93f255d0820418205783290297551f8e6dc45a18e -
&lt;/code>&lt;/pre>&lt;p>sha256(bait)+token = &lt;code>6e216b1f0ba01ae4001bd3d93f255d0820418205783290297551f8e6dc45a18eXYZ&lt;/code>.&lt;br>
md5(sha256(bait)+token):&lt;/p>
&lt;pre tabindex="0">&lt;code>$ echo -n 6e216b1f0ba01ae4001bd3d93f255d0820418205783290297551f8e6dc45a18eXYZ | md5sum
0c3901c1a6b86fba530c6c8d7f41f1be -
&lt;/code>&lt;/pre>&lt;p>Now to only pass that as &lt;code>secret&lt;/code>.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ curl -X POST https://sizeof.cat/cafe/ -d &amp;#39;action=api&amp;#39; -d &amp;#39;token=XYZ&amp;#39; -d &amp;#39;controller=fishy&amp;#39; -d &amp;#39;secret=0c3901c1a6b86fba530c6c8d7f41f1be&amp;#39;
{&amp;#34;version&amp;#34;:&amp;#34;1.5.70&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;Thu, 16 Oct 2025 12:44:43 +0000&amp;#34;,&amp;#34;message&amp;#34;:{&amp;#34;error&amp;#34;:false,&amp;#34;text&amp;#34;:&amp;#34;You caught Fishy!&amp;#34;}}
&lt;/code>&lt;/pre>&lt;h2 id="finally-fishy">Finally. Fishy.&lt;/h2>
&lt;p>After solving the puzzle &lt;em>&lt;strong>my way&lt;/strong>&lt;/em> I received this message:&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;sizeofcat&amp;gt; there is a secret parameter called bait with the contents fishy
&amp;lt;sizeofcat&amp;gt; you can pass that to the api
&amp;lt;sizeofcat&amp;gt; and there is a 1/5 chance it will reply you with a clue
&amp;lt;sizeofcat&amp;gt; try it :D
&amp;lt;sizeofcat&amp;gt; that&amp;#39;s what i was saying &amp;#34;you need to bait the fish!&amp;#34;
&lt;/code>&lt;/pre>&lt;pre tabindex="0">&lt;code>curl -X POST https://sizeof.cat/cafe/ -d &amp;#39;action=api&amp;#39; -d &amp;#39;token=&amp;#39; -d &amp;#39;controller=fishy&amp;#39; -d &amp;#39;bait=fishy&amp;#39;
{&amp;#34;version&amp;#34;:&amp;#34;1.5.70&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;Thu, 16 Oct 2025 20:09:09 +0000&amp;#34;,&amp;#34;message&amp;#34;:{&amp;#34;error&amp;#34;:false,&amp;#34;text&amp;#34;:&amp;#34;You missed Fishy, but you caught a Vera.&amp;#34;}}
&lt;/code>&lt;/pre>&lt;p>Oh. It was that easy&amp;hellip;&lt;/p>
&lt;hr>
&lt;p>Moral of the event: &lt;a href="https://inv.nadeko.net/watch?v=PL9iMPx9CpQ">fibsh&lt;/a>, RAAAAH and&lt;/p>
&lt;pre tabindex="0">&lt;code>2025/10/15 22:23:42 &amp;lt;Myrdincx&amp;gt; fuck this fish
2025/10/15 22:23:48 &amp;lt;Myrdincx&amp;gt; i dont like him
2025/10/15 22:23:59 &amp;lt;bonkbonk&amp;gt; FUCK THIS FISH
&lt;/code>&lt;/pre>&lt;p>The whole thing was quite fun&amp;hellip; The constant thinking and guessing about what could it be and how to open it connected the people on the IRC channel a little more.&lt;/p></description><category>cafe</category><category>challenge</category></item><item><title>Usenet on OS X in 2025</title><link>http://sizeof.cat/post/usenet-2025-osx/</link><pubDate>Mon, 13 Oct 2025 05:21:22 +0000</pubDate><author/><guid>http://sizeof.cat/post/usenet-2025-osx/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/usenet-2025-osx/img/usenet.png" alt="Usenet">&lt;/figure>&lt;/p>
&lt;p>Short article because it&amp;rsquo;s pretty easy to get on the Usenet using OS X (Leopard, maybe even Tiger), regardless of current year: basically you need a subscription to a News account, a computer running OS X (doh) and a Usenet client.&lt;/p>
&lt;p>The subscription part can be solved for free using the services provided by Eternal September: &lt;a href="https://eternal-september.org/RegisterNewsAccount.php?language=en">register for an account on their website&lt;/a>, make a note of the username you choose and the password you receive in e-mail and you&amp;rsquo;re good to go.&lt;/p>
&lt;p>Next you&amp;rsquo;ll need a computer running OS X, preferable PowerPC because why not, bonus chic points for PowerBooks or iBooks.&lt;/p>
&lt;p>And the Usenet part is pretty easy too, depending on whether you like GUI or TUI applications, you can either go with Emacs or &lt;a href="http://pan.rebelbase.com">Pan&lt;/a>, or a GUI application like Panic&amp;rsquo;s Unison. Beware of versions 2.0+, you cannot register them easily because they require a connection to Panic&amp;rsquo;s servers for that, but &lt;a href="http://sizeof.cat/post/usenet-2025-osx/files/Unison_1.8.1.dmg">1.8.1&lt;/a> is perfect for reading news from the comfort of OS X. Register it using &lt;code>0001-0589-3106-0032&lt;/code> and you&amp;rsquo;re done.&lt;/p>
&lt;p>The configuration for Eternal September&amp;rsquo;s New server is this:&lt;/p>
&lt;pre tabindex="0">&lt;code>Server name: news.eternal-september.org
Port : 119 (NNTP)
Port : 563 (encrypted connection NNTPS)
&lt;/code>&lt;/pre>&lt;p>And since the TLS stack in OS X is so old you can only use the &lt;code>119&lt;/code> port (no NNTPS). Add your username and password in the mix, make sure you configure Unison, add your signature, and have fun browsing Usenet like it&amp;rsquo;s 1995. Or something.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/usenet-2025-osx/img/screen.png" alt="OS X Screenshot">&lt;/figure>&lt;/p></description><category>usenet</category><category>osx</category><category>powerpc</category></item><item><title>Huawei E3131 and friends, on OS X Leopard (PowerPC)</title><link>http://sizeof.cat/post/huawei-e3131-and-friends-on-osx-leopard-powerpc/</link><pubDate>Thu, 02 Oct 2025 19:23:06 +0000</pubDate><author/><guid>http://sizeof.cat/post/huawei-e3131-and-friends-on-osx-leopard-powerpc/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/huawei-e3131-and-friends-on-osx-leopard-powerpc/img/cover.jpg" alt="Huawei E3131">&lt;/figure>&lt;/p>
&lt;p>You know I said &lt;a href="http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/">in this article&lt;/a> &amp;ldquo;how I wish I could find a working PowerPC driver&amp;rdquo; for my &lt;strong>Huawei E3131&lt;/strong> 3G modem? Well, today I decided to do another try and dig the old archives some more. I already had about 500Mb of drivers, all not working on PowerPC obviously, for various reasons (no ppc slice, using a newer version of IOKit, or simply won&amp;rsquo;t load), and today I think I went over 1GB of drivers and Huawei partner binaries and ISOs.&lt;/p>
&lt;p>After patching so many kexts that my fingers went numb, I ran into a kext that looked promising, except it didn&amp;rsquo;t trigger anything when I plugged my Huawei E3131 modem in a USB port, which means the device definitions were wrong. So, I opened &lt;code>HuaweiDataCardACMData.kext/Contents/Info.plist&lt;/code> and I added the three interface definitions for the E3131 modem, PCui interface and diagnostic interface. &lt;a href="http://sizeof.cat/post/huawei-e3131-and-friends-on-osx-leopard-powerpc/files/HuaweiDataCardACMData.kext.zip">The modified kext file can be found here&lt;/a>, archived.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HUAWEI_1506_DIAG&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>CFBundleIdentifier&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>com.huawei.driver.HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceBaseName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HUAWEIMobile-&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceSuffixName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>Diag&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOProviderClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>IOUSBInterface&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bConfigurationValue&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bInterfaceNumber&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>3&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idProduct&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>5382&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idVendor&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>4817&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HUAWEI_1506_MODEM&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>CFBundleIdentifier&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>com.huawei.driver.HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceBaseName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HUAWEIMobile-&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceSuffixName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>Modem&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOProviderClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>IOUSBInterface&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bConfigurationValue&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bInterfaceNumber&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>0&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idProduct&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>5382&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idVendor&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>4817&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HUAWEI_1506_PCUI&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>CFBundleIdentifier&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>com.huawei.driver.HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceBaseName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HUAWEIMobile-&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>HWInterfaceSuffixName&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>Pcui&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>HuaweiDataCardACMData&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>IOProviderClass&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>IOUSBInterface&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bConfigurationValue&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>bInterfaceNumber&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idProduct&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>5382&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;key&amp;gt;&lt;/span>idVendor&lt;span class="nt">&amp;lt;/key&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;integer&amp;gt;&lt;/span>4817&lt;span class="nt">&amp;lt;/integer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dict&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To install this kext, unzip, copy the files to &lt;code>/System/Library/Extensions/&lt;/code> and load it using &lt;code>kextload&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ unzip HuaweiDataCardACMData.kext.zip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ sudo cp -R HuaweiDataCardACMData.kext /System/Library/Extensions/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ sudo chown -R root:wheel /System/Library/Extensions/HuaweiDataCardACMData.kext
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ sudo kextload /System/Library/Extensions/HuaweiDataCardACMData.kext
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you plug the Huawei E3131 modem into an USB port (&lt;strong>and if it has CD mode deactivated&lt;/strong>), new devices will appear inside &lt;code>/dev/&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ls /dev/tty.HUAWEIMobile*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/tty.HUAWEIMobile-Modem /dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can use &lt;code>minicom&lt;/code> or &lt;code>screen&lt;/code> to connect to the &lt;code>/dev/tty.HUAWEIMobile-Pcui&lt;/code> port and issue AT commands to the modem, or you can configure OS X networking to use the &lt;code>/dev/tty.HUAWEIMobile-Modem&lt;/code> port to connect to the 3G network.&lt;/p>
&lt;p>To configure networking, go to &amp;ldquo;System Preferences&amp;rdquo; -&amp;gt; &amp;ldquo;Network&amp;rdquo; -&amp;gt; &amp;ldquo;HUAWEIMobile-Modem&amp;rdquo;, put &lt;code>*99#&lt;/code> as the phone number (or whatever your ISP gave you), click &amp;ldquo;Advanced&amp;rdquo; and select modem vendor as &amp;ldquo;Generic&amp;rdquo;, model as &amp;ldquo;GPRS GSM 3G&amp;rdquo; and APN as &amp;ldquo;internet&amp;rdquo; or &amp;ldquo;net&amp;rdquo; (depends on your ISP). Click OK or Apply and now you can connect successfully.&lt;/p>
&lt;p>I don&amp;rsquo;t suggest you install the Mobile Partner software since it&amp;rsquo;s in Java and it starts &lt;strong>very slow&lt;/strong>, but if you want that you can either &lt;a href="files/Mobile_Partner.pkg.zip">install this package&lt;/a> or just &lt;a href="files/Mobile_Partner.app.zip">unzip this archive&lt;/a> and copy &lt;code>Mobile Partner.app&lt;/code> to &lt;code>/Applications&lt;/code> (you will also need this &lt;a href="files/RXTX_Tiger.pkg.zip">Java library for serial comms&lt;/a>). Your choice. It will automatically detect the modem if you installed my patched kext and will connect to your ISP network.&lt;/p>
&lt;p>You can use &lt;code>screen&lt;/code> or &lt;code>minicom&lt;/code> to query the modem for capabilities, information, and to switch it from disk mode into modem mode (something a Linux-distro would normally do using the &lt;code>usb-modeswitch&lt;/code> package).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ ls /dev/tty.HUAWEIMobile*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ screen /dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AT^SETPORT&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;FF;10,12,16&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OK
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/dial.png" alt="Huawei E3131 dial">&lt;/figure>&lt;/p>
&lt;p>The AT commands that can be issued to the modem can be found in &lt;a href="http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/">this parent article&lt;/a>.&lt;/p></description><category>huawei</category><category>modem</category><category>3g</category><category>os x</category><category>powerpc</category><category>leopard</category></item><item><title>Huawei E3131 and friends, on macOS Catalina (x64)</title><link>http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/</link><pubDate>Wed, 01 Oct 2025 12:52:39 +0000</pubDate><author/><guid>http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/img/cover.jpg" alt="Huawei E3131">&lt;/figure>&lt;/p>
&lt;p>If you have an older &lt;strong>Huawei E3131&lt;/strong> 3G USB stick and you want to use it, and you run &lt;strong>macOS Catalina&lt;/strong>, you&amp;rsquo;re in for a wild ride. All the drivers you can find online will not work, and good luck trying to find anything on Huawei&amp;rsquo;s website.&lt;/p>
&lt;p>The only working version of the &lt;strong>Huawei E3131&lt;/strong> modem driver I could find for macOS 10.15 &amp;ldquo;Catalina&amp;rdquo; (and I searched for weeks) &lt;a href="http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/files/MobileConnectDriver.pkg.zip">is this one&lt;/a>. All the drivers seem to be for older versions of macOS (32bit ones, how I wish I could find a working PowerPC driver) and for obvious reasons they won&amp;rsquo;t work on Catalina.&lt;/p>
&lt;p>After installing the driver you don&amp;rsquo;t even need the bloated &lt;strong>&amp;ldquo;Mobile Partner&amp;rdquo;&lt;/strong> software (if you find one that works) from Huawei and friends (ISPs usually re-brand the software using their own logos, colors and unneeded features), you can just pop in a SIM card, switch the device from disk mode to modem mode, plug the USB modem in and go to macOS&amp;rsquo; &lt;strong>&amp;ldquo;System Preferences&amp;rdquo;&lt;/strong> -&amp;gt; &lt;strong>&amp;ldquo;Network&amp;rdquo;&lt;/strong>. A new device will be there, called &lt;em>&amp;ldquo;HUAWEI Mobile&amp;rdquo;&lt;/em> or something similar, and you can use the &lt;code>*99#&lt;/code> Telephone Number to dial using the modem.&lt;/p>
&lt;p>You can use &lt;code>screen&lt;/code> or &lt;code>minicom&lt;/code> to query the modem for capabilities, information, and to switch it from disk mode into modem mode (something a Linux-distro would normally do using the &lt;code>usb-modeswitch&lt;/code> package).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ ls /dev/tty.HUAWEIMobile*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ screen /dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AT^SETPORT&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;A1;10,12,16&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OK
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now if you exit screen and re-plug your modem, you&amp;rsquo;ll notice an obvious change:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ls /dev/tty.HUAWEIMobile*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/tty.HUAWEIMobile-Modem /dev/tty.HUAWEIMobile-Pcui
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The USB modem is operational now, and you can dial &lt;code>*99#&lt;/code> to establish a connection.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/huawei-e3131-and-friends-on-macos-catalina/img/dial.png" alt="Huawei E3131 dial">&lt;/figure>&lt;/p>
&lt;hr>
&lt;p>Getting version info using &lt;code>screen&lt;/code> or &lt;code>minicom&lt;/code>:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^VERSION?
^VERSION:BDT:Apr 10 2014, 14:10:47
^VERSION:EXTS:21.318.25.00.623
^VERSION:INTS:
^VERSION:EXTD:UTPS23.015.05.00.623_MAC23.015.05.00.623_LNX23.015.05.00.623
^VERSION:INTD:
^VERSION:EXTH:CH1E3531SM
^VERSION:INTH:
^VERSION:EXTU:E3131
^VERSION:INTU:
^VERSION:CFG:1004
^VERSION:PRL:
^VERSION:INI:
OK
&lt;/code>&lt;/pre>&lt;p>Getting modem capabilities info:&lt;/p>
&lt;pre tabindex="0">&lt;code>ATI
Manufacturer: huawei
Model: E3131
Revision: 21.318.25.00.623
IMEI: &amp;lt;REDACTED&amp;gt;
+GCAP: +CGSM,+DS,+ES
OK
&lt;/code>&lt;/pre>&lt;p>Switch the device into modem mode:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^SETPORT=&amp;#34;A1;10,12,16&amp;#34;
OK
&lt;/code>&lt;/pre>&lt;p>Check the device mode:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^SETPORT?
^SETPORT:A1;10,12,16
OK
&lt;/code>&lt;/pre>&lt;p>List all the device modes:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^SETPORT=?
^SETPORT:1: MODEM
^SETPORT:2: PCUI
^SETPORT:3: DIAG
^SETPORT:10: 4G MODEM
^SETPORT:12: 4G PCUI
^SETPORT:6: GPS CONTROL
^SETPORT:13: 4G DIAG
^SETPORT:5: GPS
^SETPORT:A: BLUE TOOTH
^SETPORT:16: NCM
^SETPORT:A2: SD
^SETPORT:A1: CDROM
OK
&lt;/code>&lt;/pre>&lt;p>As you can see, this modem has GPS capabilities, but in order to access the GPS data we need to add the GPS mode to the device (both &lt;code>GPS&lt;/code> and &lt;code>GPS CONTROL&lt;/code> flags), though I haven&amp;rsquo;t found a way to issue &lt;code>AT_OGPS&lt;/code> commands and retrieve GSM data:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^SETPORT=&amp;#34;A1;10,12,16,5,6&amp;#34;
OK
&lt;/code>&lt;/pre>&lt;p>&lt;strong>Be extra careful never to remove the &lt;code>PCUI&lt;/code> (2) or &lt;code>4G PCUI&lt;/code> (12) flags from the device modes, else you won&amp;rsquo;t be able to connect to the modem via serial, anymore.&lt;/strong>
Check the dialing configuration:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT+CGDCONT?
+CGDCONT: 1,&amp;#34;IP&amp;#34;,&amp;#34;net&amp;#34;,&amp;#34;&amp;#34;,0,0,0,0
OK
&lt;/code>&lt;/pre>&lt;p>And you can also dial using &lt;code>ATDT *99#&lt;/code>.&lt;/p>
&lt;p>To send a SMS, switch into text mode first (press CTRL+ Z after you finished writing the message, to send it):&lt;/p>
&lt;pre tabindex="0">&lt;code>AT+CMGF=1
+CMGF: 1
OK
AT+CMGS=&amp;#34;+97121234567&amp;#34;
&amp;gt; hello
+CMGS: 85
OK
&lt;/code>&lt;/pre>&lt;p>To read your SMS messages, switch into text mode first (use &lt;code>all&lt;/code> for all messages, &lt;code>rec read&lt;/code> for read messages, &lt;code>rec unread&lt;/code> for unread messages:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT+CMGF=1
+CMGF: 1
OK
AT+CMGL=&amp;#34;all&amp;#34;,
+CMGL: 0,&amp;#34;REC UNREAD&amp;#34;,&amp;#34;+97121234567&amp;#34;,,&amp;#34;25/10/01,10:42:50+12&amp;#34;
hello
OK
&lt;/code>&lt;/pre>&lt;p>To read a specific SMS message, find its ID from the previous command (&lt;code>+CMGL: 0&lt;/code> line, &lt;code>0&lt;/code> is the ID here) first:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT+CMGR=0
+CMGR: &amp;#34;REC READ&amp;#34;,&amp;#34;+97121234567&amp;#34;,,&amp;#34;25/10/01,10:42:50+12&amp;#34;
hello
OK
&lt;/code>&lt;/pre>&lt;p>Get various information about the modem:&lt;/p>
&lt;pre tabindex="0">&lt;code>AT+GMI
huawei
OK
AT+GMM
E3131
OK
AT+GSN
&amp;lt;REDACTED&amp;gt;
OK
&lt;/code>&lt;/pre>&lt;p>If you want to use the 3G modem on macOS Catalina only, and you need just the modem functions (no SD, GPS, CD), set the device modem to minimal (&lt;code>10&lt;/code> is modem, &lt;code>12&lt;/code> is control interface port):&lt;/p>
&lt;pre tabindex="0">&lt;code>AT^SETPORT=&amp;#34;FF;10,12&amp;#34;
OK
&lt;/code>&lt;/pre>&lt;p>AT codes are fun, aren&amp;rsquo;t they?&lt;/p></description><category>huawei</category><category>modem</category><category>3g</category><category>macos</category><category>catalina</category></item><item><title>Café Weekend - Round 1: Quake 2</title><link>http://sizeof.cat/post/cafe-weekend-round-1-quake2/</link><pubDate>Sun, 28 Sep 2025 10:50:04 +0000</pubDate><author/><guid>http://sizeof.cat/post/cafe-weekend-round-1-quake2/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/cafe-weekend-round-1-quake2/img/cover.jpg" alt="Quake 2">&lt;/figure>&lt;/p>
&lt;p>The first event organized by the Café members after almost a month since launch of &lt;a href="http://sizeof.cat/cafe/">The Café&lt;/a>, completed successfully! We launched our own Quake 2 server, &lt;a href="http://sizeof.cat/post/the-quake-2-thunderdome/">everybody was invited to have fun on it&lt;/a>, and on &lt;strong>September 27, 20:00 UTC time&lt;/strong> we all got online to eat pizza (like there was time for that, lol), drink beverages, have fun, and definitely make a mess. Literally, I logged in hours after the event ended and I was greeted by the corpses and limbs of everybody who had the misfortune of being on the receiving end of a rocket launcher. We played the &lt;code>q2dm1&lt;/code> map for almost two hours, using various Yamagi Q2 clients, Fruitz of Dojo, GoG and Steam releases, etc, on both modern and retro hardware (I heard there were people playing on PowerPC machines, but their secret is safe with me).&lt;/p>
&lt;p>To be honest I was expecting about 5 people on it (do people really know what Quake is nowadays?), but I was blown away by the participation, &lt;strong>28&lt;/strong> people came online at various times during the deathmatch, to say hi and frag with us, with a peak of &lt;strong>21&lt;/strong> people online at one time. We even managed to crash the server twice, once after about an hour of carnage and mayhem and another time near the end of the deathmatch.&lt;/p>
&lt;p>I hope everybody had fun, including the beginners, who did an &lt;strong>EXCELLENT&lt;/strong> job of holding out against way more experienced players and their fancy rocket jumps and railgunning.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/cafe-weekend-round-1-quake2/img/badges.png" alt="Quake 2">&lt;/figure>&lt;/p>
&lt;p>The winner and all the Café participants got their new and shiny badges to certify their accomplishments, and hopefully a night to remember. And thank you &lt;a href="http://andrei.xyz">Andrei&lt;/a> for the excellent promo image and the badge design!&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/cafe-weekend-round-1-quake2/img/score.jpg" alt="Quake 2">&lt;figcaption>First 12 players on the scoreboard.&lt;/figcaption>&lt;/figure>&lt;/p>
&lt;p>We have plans for doing this Café event monthly (with different games, as long as they are multiplayer) and we&amp;rsquo;re gathering suggestions for the next game. If you&amp;rsquo;re not already a member of &lt;a href="http://sizeof.cat/cafe/">The Café&lt;/a>, you don&amp;rsquo;t even know what you&amp;rsquo;re losing.&lt;/p>
&lt;p>&lt;strong>Rectify that error on your part, and &lt;a href="http://sizeof.cat/about/#communication">send me an e-mail&lt;/a> with one reason why you should have a Café invite.&lt;/strong>&lt;/p>
&lt;p>I&amp;rsquo;ll end this article with one of the speeches from Babylon 5, the &lt;a href="https://inv.nadeko.net/watch?v=NzJaQtZty5M">Battle of the Line&lt;/a> speech. Fans will know.&lt;/p>
&lt;blockquote>
&lt;p>We continue to broadcast our surrender and a plea for mercy. They have not responded. We can therefore only conclude that we stand at the twilight of the human race.&lt;/p>
&lt;p>In order to buy more time for our evacuation transports to leave Earth, we ask for the support of every ship capable of fighting to take part in a last defense of our homeworld. We will not lie to you. We do not believe that survival is a possibility. We believe that anyone who joins this battle, will never come home. But, for every ten minutes, we can delay the military advance, several hundred more civilians may have a chance to escape to neutral territory. Though Earth may fall, the human race must have a chance to continue elsewhere.&lt;/p>
&lt;p>No greater sacrifice has ever been asked of people but I ask you now, to step forward one last time, one last battle to hold the line against the night.&lt;/p>
&lt;p>May God go with you all.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Thank you everybody, and see you next game!&lt;/strong>&lt;/p>
&lt;h3 id="screenshots">Screenshots&lt;/h3>
&lt;table class="no-borders">
&lt;tr>
&lt;td>&lt;a href="img/screenshots/1.png">&lt;img loading="lazy" src="img/screenshots/1_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/2.png">&lt;img loading="lazy" src="img/screenshots/2_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/3.png">&lt;img loading="lazy" src="img/screenshots/3_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/4.png">&lt;img loading="lazy" src="img/screenshots/4_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/5.png">&lt;img loading="lazy" src="img/screenshots/5_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/6.png">&lt;img loading="lazy" src="img/screenshots/6_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/7.png">&lt;img loading="lazy" src="img/screenshots/7_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/8.png">&lt;img loading="lazy" src="img/screenshots/8_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/9.png">&lt;img loading="lazy" src="img/screenshots/9_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/10.png">&lt;img loading="lazy" src="img/screenshots/10_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/11.png">&lt;img loading="lazy" src="img/screenshots/11_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/12.png">&lt;img loading="lazy" src="img/screenshots/12_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/13.png">&lt;img loading="lazy" src="img/screenshots/13_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/14.png">&lt;img loading="lazy" src="img/screenshots/14_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/15.png">&lt;img loading="lazy" src="img/screenshots/15_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/16.png">&lt;img loading="lazy" src="img/screenshots/16_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/17.png">&lt;img loading="lazy" src="img/screenshots/17_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/18.png">&lt;img loading="lazy" src="img/screenshots/18_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/19.png">&lt;img loading="lazy" src="img/screenshots/19_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/20.png">&lt;img loading="lazy" src="img/screenshots/20_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/21.png">&lt;img loading="lazy" src="img/screenshots/21_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/22.png">&lt;img loading="lazy" src="img/screenshots/22_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/23.png">&lt;img loading="lazy" src="img/screenshots/23_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/24.png">&lt;img loading="lazy" src="img/screenshots/24_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/25.png">&lt;img loading="lazy" src="img/screenshots/25_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/26.png">&lt;img loading="lazy" src="img/screenshots/26_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/27.png">&lt;img loading="lazy" src="img/screenshots/27_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/28.png">&lt;img loading="lazy" src="img/screenshots/28_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/29.png">&lt;img loading="lazy" src="img/screenshots/29_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/30.png">&lt;img loading="lazy" src="img/screenshots/30_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/31.png">&lt;img loading="lazy" src="img/screenshots/31_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/32.png">&lt;img loading="lazy" src="img/screenshots/32_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/33.png">&lt;img loading="lazy" src="img/screenshots/33_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/34.png">&lt;img loading="lazy" src="img/screenshots/34_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/35.png">&lt;img loading="lazy" src="img/screenshots/35_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/36.png">&lt;img loading="lazy" src="img/screenshots/36_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/37.png">&lt;img loading="lazy" src="img/screenshots/37_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/38.png">&lt;img loading="lazy" src="img/screenshots/38_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/39.png">&lt;img loading="lazy" src="img/screenshots/39_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/40.png">&lt;img loading="lazy" src="img/screenshots/40_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/41.png">&lt;img loading="lazy" src="img/screenshots/41_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/42.png">&lt;img loading="lazy" src="img/screenshots/42_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/43.png">&lt;img loading="lazy" src="img/screenshots/43_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/44.png">&lt;img loading="lazy" src="img/screenshots/44_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/45.png">&lt;img loading="lazy" src="img/screenshots/45_tb.jpg" />&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="img/screenshots/46.png">&lt;img loading="lazy" src="img/screenshots/46_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&lt;a href="img/screenshots/47.png">&lt;img loading="lazy" src="img/screenshots/47_tb.jpg" />&lt;/a>&lt;/td>
&lt;td>&amp;nbsp;&lt;/td>
&lt;/tr>
&lt;/table></description><category>games</category><category>cafe</category><category>quake</category><category>challenge</category></item><item><title>The Quake 2 Thunderdome!</title><link>http://sizeof.cat/post/the-quake-2-thunderdome/</link><pubDate>Wed, 24 Sep 2025 09:16:52 +0000</pubDate><author/><guid>http://sizeof.cat/post/the-quake-2-thunderdome/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/the-quake-2-thunderdome/img/quake2.jpg" alt="Quake 2">&lt;/figure>&lt;/p>
&lt;blockquote>
&lt;p>Remember, this is the grind, the battle royale between you and your mind, your body and the devil on your shoulders telling you this is just a game, this is just a waste of time, your opponents are stronger than you. Drown out the voice of uncertainty with the sound of your own heartbeat, burn away your self doubt with the fire that&amp;rsquo;s beneath you. Remember what you&amp;rsquo;re fighting for and never forget that momentum is a cruel mistress, she can turn on a dime with the smallest mistake, she is ever searching for the weak place in your armor, that one tiny thing you forgot to prepare for. So as long as the demon is hiding the details the question remains: IS THAT ALL YOU GOT? ARE YOU SURE?&lt;/p>
&lt;p>And when the answer is YES, when you have done all you can to prepare yourself for battle, THEN it&amp;rsquo;s time to go forth and boldly face the enemy, the enemy within. Only now you must take that fight into the open, into hostile territory. You are a lion in a field of lions, all hunting the same elusive pray with a desperate starvation that says VICTORY is the only thing that can keep you alive. So believe that voice that says that &amp;ldquo;you CAN run a little faster&amp;rdquo;, and &amp;ldquo;you CAN throw a little harder&amp;rdquo;, and that, for you, the laws of physics are merely a suggestion.&lt;/p>
&lt;/blockquote>
&lt;p>On &lt;strong>September 27, 2025 20:00 UTC&lt;/strong> time, &lt;a href="http://sizeof.cat/cafe/">&lt;strong>The Café&lt;/strong>&lt;/a> gang will attempt to organize several &lt;a href="https://en.wikipedia.org/wiki/Quake_II">Quake 2&lt;/a> deathmatches (no teamplay) on our own Quake 2 server, for glory or shits and giggles. Everybody is invited to join us in our attempt to have fun killing ourselves in various and innovative ways (just kidding, we&amp;rsquo;ll mostly die due to failed rocket jumps and grenading the walls).&lt;/p>
&lt;p>The Café members will get a shiny new badge to wear with pride (and prejudice), and while the participation is not mandatory, the badge will certify their valiant effort in stopping the Strogg&amp;hellip; I mean the Cafégg. In the end we&amp;rsquo;ll all be &lt;em>Knights of the Shiny Railgun&lt;/em>!&lt;/p>
&lt;p>If you want to join us, you will need a Quake 2 client (Windows, Linux, BSD, macOS, OS X), the Café Quake 2 server address, &lt;code>46.226.105.97:27910&lt;/code> (&amp;ldquo;multiplayer&amp;rdquo; -&amp;gt; &amp;ldquo;join network server&amp;rdquo; -&amp;gt; &amp;ldquo;address book&amp;rdquo; and fill that in, &lt;code>IP:PORT&lt;/code> format) and about an hour of your free time. Server is running &lt;a href="https://www.yamagi.org/quake2/">Yamagi Q2&lt;/a> and the map will be &lt;code>q2dm1&lt;/code> because it&amp;rsquo;s the best-known and the most balanced. You don&amp;rsquo;t need to do this retro-style on your grandpa&amp;rsquo;s &amp;ldquo;computer&amp;rdquo;, but bonus style points for original Quake 2 CDs, Pentium machines, CRT screens and Pamela Anderson wall posters. Or Nick Carter posters, we ain&amp;rsquo;t judging here. &lt;strong>Tryhards not welcomed!&lt;/strong>&lt;/p>
&lt;p>So, prepare the beer, peanuts, pizza or whatever food-for-the-soul you enjoy, chug some Redbulls, pop that old &lt;a href="https://inv.nadeko.net/watch?v=2-V8kYT1pvE">Pantera&lt;/a> casette in your tape deck for extra energy, send the kids to sleep, brush up your Quake 2 skills, wear your id Software t-shirt and practice your rocket jumps.&lt;/p>
&lt;p>&lt;strong>Campers beware, they will be hunted down and gibbed, or even teabagged.&lt;/strong> There will be no winners, only exhausted people.&lt;/p>
&lt;p>If you&amp;rsquo;re not familiar with Quake 2 yet (heathens!), it&amp;rsquo;s just like CounterStrike only better.&lt;/p>
&lt;p>&lt;strong>Let the games begin!!&lt;/strong>&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/files/quake.gif" alt="Quake 2">&lt;/figure>&lt;/p></description><category>games</category><category>cafe</category><category>quake</category><category>challenge</category></item><item><title>The Café is alive (and in beta)</title><link>http://sizeof.cat/post/the-cafe-is-alive/</link><pubDate>Fri, 29 Aug 2025 10:40:39 +0000</pubDate><author/><guid>http://sizeof.cat/post/the-cafe-is-alive/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/cyberpunk-sunday/img/cyberpunk.gif" alt="The Café is alive">&lt;/figure>&lt;/p>
&lt;blockquote>
&lt;p>Welcome to &lt;a href="http://sizeof.cat/cafe/">The Café&lt;/a>, a private invite-only community which tries to revive the old-school communities of the &amp;rsquo;00s in a smaller and not-bloated package.&lt;/p>
&lt;/blockquote>
&lt;p>This will not be a long post, but I wanted to announce that &lt;a href="http://sizeof.cat/cafe/">The Café&lt;/a> is alive starting today, August 29, 2025. If you don&amp;rsquo;t know what The Café is, &lt;a href="http://sizeof.cat/post/new-community/">read my previous article&lt;/a> about it, &lt;a href="http://sizeof.cat/notes/u/1756301179-1.png">feast&lt;/a> &lt;a href="http://sizeof.cat/notes/u/1756301179-2.png">your eyes&lt;/a> on &lt;a href="http://sizeof.cat/notes/u/1756388214-1.png">some&lt;/a> &lt;a href="http://sizeof.cat/notes/u/1756388214-2.png">screenshots&lt;/a> from the development blog or &lt;a href="http://sizeof.cat/tags/cafe/">read my notes&lt;/a>.&lt;/p>
&lt;p>Since we&amp;rsquo;re talking about an invite-only community, you will need an invite to &lt;a href="http://sizeof.cat/cafe/?action=signup">sign up&lt;/a> for an account. I sent the first &lt;strong>&amp;ldquo;beta&amp;rdquo;&lt;/strong> wave of invites to some of the people who e-mailed me about it, but the &lt;a href="http://sizeof.cat/guestbook/">people who wrote on my guestbook&lt;/a> will have to send me an e-mail (because there is no other way I can contact them) so I can send an invite code back. Please do that.&lt;/p>
&lt;p>People who are interested in joining The Café should e-mail me, because now it&amp;rsquo;s the biggest chance to get an invite, later on, they will be really scarce.&lt;/p>
&lt;pre tabindex="0">&lt;code>The rules of the Café are plain and simple:
- Don&amp;#39;t annoy the other participants.
- Don&amp;#39;t discuss politics.
- Don&amp;#39;t intentionally bait people.
- Don&amp;#39;t share your account, I will know and you will lose it.
- Linking to questionable content (you know what I&amp;#39;m talking about, image-wise) will definitely get you in trouble.
- Don&amp;#39;t act like drama queens.
- Try not to advertise your Patreon, Twitch, Onlyfans, Pornhub, TikTok, etc, so much that it becomes annoying,
therefore getting in conflict with rule number 1. Feel free to advertise your personal website as much as you
want, though. No, your Youtube channel is not your personal website.
- If in doubt about anything, always ask.
That&amp;#39;s it, enjoy.
&lt;/code>&lt;/pre></description><category>projects</category><category>cafe</category><category>php</category><category>website</category></item><item><title>Start a new private community?</title><link>http://sizeof.cat/post/new-community/</link><pubDate>Mon, 25 Aug 2025 06:17:21 +0000</pubDate><author/><guid>http://sizeof.cat/post/new-community/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/new-community/img/cafe-1.png" alt="sizeof(cat) Café">&lt;/figure>&lt;/p>
&lt;p>Would my website visitors (and friends) be interested if I start a new &lt;strong>private&lt;/strong> (&lt;strong>invite-only&lt;/strong>) community, on this website? Topic would be anything worth your time (and mine): &lt;em>retro hardware&lt;/em>, &lt;em>old Internet&lt;/em>, &lt;em>Windows/Linux/macOS stuff&lt;/em>, &lt;em>old software&lt;/em>, &lt;em>music&lt;/em>, &lt;em>movies&lt;/em>, &lt;em>self hosting&lt;/em>, &lt;em>solar&lt;/em>, &lt;em>cyberpunk&lt;/em>, &lt;em>promote your websites and ideas&lt;/em>, &lt;em>personal projects&lt;/em>, as long as it&amp;rsquo;s &lt;strong>not politics&lt;/strong> and &lt;strong>intentional baiting&lt;/strong>.&lt;/p>
&lt;p>No identifiable data will be saved, no logs kept (spam would be pointless since the community would be private, and spamming would get your account removed anyway), I&amp;rsquo;m thinking about having a mandatory e-mail field on sign-up because I might want to contact you for explanations instead of just nuking your account. I won&amp;rsquo;t use the e-mail address for anything except that, no confirmations, validations, newsletters, spam, and after creating your account you can change it to something like &lt;code>a@a.com&lt;/code> if you&amp;rsquo;re not interested in future e-mail conversations with me. Nobody else will see your e-mail address and if you change it after creating your account, the original address is no longer visible anywhere, or saved in any logs or databases.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/new-community/img/cafe-2.png" alt="sizeof(cat) Café">&lt;/figure>&lt;/p>
&lt;p>I&amp;rsquo;m not interested in bringing phpBB or Discourse bloat into this, it will be a custom-made PHP8 &amp;ldquo;script&amp;rdquo; with nothing but categories, topics, replies and profiles. Data will get saved into a SQLite database, similar to the guestbook script. Since my website is pretty much compatible with most of the old web browsers anyway (except those that don&amp;rsquo;t like SVGs), the community part would be (and should be) browseable and usable on older machines too.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/new-community/img/cafe-3.png" alt="sizeof(cat) Café">&lt;/figure>&lt;/p>
&lt;p>No files/images uploads, topics and replies would be Markdown-only with images and any HTML code stripped out. Keeping it as simple as possible.&lt;/p>
&lt;p>Does it sound good? Bad? Insane? Batshit insane? &lt;a href="http://sizeof.cat/about/#communication">Write me an e-mail&lt;/a> if you want, or &lt;a href="http://sizeof.cat/guestbook/">write in my guestbook&lt;/a> about it.&lt;/p></description><category>website</category><category>projects</category></item><item><title>ICQ in 2025, on OS X and PowerPC</title><link>http://sizeof.cat/post/icq-in-2025-os-x/</link><pubDate>Sat, 09 Aug 2025 21:21:01 +0000</pubDate><author/><guid>http://sizeof.cat/post/icq-in-2025-os-x/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/icq-in-2025-os-x/img/icq.jpg" alt="ICQ">&lt;/figure>&lt;/p>
&lt;p>Running an ICQ client on your PowerPC machine (and OS X 10.1+), in 2025, is not really that hard considering the &lt;a href="https://uk.pcmag.com/mobile-apps/152479/icq-one-of-the-oldest-instant-messengers-is-shutting-down">ICQ network has been shut down since 2024&lt;/a>. &lt;a href="https://download.macintoshgarden.org/apps/icq_mac_3.4.23.sit">Download the last version&lt;/a> (&lt;em>3.4.23&lt;/em>) of ICQ available for OS X and PowerPC architecture, and install it. The &lt;a href="https://nina.chat">nina.chat&lt;/a> people are nice enough to provide access to an ICQ service that will allow you to use the old clients. Problem is that you need to patch the server address inside your ICQ client, basically, all occurences of &lt;code>.icq.com&lt;/code> will need to be changed into &lt;code>.nina.bz&lt;/code>.&lt;/p>
&lt;p>Open the &lt;code>/Applications/ICQ/ICQ 3.4&lt;/code> binary in a hex editor and look at offset &lt;code>0x3EB926&lt;/code>. Replace &lt;code>icq.com&lt;/code> with &lt;code>nina.bz&lt;/code>, do the same thing for the offset &lt;code>0x3F2DED&lt;/code>. Save the file and now your &lt;strong>old&lt;/strong> ICQ client will work over the ICQ service provided by &lt;a href="https://nina.chat">nina.chat&lt;/a>.&lt;/p>
&lt;p>Same thing can be achieved from a Terminal window using &lt;code>xxd&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">cd&lt;/span> /Applications/ICQ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cp &lt;span class="s2">&amp;#34;ICQ 3.4&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;ICQ 3.4_backup&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">echo&lt;/span> 003EB926: 6E &lt;span class="m">69&lt;/span> 6E &lt;span class="m">61&lt;/span> 2E &lt;span class="m">62&lt;/span> 7A &lt;span class="p">|&lt;/span> xxd -r - &lt;span class="s2">&amp;#34;ICQ 3.4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">echo&lt;/span> 003F2DED: 6E &lt;span class="m">69&lt;/span> 6E &lt;span class="m">61&lt;/span> 2E &lt;span class="m">62&lt;/span> 7A &lt;span class="p">|&lt;/span> xxd -r - &lt;span class="s2">&amp;#34;ICQ 3.4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enjoy ICQ.&lt;/p></description><category>os x</category><category>icq</category><category>powerpc</category></item><item><title>Workspace: Leopard</title><link>http://sizeof.cat/workspace/leopard/</link><pubDate>Fri, 01 Aug 2025 11:25:21 +0000</pubDate><author/><guid>http://sizeof.cat/workspace/leopard/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/workspace/leopard/img/leopard.png" alt="Workspace: Leopard">&lt;/figure>&lt;/p></description><category>workspace</category><category>personal</category><category>leopard</category></item><item><title>Anniversary - 10 years of website</title><link>http://sizeof.cat/post/anniversary/</link><pubDate>Mon, 28 Jul 2025 01:15:09 +0000</pubDate><author/><guid>http://sizeof.cat/post/anniversary/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/anniversary/img/sizeofcat.png" alt="This website logo">&lt;/figure>&lt;/p>
&lt;p>&lt;strong>December 6th, 2025&lt;/strong> is the anniversary of 10 years since the &lt;a href="http://sizeof.cat/post/install-tizen-231-on-samsung-rd-pq/">first article&lt;/a> was published on my website, and I think a little bit of &lt;em>&amp;ldquo;history&amp;rdquo;&lt;/em> is welcomed, to pinpoint the major website redesigns that this website went through with during those 10 years. This is a long-ish article with personal info, some stories, bits and pieces of the &lt;em>&amp;ldquo;legacy&amp;rdquo;&lt;/em> around my website. If you&amp;rsquo;re not interested in that, you can definitely skip it because you&amp;rsquo;re not losing much. &lt;a href="http://sizeof.cat/post/anniversary/#charts">Near the end&lt;/a> of the article you&amp;rsquo;ll be able to feast on some charts generated from the visitor data of one randomly-selected month.&lt;/p>
&lt;h2 id="design-and-re-designs">Design and re-design(s)&lt;/h2>
&lt;div class="toc toc-h">
&lt;ul style="text-align: center">
&lt;li>&lt;a href="#2015">2015&lt;/a>&lt;/li>&lt;li>&lt;a href="#2017">2017&lt;/a>&lt;/li>&lt;li>&lt;a href="#2019">2019&lt;/a>&lt;/li>&lt;li>&lt;a href="#2021">2021&lt;/a>&lt;/li>&lt;li>&lt;a href="#2024">2024&lt;/a>&lt;/li>&lt;li>&lt;a href="#2025">2025&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h3 id="2015">2015&lt;/h3>
&lt;p>In 2015 I started this website, with the idea of having a place on the Internet where I can write about my experiences with various mobile operating systems (I used to work on both &lt;em>Tizen&lt;/em> and &lt;em>Firefox OS&lt;/em>), with a little bit of security audits sprinkled inbetween. That year I started working on &lt;a href="http://sizeof.cat/project/hoshi/">Hoshi&lt;/a> but I didn&amp;rsquo;t had the foresight to keep a development log. Or maybe I didn&amp;rsquo;t imagine it going so far, to a &lt;a href="http://sizeof.cat/project/hoshi/img/hoshi.png" class="lightbox">fully-usable custom operating system&lt;/a> (it did start as a bootloader, though). The website was generated by &lt;em>Hugo&lt;/em> from Markdown source files (it still is).&lt;/p>
&lt;p>During 2015 &lt;a href="http://sizeof.cat/archive/#2015">I&amp;rsquo;ve been writing mostly&lt;/a> about ways to interact, modify and play with Tizen and its development devices, Samsung&amp;rsquo;s &lt;em>RD-210&lt;/em> and &lt;em>RD-PQ&lt;/em>. My main machine used to be an &lt;strong>Apple MacBook Air 11&amp;quot;&lt;/strong>, the 2012 all-pimped-out variant (2.0 GHz dual-core i7 CPU, 8GB RAM, 512GB SSD) that I still use in 2025. &lt;em>Cor blimey, &amp;rsquo;s reem, innit?&lt;/em>&lt;/p>
&lt;p>The dominant colors for the 2015 website design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#4C8CEC">&lt;/span>
&lt;span class="bubble" style="background-color:#D9DCE0">&lt;/span>
&lt;span class="bubble" style="background-color:#575757">&lt;/span>
&lt;span class="bubble" style="background-color:#4C74EC">&lt;/span>
&lt;span class="bubble" style="background-color:#939DAC">&lt;/span>
&lt;span class="bubble" style="background-color:#A0C4F4">&lt;/span>
&lt;span class="bubble" style="background-color:#fafafa">&lt;/span>
&lt;span class="bubble" style="background-color:#549CF0">&lt;/span>
&lt;span class="bubble" style="background-color:#549CF0">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked:&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2015.png" alt="This website in 2015">&lt;/figure>&lt;/p>
&lt;p>At the end of 2015, the total content on this website was:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>3,636&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>6&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="2017">2017&lt;/h3>
&lt;p>No idea why I thought compressing the main website body in a 480 pixels-wide div, would be a great idea. It wasn&amp;rsquo;t. During 2016-2017 I&amp;rsquo;ve been writing still about &lt;em>Tizen&lt;/em>, as well as more security-related articles.&lt;/p>
&lt;p>For a while I had the &lt;code>_@sizeof.cat&lt;/code> e-mail address and boy, even though it&amp;rsquo;s a valid e-mail address, it was impossible to use it for anything. So I got a &lt;em>Riseup&lt;/em> invite from Micah and this is the e-mail I&amp;rsquo;m still using today. I think between 2018 and 2025 I gave more than &lt;strong>50&lt;/strong> Riseup invites for free, to people who just asked. &lt;em>&lt;strong>Just the way things should be, free.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>The dominant colors for the 2017 website re-design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#515151">&lt;/span>
&lt;span class="bubble" style="background-color:#fafafa">&lt;/span>
&lt;span class="bubble" style="background-color:#B0C2DC">&lt;/span>
&lt;span class="bubble" style="background-color:#9E9E9E">&lt;/span>
&lt;span class="bubble" style="background-color:#4C74EC">&lt;/span>
&lt;span class="bubble" style="background-color:#BC646C">&lt;/span>
&lt;span class="bubble" style="background-color:#C4C4C4">&lt;/span>
&lt;span class="bubble" style="background-color:#8DB2F4">&lt;/span>
&lt;span class="bubble" style="background-color:#DDAEB3">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked:&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2017.png" alt="This website in 2017">&lt;/figure>&lt;/p>
&lt;p>At the end of 2017, the total content on this website was:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>12,761&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>30&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="2019">2019&lt;/h3>
&lt;p>In 2019 a full website re-design was in order because I got bored of the old layout, which was way too simple for my taste. It&amp;rsquo;s this design that I still work with in 2025, improving it. I removed all the Webmention support because it was pointless to have people commenting with emojis to my content. Felt cheap and stupid.&lt;/p>
&lt;p>The dominant colors for the 2019 website re-design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#DCDCDD">&lt;/span>
&lt;span class="bubble" style="background-color:#4C74EC">&lt;/span>
&lt;span class="bubble" style="background-color:#9EA4B4">&lt;/span>
&lt;span class="bubble" style="background-color:#fafafa">&lt;/span>
&lt;span class="bubble" style="background-color:#EC1F7D">&lt;/span>
&lt;span class="bubble" style="background-color:#636363">&lt;/span>
&lt;span class="bubble" style="background-color:#ACACAC">&lt;/span>
&lt;span class="bubble" style="background-color:#3F3F3F">&lt;/span>
&lt;span class="bubble" style="background-color:#F494BC">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked:&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2019.png" alt="This website in 2019">&lt;/figure>&lt;/p>
&lt;p>2014 was the time I started working on &lt;em>Firefox OS&lt;/em> and its development devices, &lt;em>Flame&lt;/em> and &lt;em>GeeksPhone Peak&lt;/em>, but content-wise I didn&amp;rsquo;t write on the website about this subject until 2018. In 2019 I started writing &lt;a href="http://sizeof.cat/post/movies/">one of my most-beloved pages, &lt;em>&amp;ldquo;Favorite films&amp;rdquo;&lt;/em>&lt;/a>, that I&amp;rsquo;m still updating to this day. Also, 2019 saw the start of the &lt;a href="http://sizeof.cat/series/life-and-death/">&lt;em>&amp;ldquo;Life and death&amp;rdquo;&lt;/em> series&lt;/a>, which was a more serious way to tackle philosophical issues. At the end of 2019, the total content on this website was:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>25,929&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>63&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="2021">2021&lt;/h3>
&lt;p>2021 was the year I decided I needed to have my very own social media microsite (initially called so.cl), and implementing that in a static website powered by &lt;em>Hugo&lt;/em> was a feat. The search function was developed using a not-so-small JSON file which contained all the content of the website, and allowed a JavaScript function to search through it. Optimal for a small website, not OK for a large one with lots of content.&lt;/p>
&lt;p>That year I decided on two colors that will represent my website &amp;ldquo;branding&amp;rdquo; for the future, which would be &lt;code>#5550ed&lt;/code> &lt;span style="background-color:#5550ed;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp; and &lt;code>#ed1980&lt;/code> &lt;span style="background-color:#ed1980;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp;. &lt;code>ed&lt;/code> is from &lt;em>&amp;ldquo;Ed, Edd n Eddy&amp;rdquo;&lt;/em>, a cartoon from my childhood, &lt;code>1980&lt;/code> represents an year (and an era) when the world was very different from today and &lt;code>555&lt;/code> is a well-known integrated circuit that is used in &amp;ldquo;pulse&amp;rdquo; generation. Pulse is life.&lt;/p>
&lt;p>At the end of 2021 I had to move web hosting from &lt;em>Exoscale&lt;/em> to &lt;em>Njalla&lt;/em> because Twitch (actually their parent company, Amazon) &lt;a href="img/twitch.jpg" class="lightbox">complained&lt;/a> to Exoscale about a security audit I did on the 2021 Twitch Leaks, and for a Switzerland-based company, Exoscale sure was quick to give me the boot. Amazon &lt;a href="img/njalla.jpg" class="lightbox">complained&lt;/a> to Njalla too, and threatened their ISP with a lawsuit over not cutting access to my website, but things calmed in the end.&lt;/p>
&lt;p>The dominant colors for the 2021 website re-design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#5550ed">&lt;/span>
&lt;span class="bubble" style="background-color:#fafafa">&lt;/span>
&lt;span class="bubble" style="background-color:#B0A0A8">&lt;/span>
&lt;span class="bubble" style="background-color:#858585">&lt;/span>
&lt;span class="bubble" style="background-color:#B4B4B4">&lt;/span>
&lt;span class="bubble" style="background-color:#ed1980">&lt;/span>
&lt;span class="bubble" style="background-color:#646464">&lt;/span>
&lt;span class="bubble" style="background-color:#585858">&lt;/span>
&lt;span class="bubble" style="background-color:#444444">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked:&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2021.png" alt="This website in 2021">&lt;/figure>&lt;/p>
&lt;p>During 2020-2021 I wrote the most &lt;a href="http://sizeof.cat/tags/music/">music album reviews&lt;/a>, also, in 2021 I wrote the best-known article on my website, &lt;a href="http://sizeof.cat/post/web-browser-telemetry/">&lt;em>&amp;ldquo;Web Browser telemetry - 2021 edition&amp;rdquo;&lt;/em>&lt;/a>, and it&amp;rsquo;s still quoted to this day even though in 2025 I wrote &lt;a href="http://sizeof.cat/post/web-browser-telemetry-2025-edition/">an updated version&lt;/a> of it. In 2020 I started working on the &lt;a href="http://sizeof.cat/project/world-of-warcraft-xpoff-45/">largest article&lt;/a> so far, with over 40k words now. At the end of 2021, the total content on this website was:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>10,4671&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>154&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="2024">2024&lt;/h3>
&lt;p>In 2022 I built my first (and only) &lt;a href="http://sizeof.cat/project/terrarium/">terrarium&lt;/a> and started working with bonsai (I still do that). The &lt;em>South Korean Police&lt;/em> &lt;a href="img/samsung.jpg" class="lightbox">asked me nicely&lt;/a> to remove a torrent file of the &lt;em>Samsung&lt;/em> leak of that year (2022), but I politely declined.&lt;/p>
&lt;p>In 2024 I drastically altered the theme and while initially I was pretty happy with the result and the color scheme, it turned out not to be such a great idea. I heavily dislike dark color schemes (except terminal ones, where I use &lt;em>Monokai&lt;/em> mostly) and the website was pretty rough on my eyes (and I&amp;rsquo;m sure some visitors complained about it too). The &amp;ldquo;old&amp;rdquo; so.cl section got renamed to notes because I felt like the name conflicted with the &lt;em>so.cl&lt;/em> &lt;a href="img/socl.png" class="lightbox">social media website&lt;/a> created by Microsoft, long gone by 2024 anyway.&lt;/p>
&lt;p>I replaced the original search functions with &lt;em>Pagefind&lt;/em>, better suited to search in the powerhorse that turned out to be the notes section, with over 2.5k entries. And I removed all traces of &lt;em>IndieWeb&lt;/em> tags because I didn&amp;rsquo;t want (and I still don&amp;rsquo;t) to be associated with them and their community.&lt;/p>
&lt;p>This re-design featured the &lt;a href="http://sizeof.cat/post/tricks-with-web-browser-tabs/">tab-favicon-changing&lt;/a> shenanigans that so many people complained about. It&amp;rsquo;s still implemented but no longer features the FBI, NSA, FSB, SVR and Mossad favicons.&lt;/p>
&lt;p>No other major functions were added to the website, but the re-design sure took its time to be completed. Almost forgot that I participated in the &lt;a href="http://sizeof.cat/post/old-computer-challenge-2024-thoughts/">2024 Old Computer Challenge&lt;/a> with my &lt;a href="http://sizeof.cat/post/old-computer-challenge-2024/">Nokia Booklet 3G&lt;/a> retrobook and had lots of fun with the people involved, on IRC. After OCC, I returned to using a &lt;strong>2012 MacBook Air 11&amp;quot;&lt;/strong> as my main machine, coupled with a &lt;strong>Nokia 808 PureView&lt;/strong> camera phone.&lt;/p>
&lt;p>The dominant colors for the 2024 website re-design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#D79B34">&lt;/span>
&lt;span class="bubble" style="background-color:#EA7575">&lt;/span>
&lt;span class="bubble" style="background-color:#744D31">&lt;/span>
&lt;span class="bubble" style="background-color:#9F742C">&lt;/span>
&lt;span class="bubble" style="background-color:#A44C54">&lt;/span>
&lt;span class="bubble" style="background-color:#85716B">&lt;/span>
&lt;span class="bubble" style="background-color:#4C3325">&lt;/span>
&lt;span class="bubble" style="background-color:#37241C">&lt;/span>
&lt;span class="bubble" style="background-color:#2C1C1C">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked (the logo pumpkin was there for Halloween):&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2024.png" alt="This website in 2024">&lt;/figure>&lt;/p>
&lt;p>From 2021 to 2024 I really moved into writing about security, privacy and related issues, but I did continue writing about &lt;a href="http://sizeof.cat/tags/retro/">retro hardware&lt;/a> and ways to unlock proprietary devices. At the end of 2024, the total content on this website was:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>226,515&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>305&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="2025">2025&lt;/h3>
&lt;p>2025 is the year my website returned to the original color scheme with small adjustments, while the layout of the website was more optimized for mobile browsing (yes, I know). I eveb removed some content from the website.&lt;/p>
&lt;p>A simple &lt;a href="http://sizeof.cat/guestbook/">guestbook&lt;/a> written in &lt;em>PHP&lt;/em>, which stores its data in a &lt;em>SQLite&lt;/em> database, was added to the website, because I got so many e-mails over the years where people just wanted to say hi, and it felt like a guestbook is more suited for this kind of content.&lt;/p>
&lt;p>Since I removed lots of content from the website, the word count dropped drastically and I was able to return to the initial website search, featuring Lunr and a simple JSON file. &lt;em>&lt;strong>Simple is always good&lt;/strong>&lt;/em>. I skipped the &lt;em>2025 Old Computer Challenge&lt;/em> due to spiritual differences with some of the &amp;ldquo;people&amp;rdquo; in the community, and it was for the best because it turned out to be such a politics/pronounfest that split and destroyed everything.&lt;/p>
&lt;p>The dominant colors for the 2025 website re-design were:&lt;/p>
&lt;p>&lt;span class="bubble" style="background-color:#DFDFE5">&lt;/span>
&lt;span class="bubble" style="background-color:#5550ed">&lt;/span>
&lt;span class="bubble" style="background-color:#5B5B5B">&lt;/span>
&lt;span class="bubble" style="background-color:#959594">&lt;/span>
&lt;span class="bubble" style="background-color:#7C7C88">&lt;/span>
&lt;span class="bubble" style="background-color:#847CF4">&lt;/span>
&lt;span class="bubble" style="background-color:#343434">&lt;/span>
&lt;span class="bubble" style="background-color:#fafafa">&lt;/span>
&lt;span class="bubble" style="background-color:#F4B446">&lt;/span>&lt;/p>
&lt;p>And this is how the frontpage of the website looked:&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/2025.png" alt="This website in 2025">&lt;/figure>&lt;/p>
&lt;p>In 2025 I replaced my trusty &lt;a href="http://sizeof.cat/project/nokia-booklet-3g/">Nokia Booklet 3G&lt;/a> retrobook with an &lt;a href="http://sizeof.cat/post/my-apple-ibook-g4/">Apple iBook G4&lt;/a>, and obviously I wrote a lot of articles (actually, &lt;a href="http://sizeof.cat/series/apple-ibook-g4/">a series&lt;/a>) about my new old toy. I also bought myself an used &lt;strong>Apple iPod Classic&lt;/strong> 4th generation and an used &lt;strong>Apple iMac G5 17&amp;quot;&lt;/strong>, planning to switch my main machine to the aforementioned iMac. I think I mentioned elsewhere that I used to be a &lt;em>&lt;strong>big&lt;/strong>&lt;/em> fan of Apple hardware and software (OS 9 and X used to have &lt;em>soul&lt;/em>), and currently I massively dislike the present Apple software (mainly macOS being crap) and I could totally live without their restricted hardware. Still using that &lt;strong>2012 MacBook Air 11&amp;quot;&lt;/strong> notebook until the iMac is ready. And I&amp;rsquo;m still using the &lt;strong>Nokia 808 PureView&lt;/strong> camera phone that&amp;rsquo;s still taking exquisite photos.&lt;/p>
&lt;p>As of now, the total content on this website is:&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total words&lt;/strong>&lt;/td>
&lt;td>256,095&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total articles&lt;/strong>&lt;/td>
&lt;td>340&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="charts">Charts&lt;/h2>
&lt;p>The charts below are generated for the data over a period of &lt;strong>one month&lt;/strong>, April 2025, obviously before &lt;a href="http://sizeof.cat/post/a-day-to-remember/">the big fallout&lt;/a>.&lt;/p>
&lt;div style="width: 50%;margin: 0 auto">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Total requests&lt;/strong>&lt;/td>
&lt;td>753,146&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Unique visitors&lt;/strong>&lt;/td>
&lt;td>175,273&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Requested files&lt;/strong>&lt;/td>
&lt;td>199,195&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Data transfer&lt;/strong>&lt;/td>
&lt;td>103.72 GB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="visitors-per-day">Visitors per day&lt;/h3>
&lt;p>&lt;canvas id="chart-visitors">&lt;/canvas>&lt;/p>
&lt;h3 id="operating-systems">Operating systems&lt;/h3>
&lt;p>&lt;canvas id="chart-oses">&lt;/canvas>&lt;/p>
&lt;h3 id="web-browsers">Web browsers&lt;/h3>
&lt;p>&lt;canvas id="chart-browsers">&lt;/canvas>&lt;/p>
&lt;script>
document.addEventListener("DOMContentLoaded", function(event) {
Chart.defaults.global.defaultFontColor = "#000";
function generateDataset(obj, config, chart_type) {
var values = []
for (var key in obj) {
values.push(obj[key]);
}
return {
label: config.label,
data: values,
borderWidth: 1,
backgroundColor: config.backgroundColor,
borderColor: config.borderColor,
fill: true,
pointRadius: 2,
lineTension: 0.4,
};
}
function renderGraph(canvasId, labels, datasets, chart_type, height) {
let canvas = document.getElementById(canvasId);
canvas.height = height;
new Chart(canvas, {
type: chart_type,
data: {
labels: labels,
datasets: datasets
},
options: {
legend: {
display: true,
},
responsive: true,
maintainAspectRatio: false,
scales: {
yAxes: [{
ticks: {
display: true,
beginAtZero: true
},
gridLines: {
color: '#eee',
display: true
}
}],
xAxes: [{
gridLines: {
color: '#eee',
display: true,
},
ticks: {
display: true,
beginAtZero: true
},
}]
}
}
});
}
let data = [];
let raw_data_visitors = {
"1": 4573,
"2": 8296,
"3": 9263,
"4": 11238,
"5": 9085,
"6": 7662,
"7": 5394,
"8": 4627,
"9": 4286,
"10": 4290,
"11": 4709,
"12": 4446,
"13": 4462,
"14": 5115,
"15": 4336,
"16": 4217,
"17": 5670,
"18": 6086,
"19": 6255,
"20": 5147,
"21": 7848,
"22": 5457,
"23": 5015,
"24": 5070,
"25": 4874,
"26": 5008,
"27": 5957,
"28": 5662,
"29": 5430,
"30": 5795
};
let raw_data_hits = {
"1": 24750,
"2": 38838,
"3": 38414,
"4": 36171,
"5": 35196,
"6": 29231,
"7": 27402,
"8": 19788,
"9": 20927,
"10": 17487,
"11": 25278,
"12": 19701,
"13": 16938,
"14": 33120,
"15": 16446,
"16": 17702,
"17": 23598,
"18": 31234,
"19": 23067,
"20": 22856,
"21": 33818,
"22": 21821,
"23": 20262,
"24": 23464,
"25": 20929,
"26": 20256,
"27": 25064,
"28": 24202,
"29": 23175,
"30": 22011
};
let first_labels = [
"April 1st",
"April 2nd",
"April 3rd",
"April 4th",
"April 5th",
"April 6th",
"April 7th",
"April 8th",
"April 9th",
"April 10th",
"April 11th",
"April 12th",
"April 13th",
"April 14th",
"April 15th",
"April 16th",
"April 17th",
"April 18th",
"April 19th",
"April 20th",
"April 21th",
"April 22th",
"April 23th",
"April 24th",
"April 25th",
"April 26th",
"April 27th",
"April 28th",
"April 29th",
"April 30th"
];
data.push(generateDataset(raw_data_visitors, {
label: 'Unique visitors',
borderColor: 'rgba(97, 173, 156, 1)',
backgroundColor: 'rgba(97, 173, 156, 0.5)',
}
));
data.push(generateDataset(raw_data_hits, {
label: 'Hits',
borderColor: 'rgba(239, 115, 115, 1)',
backgroundColor: 'rgba(239, 115, 115, 0.5)',
}
));
renderGraph('chart-visitors', first_labels, data, 'line', 260);
let data_oses = [];
let raw_data_oses_vis = {
"1": 52786,
"2": 41159,
"3": 27566,
"4": 10151,
"5": 18517,
"6": 16533,
"7": 6541,
"8": 407,
"9": 180,
"10": 16
};
let raw_data_oses_req = {
"1": 266728,
"2": 179731,
"3": 112434,
"4": 68059,
"5": 58564,
"6": 48146,
"7": 16122,
"8": 929,
"9": 331,
"10": 43
};
let oses_labels = [
"Windows",
"Crawlers",
"Linux",
"Unknown",
"Macintosh",
"Android",
"iOS",
"Chrome OS",
"BSD",
"Others"
];
data_oses.push(generateDataset(raw_data_oses_vis, {
label: 'Unique visitors',
borderColor: 'rgba(74, 149, 41, 1)',
backgroundColor: 'rgba(74, 149, 41, 1)'
}
));
data_oses.push(generateDataset(raw_data_oses_req, {
label: 'Hits',
borderColor: 'rgba(112, 119, 199, 1)',
backgroundColor: 'rgba(112, 119, 199, 1)'
}
));
renderGraph('chart-oses', oses_labels, data_oses, 'bar', 260);
let data_browsers = [];
let raw_data_browsers_vis = {
"1": 38651,
"2": 46984,
"3": 38070,
"4": 10037,
"5": 5545,
"6": 7773,
"7": 4959,
"8": 2171,
"9": 1917,
"10": 1119,
"11": 705,
"12": 441,
"13": 153
};
let raw_data_browsers_req = {
"1": 203629,
"2": 195419,
"3": 175039,
"4": 44578,
"5": 35908,
"6": 28379,
"7": 19671,
"8": 7389,
"9": 5813,
"10": 3613,
"11": 2731,
"12": 1101,
"13": 552
};
let browsers_labels = [
"Firefox",
"Chrome",
"Crawlers",
"Unknown",
"Others",
"Safari",
"Edge",
"Opera",
"Feeds",
"Yandex Browser",
"Vivaldi",
"Internet Explorer",
"Game Systems"
];
data_browsers.push(generateDataset(raw_data_browsers_vis, {
label: 'Unique visitors',
borderColor: 'rgba(74, 149, 41, 1)',
backgroundColor: 'rgba(74, 149, 41, 1)'
}
));
data_browsers.push(generateDataset(raw_data_browsers_req, {
label: 'Hits',
borderColor: 'rgba(112, 119, 199, 1)',
backgroundColor: 'rgba(112, 119, 199, 1)'
}
));
renderGraph('chart-browsers', browsers_labels, data_browsers, 'bar', 260);
});
&lt;/script>
&lt;p>See you for the &lt;strong>20 years anniversary&lt;/strong> in 2035!!&lt;/p></description><category>website</category></item><item><title>Retrobook</title><link>http://sizeof.cat/post/retrobook/</link><pubDate>Fri, 18 Jul 2025 14:10:17 +0000</pubDate><author/><guid>http://sizeof.cat/post/retrobook/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/retrobook/img/retrobook.jpg" alt="Apple iBook G4 retrobook">&lt;/figure>&lt;/p>
&lt;p>&lt;small>*&lt;em>Apple iBook G4&lt;/em> 12&amp;quot; retrobook, &lt;em>iPod Classic&lt;/em> 4th generation, wireless &lt;em>Mighty Mouse&lt;/em>, photo taken with a &lt;em>Nokia 808 PureView&lt;/em> camera phone.&lt;/small>&lt;/p></description><category>retro</category><category>ibook</category><category>ipod</category></item><item><title>My Apple iBook G4 - hardware upgrades</title><link>http://sizeof.cat/post/ibook-g4-hardware-upgrades/</link><pubDate>Tue, 08 Jul 2025 16:25:33 +0000</pubDate><author/><guid>http://sizeof.cat/post/ibook-g4-hardware-upgrades/</guid><description>&lt;p>This is the sixth part of the &amp;ldquo;&lt;a href="http://sizeof.cat/series/apple-ibook-g4/">My Apple iBook G4&lt;/a>&amp;rdquo; series of articles, and it&amp;rsquo;s all about the hardware upgrades you can do to your iBook G4 12&amp;quot;.&lt;/p>
&lt;p>As you probably know by now, &lt;a href="http://sizeof.cat/post/my-apple-ibook-g4/">I bought myself an Apple iBook G4&lt;/a> 12&amp;quot; laptop (1.2GHz/256/30G/Combo/APX) at the beginning of the year, with the idea of transforming it into a retrobook and replace my trusty &lt;a href="http://sizeof.cat/project/nokia-booklet-3g/">Nokia Booklet 3G&lt;/a>. The device I have is &lt;strong>A1054&lt;/strong> from late 2004 (actually launched October 2004), and I&amp;rsquo;ve always wanted to replace the logic board with the one from the &lt;strong>A1133&lt;/strong> model number (launched in July 2005), which is powered by a 1.33GHz CPU, has 512MB of RAM built-in and a better GPU (ATI Radeon 9550 instead of ATI Radeon 9200). It&amp;rsquo;s the most powerful iBook except for the 14&amp;quot; 2005 model, which has a 1.42GHz CPU, but I&amp;rsquo;m not keen on lugging 2.7kg around, as opposed to 2.2kg for the 12&amp;quot; one.&lt;/p>
&lt;p>An option would have been to just purchase the 2005 model and be done with it, but my 2004 unit is in pristine condition with absolutely no problems, a spotless screen and a &amp;lt;30 cycles battery. So, switching the boards it is.&lt;/p>
&lt;p>I foolishly believed that replacing the logic boards would be very simple, considering the 2004 and 2005 laptops have the same looks, connectors, and after all, it&amp;rsquo;s just a year difference, right? Well, yes and no.&lt;/p>
&lt;div class="notify important">This is a very difficult mod of the iBook G4, requires a complete dissassembly of the laptop, including screen, cutting wires, griding the logic board and more &lt;strong>fun&lt;/strong> stuff. &lt;strong>Don&amp;rsquo;t attempt it unless you know what you are doing.&lt;/strong> It&amp;rsquo;s way simpler to just buy a 2005 iBook.&lt;/div>
&lt;p>iFixit&amp;rsquo;s pages for the &lt;a href="https://www.ifixit.com/Device/iBook_G4_12%22_800_MHz-1.2_GHz">iBook G4 12&amp;quot; 1.2GHz&lt;/a> and &lt;a href="https://www.ifixit.com/Device/iBook_G4_12%22_1.33_GHz">iBook G4 12&amp;quot; 1.33GHz&lt;/a> will be your best friend.&lt;/p>
&lt;p>I won&amp;rsquo;t be talking about the hardware updates I aready did, replacing the Fujitsu HDD with a SSD and replacing the Combo Drive with a DVD Super Drive, because those are basic stuff. Buy new components, open laptop, disconnect old components, replace with new components, done. Maxing the RAM capacity is something you should do, too, OS X Leopard will thrive with more RAM.&lt;/p>
&lt;h3 id="preparation">Preparation&lt;/h3>
&lt;p>Taking the iBook apart for the second time (&lt;a href="http://sizeof.cat/post/my-apple-ibook-g4/">I replaced the SSD and repasted the CPU in January 2025&lt;/a>) was way simpler, since now I already had separators for all the screws (over 40 of them, screws I mean). You will have to remove everything from the chassis of the laptop, including storage (HDD/SSD), DVD unit, heat sink and pipe, cooler.&lt;/p>
&lt;p>Make sure you have tools, screw separators, spudgers, thermal paste for the new logic board and a lot of cold water.&lt;/p>
&lt;h3 id="problems">Problems&lt;/h3>
&lt;ul>
&lt;li>First thing I noticed was that the 2005 board doesn&amp;rsquo;t have the AirPort card positioned behind the keyboard, above the RAM slot, but somewhere under the display cable connector, meaning that accessing it requires opening up the whole laptop. And that the new card has two antenna cables, &lt;em>main&lt;/em> and &lt;em>aux&lt;/em>, while the old card had only one (actually, the single cable goes to the screen assembly and there is another board that splits the single antenna into the &lt;em>main&lt;/em> and &lt;em>aux&lt;/em> cables which go to each side of the screen).&lt;/li>
&lt;li>The IDE connector on the 2004 board looks like a Slim ATAPI connector, while on the newer logic board there is a full mini-IDE connector, but that&amp;rsquo;s not a problem since IDE is IDE anyway.&lt;/li>
&lt;li>The old antenna cable has to be removed from the screen assembly and replaced with new wire antennas and new connector (even the old antenna connector doesn&amp;rsquo;t fit).&lt;/li>
&lt;li>The display inverter cable has 6 pins on the 2004 board, and 4 pins on the 2005 one, and this baffled me until I opened the screen. Turns out the inverter has 4 pins going in, and the other 2 pins are the suspend detection mechanism, which Apple in all its wisdom and glory, decided to &amp;ldquo;invert&amp;rdquo; between the two different models. How, you might ask: well, it&amp;rsquo;s simple, the 2004 iBook has a magnet on the right side, behind the keyboard and a &amp;ldquo;tube&amp;rdquo;-looking thingy on the right side of the screen behind the mask, and when those two components get close (you fold the laptop&amp;rsquo;s screen) the laptop goes into suspend mode. Sounds simple, right? No, because on the 2005 iBook, the magnet is behind the screen and the &amp;ldquo;tube&amp;rdquo; behind the keyboard! So, the two extra wires on the 2004 model were routed from the same inverter connector and cable, only they went to the &amp;ldquo;tube&amp;rdquo; (I need to stop calling it a tube and check out what it really is, I guess it&amp;rsquo;s some sort of vintage proximity sensor). Fixing this means clipping the wires, clipping two pins off the inverter logic board connector cable (so a 6 pin connector will physically fit a 4 pin connector) and switch the placement of magnet and sensor, while connecting the sensor on the new 2-pin socket that exists on the new logic board, just below the trackpad connector, where the Bluetooth module connector is on the 2004 board.&lt;/li>
&lt;li>The trackpad on the 2004 model is using an ADB interface, while the 2005 model has a USB interface (and two-fingers scrolling). Since you can&amp;rsquo;t remove the trackpad from the top plate because it&amp;rsquo;s riveted in place, you will either need a new top plate with the new trackpad or convert the signal from ADB to USB.&lt;/li>
&lt;li>The logic boards are identical is size, except they&amp;rsquo;re not. There is a small difference on the top of the boards, the 2005 one &lt;strong>WILL NOT FIT&lt;/strong> the 2004 laptop chassis unless you&amp;rsquo;re willing to either grind about 1mm off board or the chassis.&lt;/li>
&lt;/ul>
&lt;p>Check out the red-squared zone on the images below, and also see the different size on the inverter connector (6-pin versus 4-pin), it&amp;rsquo;s the bottom yellow-squared connector.&lt;/p>
&lt;p>Notice how the 2004 board has a straight bottom line, while the 2005 has an edge sticking out? That&amp;rsquo;s the problem, the chassis of the laptop is different and needs to be grinded down. Or, if you have a 2005 chassis, you can pop the new logic board in.&lt;/p>
&lt;figure>
&lt;div>&lt;a class="lightbox nob" data-title="" href="img/2004.jpg">
&lt;img loading="lazy" src="img/2004.jpg" alt="" />
&lt;/a>&lt;/div>
&lt;figcaption>Logic board on the 2004 iBook 12 inch&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;div>&lt;a class="lightbox nob" data-title="" href="img/2005.jpg">
&lt;img loading="lazy" src="img/2005.jpg" alt="" />
&lt;/a>&lt;/div>
&lt;figcaption>Logic board on the 2005 iBook 12 inch&lt;/figcaption>
&lt;/figure>
&lt;p>So, unless you want to grind down the 2004 chassis and/or the 2005 logic board, you will need the chassis of a 2005 model.&lt;/p>
&lt;p>The inverter cable (and friends) issue is way simpler to fix, check out the picture below of a 2005 iBook model:&lt;/p>
&lt;figure>
&lt;div>&lt;a class="lightbox nob" data-title="" href="img/inverter.jpg">
&lt;img loading="lazy" src="img/inverter.jpg" alt="" />
&lt;/a>&lt;/div>
&lt;figcaption>Inverter connector and cable on the 2005 iBook 12 inch&lt;/figcaption>
&lt;/figure>
&lt;p>So, the cable coming from the screen has 4 pins (light green, yellow, orange, red) and connects to a 4-pin socket on the 2005 logic board. In my case, I kept the screen assembly from my 2004 iBook model, and that has a 6-pin cable (dark green, black, light green, yellow, orange, red), which needs to fit the 4-pin connector, so you will have to clip the first two wires (dark green and black) and connector plastic. Be careful not to clip too much of the connector because it&amp;rsquo;s not simple to fix it.&lt;/p>
&lt;p>As explained before, the two wires (dark green and black) are the wires for the suspend sensor that used to be in the screen for the 2004 iBook, but it&amp;rsquo;s behind keyboard on the 2005 model. It&amp;rsquo;s the magnet that&amp;rsquo;s in the other place (screen on the 2004 iBook and behind keyboard on the 2005 model), I guess that Apple realised that that way you need two less wires routed through the hinge, into the screen assembly. Good thinking.&lt;/p>
&lt;p>The 2005 iBook has a dedicated socket for the suspend sensor (the sensor itself sits on top of the DVD unit, to the right of the keyboard, under the metal screen), it&amp;rsquo;s below the trackpad connector on the logic board, squared in red in the photo below (where the socket for the Bluetooth module used to be on older iBook models).&lt;/p>
&lt;figure>
&lt;div>&lt;a class="lightbox nob" data-title="" href="img/suspend.jpg">
&lt;img loading="lazy" src="img/suspend.jpg" alt="" />
&lt;/a>&lt;/div>
&lt;figcaption>Suspend sensor connector on the 2005 iBook 12 inch&lt;/figcaption>
&lt;/figure>
&lt;p>And there I needed to connect the suspend sensor that I removed from the 2004 screen, with its black and dark green wires.&lt;/p>
&lt;h3 id="conclusion">Conclusion&lt;/h3>
&lt;p>While this is a really complex mod, you gain several things out of it:&lt;/p>
&lt;ul>
&lt;li>newer and faster CPU (1.33GHz, versus 1.2GHz on the 2004 model).&lt;/li>
&lt;li>more RAM (512MB built in, versus 256MB, can go up to 1.5GB with a 1GB module).&lt;/li>
&lt;li>faster RAM (333MHz PC2700, versus 266MHz PC2100 on the 2004 model).&lt;/li>
&lt;li>newer and faster GPU (ATI Radeon 9550, versus ATI Radeon 9200).&lt;/li>
&lt;li>the &lt;a href="http://sizeof.cat/post/my-apple-ibook-g4/#problems">VREG and GPU/VRAM chip de-solder issues&lt;/a> are no longer present.&lt;/li>
&lt;li>integrated Bluetooth 2.0+EDR.&lt;/li>
&lt;/ul>
&lt;p>It was totally worth it.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/desktop.png" alt="">&lt;/figure>&lt;/p></description><category>apple</category><category>retro</category><category>ibook</category><category>g4</category><category>os x</category><category>powerpc</category><category>hardware</category></item><item><title>Captain Blackbeard Radio #23</title><link>http://sizeof.cat/post/captain-blackbeard-episode23/</link><pubDate>Sun, 06 Jul 2025 04:50:17 +0000</pubDate><author/><guid>http://sizeof.cat/post/captain-blackbeard-episode23/</guid><description>&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/captain-blackbeard-episode23/img/captain-blackbeard-header.jpg" alt="Captain Blackbeard Radio #23">&lt;/figure>&lt;/p>
&lt;p>&lt;strong>#23 | CaptainBlackbeard Radio | DreamWorld&lt;/strong>&lt;/p>
&lt;p>HAPPY INDEPENDENCE DAY!&lt;/p>
&lt;p>Slap yer knees along with number twenty three!&lt;/p>
&lt;p>What is a third of yer life worth? We spend more time sleeping than any other activity. What happens when our sleeping life becomes better than our waking life? Who owns our dreams?&lt;/p>
&lt;p>What would yer life be if ye were God of a third of it?&lt;/p>
&lt;p>In this one of a kind psychedelic audio epic we follow the story of a young man at a dead end, struggling to find purpose and reason in their life. When they stumble into a new sleep invention, which allows the user to program their dreams&amp;hellip;&lt;/p>
&lt;p>&lt;audio style="width: 100%" preload="none" controls src="https://endchan.org/.media/89c68936b0224ff4277d3bc453e08bc4-audiompeg.mp3">Your browser does not support the &lt;code>audio&lt;/code> element.&lt;/audio>&lt;/p>
&lt;p>Ye won&amp;rsquo;t believe yer ears in this most stunning creation!&lt;/p>
&lt;p>DreamWorld is a mindbending pirate radio audio epic comedy exploring the the realms of consciousness, cyberpunk and what it is to Dream&amp;hellip;&lt;/p>
&lt;p>CaptainBlackbeard Radio is a psychedelic audio thrill ride of interweaving stories, humor &amp;amp; music unlike anything ever created ye won&amp;rsquo;t hear anywhere else!&lt;/p>
&lt;p>&lt;strong>In this episode&lt;/strong>&lt;/p>
&lt;p>#23 DreamWorld&lt;br>
George Washington vlogs like a Boss&lt;br>
The British Perspective on the Peasants’ Tax Revolt&lt;br>
UNSOLVED MYSTERIES&lt;br>
…And so much more!&lt;/p>
&lt;p>&lt;strong>Cast&lt;/strong>&lt;/p>
&lt;p>Joe Pesci&lt;br>
Christopher Walken&lt;br>
Louis Gossett Jr.&lt;br>
Gordon Ramsay&lt;br>
Martha Stewart&lt;br>
Julia Child&lt;br>
Sharon Stone&lt;br>
Jon Anik&lt;br>
Daniel Cormier&lt;br>
Joe Rogan&lt;br>
Donald Trump&lt;br>
Dana White&lt;br>
Samuel L. Jackson&lt;br>
Robert Stack&lt;br>
…And so many more!&lt;/p>
&lt;p>&lt;strong>Music&lt;/strong>&lt;/p>
&lt;p>Steve Angello with Pusha T&lt;br>
Gunter Kallmann Choir&lt;br>
Automatic&lt;br>
The Heavy Heavy&lt;br>
Phil Collins&lt;br>
Metallica&lt;br>
Nightcrawler&lt;br>
Death Lens&lt;br>
The Tubes&lt;br>
The Vapors&lt;br>
Guns &amp;amp; Roses&lt;br>
Black River Motorcycle Club&lt;br>
The Siege&lt;br>
The North Korean National Army Choir&lt;br>
Kayo Guevarra &amp;amp; Quake Matthews&lt;br>
Gravediggaz&lt;br>
Spirit&lt;br>
…And so many more!&lt;/p>
&lt;p>THANK YE&lt;/p>
&lt;p>Dark Matter Market - The Most Powerful Market In The Galaxy. Find Dark Matter Market by visiting Daunt.Link&lt;br>
Trocador.app - The Champion of Exchange&lt;br>
Pitch - The Town Square of the Dark Seas&lt;br>
Endchan - The Most Freedom On Either Side of the Internet&lt;br>
Dread - The Mecca of the Dark Seas&lt;br>
Sizeof.cat - The Premiere Destination for all things CyberPunk&lt;br>
The XMR Monero Community - The Currency of the Counter Culture&lt;br>
DoingFedTime - The Tonight Show of the Dark Seas&lt;br>
Dominic Milion Trott - Yer tour guide to all things Enhanced Living&lt;/p>
&lt;p>Wamus, Miner21, TyeDyeWaldo, Zreem, The Underwater Basket Weaving Community, HonkFM, The Shortwave Radio Community, CryptBB, 8Kun, 8chan, DankNation, CafeDread, The Body Art and Tattoo Industry, all of our wonderful listeners and well wishers.&lt;/p>
&lt;p>If ye enjoyed this show, please pass it to others!&lt;/p>
&lt;p>Thank ye so much for listening! Yer positive energy keeps us afloat and alive!&lt;/p>
&lt;p>&lt;strong>Links&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://endchan.org/.media/89c68936b0224ff4277d3bc453e08bc4-audiompeg.mp3">https://endchan.org/.media/89c68936b0224ff4277d3bc453e08bc4-audiompeg.mp3&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://redcircle.com/shows/CaptainBlackbeard">https://redcircle.com/shows/CaptainBlackbeard&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://trocador.app/en/anonpay/?ticker_to=xmr&amp;amp;network_to=Mainnet&amp;amp;address=83hN29rnsoRHJStCw7LXdTYgrj2STUC31JqViMieCmbSTTvXReS3ovj1hkMMD9Nk7qPYMEMPtPKfJ8LTtpjvJ7acQhtYJbH&amp;amp;donation=True&amp;amp;amount=0.2&amp;amp;name=CaptainBlackbeard&amp;#43;Radio&amp;amp;description=Donation&amp;#43;To&amp;#43;CaptainBlackbeard&amp;#43;Radio&amp;amp;email=thecaptain@danwin1210.de&amp;amp;ticker_from=xmr&amp;amp;network_from=Mainnet">Donate to Captain Blackbeard Radio in any currency&lt;/a>&lt;/p>
&lt;p>&lt;strong>Magnet&lt;/strong>&lt;/p>
&lt;p>The (currently) complete collection, contains EP 1-20 (MP3), all corresponding poster art and additional art, total download size 3.92GB.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">magnet:?xt=urn:btih:255bce06bc8740d62a2ac831053585c9e67b97ed&amp;amp;dn=Captain%20Blackbeard%20Radio%20EP%201%20-%2020&amp;amp;tr=http%3A%2F%2Ftracker.openbittorrent.com%3A80%2Fannounce&amp;amp;tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&amp;amp;tr=https%3A%2F%2Ftracker.foreverpirates.co%3A443%2Fannounce&amp;amp;tr=udp%3A%2F%2F9.rarbg.me%3A2710%2Fannounce&amp;amp;tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&amp;amp;tr=udp%3A%2F%2Ftracker.bittor.pw%3A1337%2Fannounce&amp;amp;tr=udp%3A%2F%2Ftracker.supertracker.net%3A1337%2Fannounce&amp;amp;tr=udp%3A%2F%2Ftracker.internetwarriors.net%3A1337%2Fannounce
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>CaptainBlackbeard Radio is a universal pirate radio humor and music broadcast unlike anything ye have ever heard, for the lads and lasses of action across the Dark Seas.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="http://sizeof.cat/post/captain-blackbeard-episode23/img/captain-blackbeard-full.jpg" alt="">&lt;/figure>&lt;/p></description><category>cyberpunk</category><category>radio</category></item><item><title>Website updates</title><link>http://sizeof.cat/post/website-updates-again/</link><pubDate>Thu, 03 Jul 2025 05:05:12 +0000</pubDate><author/><guid>http://sizeof.cat/post/website-updates-again/</guid><description>&lt;p>I know &lt;a href="http://sizeof.cat/post/website-updates-2025/">I specified in my last &lt;em>&amp;ldquo;website updates&amp;rdquo;&lt;/em>&lt;/a> article that I didn&amp;rsquo;t want a dark theme for the new website layout, but it occured to me &amp;ldquo;in a dream&amp;rdquo; (just kidding) that a dark color scheme can be easily implemented using a CSS &lt;code>invert&lt;/code> &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert">filter&lt;/a>, some &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate">hue rotation&lt;/a> and &lt;code>localStorage&lt;/code> to save the user preference for the color scheme.&lt;/p>
&lt;p>All the magic can be performed using a few CSS rules:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">html&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nt">data-theme&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;dark&amp;#39;&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">filter&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">invert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">hue-rotate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">180&lt;/span>&lt;span class="kt">deg&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">brightness&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">contrast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You might not want the images and video content inverted because it will look strange and people will send you angry e-mails:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">html&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nt">data-theme&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;dark&amp;#39;&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="nt">img&lt;/span>&lt;span class="o">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">html&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nt">data-theme&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;dark&amp;#39;&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="nt">video&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">filter&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">invert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">hue-rotate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">-180&lt;/span>&lt;span class="kt">deg&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">brightness&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nb">contrast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now for the real question(s), what is &lt;code>hue-rotate&lt;/code>, why 180 degrees and even more important, what&amp;rsquo;s the point. Well, &lt;code>hue-rotate&lt;/code> is a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate">CSS filter function&lt;/a> and the hue rotation is done for a simple reason: for the HTML anchor links color i use &lt;code>#5550ed&lt;/code> &lt;span style="background-color:#5550ed;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp;, and inverted by the &lt;code>filter: invert(1)&lt;/code> line, this yields &lt;code>#aaaf12&lt;/code> &lt;span style="background-color:#aaaf12;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp; which is a really ugly color (is it mustard? or something). I really wanted to preserve the blue tint since it&amp;rsquo;s almost part of my &amp;ldquo;brand&amp;rdquo;, and to keep the blue color but altered a bit as to fit the dark background, I used the &lt;code>hue-rotate&lt;/code> CSS function to apply a color rotation by 180 degrees, and that results in the anchor links using the &lt;code>#9B96FF&lt;/code> &lt;span style="background-color:#9B96FF;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp; color. A hue rotation of 170 degrees resulted in a blue I did not like &lt;span style="background-color:#819EFF;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp;, and rotating the color by 190 degrees resulted in lilac &lt;span style="background-color:#B490FF;display:inline-block;width:10px;height:10px">&lt;/span>&amp;nbsp;. 180 was the sweet spot, to be honest.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/scheme.png" alt="Color scheme">&lt;/figure>&lt;/p>
&lt;p>Yes, it sounds more complicated than it really is.&lt;/p>
&lt;p>For images and videos I&amp;rsquo;m inverting them to the original colors, un-rotating the colors by &lt;code>-180deg&lt;/code> so that the original colors are restored in all their glory. The &lt;code>brightness&lt;/code> and &lt;code>contrast&lt;/code> functions are there because I initially adjusted them a bit too. Feel free to remove if you&amp;rsquo;re not using them.&lt;/p>
&lt;p>Add a few JavaScript lines in the mix (using HTML5 &lt;code>localStorage&lt;/code> to save color scheme preference for each visitor, in browser&amp;rsquo;s storage) and it fits nicely into the layout of the website.&lt;/p>
&lt;p>There might be better ways to achieve what I wanted, but that&amp;rsquo;s how I did it.&lt;/p>
&lt;hr>
&lt;p>Next on the order of business, you probably saw that this website has &lt;a href="http://sizeof.cat/guestbook/">&lt;strong>a guestbook&lt;/strong>&lt;/a> now (actually, since June 21st), and many of my website visitors (and friends) already signed it. Unexpectedly, I know, I didn&amp;rsquo;t have to delete a single message (except my tests, but that&amp;rsquo;s a given), and that means a lot to me. &lt;strong>Thank you&lt;/strong> for the kind words and for keeping it civil but we all know this is going to change.&lt;/p>
&lt;p>The &amp;ldquo;administration&amp;rdquo; part is really basic (written in PHP 8.4, data is in a SQLite database, and fully integrated into my Hugo layout), displaying all the messages and giving me various actions I can perform on them (approve/unapprove, flag/unflag, etc). Flagging is done automatically by parsing each message for specific words, and all messages are approved manually. If you&amp;rsquo;re curious about what that looks like, check out the image below (I merged the top and the bottom of the actual screenshot because the list is pretty long, try to spot the breaking point).&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/guestbook.png" alt="guestbook">&lt;/figure>&lt;/p>
&lt;p>The whole &amp;ldquo;development&amp;rdquo; stage took about 6 hours, including testing (on live, as any true PHP programmer should do!). Not bad considering I haven&amp;rsquo;t written PHP code in ages, but I still remember about &lt;code>strip_tags()&lt;/code>, &lt;code>htmlspecialchars()&lt;/code> and prepared SQL statements. And hiding the &amp;ldquo;administration&amp;rdquo; part behind a htaccess file, a strict IP check, a special passphrase and only making it available during specific hours and days (ok, I&amp;rsquo;m joking about the last part).&lt;/p>
&lt;p>&lt;strong>No, the source code for the guestbook will not be released, neither for free nor paid.&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>I got a lot of e-mails during the past few days, mostly people asking me if it&amp;rsquo;s possible to restore one of their favorite articles (the name varied a bit but most people were keen on re-reading &lt;a href="http://sizeof.cat/post/the-kind-of-tired-sleep-cant-fix/">&lt;em>&amp;ldquo;The kind of tired sleep can&amp;rsquo;t fix&amp;rdquo;&lt;/em>&lt;/a>, so it&amp;rsquo;s available for reading again).&lt;/p>
&lt;p>Take care, until the next time.&lt;/p></description><category>website</category></item><item><title>Getting old</title><link>http://sizeof.cat/post/getting-old/</link><pubDate>Fri, 27 Jun 2025 06:56:05 +0000</pubDate><author/><guid>http://sizeof.cat/post/getting-old/</guid><description>&lt;p>People like to make it out that the West has done away with rites of adulthood and all that, but they are still there, just tweaked for the always-connected world.&lt;/p>
&lt;p>This is how it is, you get to an age where youthful recklessness and idealisation can no longer carry you through life, you can continue with your half-assed childish ideals and live a miserable life, or you become an adult. You either throw yourself entirely into your ideals and give up the reckless way of your past or, do like most people and just focus on you and those people that are important to you; you spend a few hours every other year to cast your vote for a better world (and fail at it), you watch the 6 o&amp;rsquo;clock news, but your dedication is friends, family, and community.&lt;/p>
&lt;p>While there is no ceremony, everyone around you will know you made the choice; if and when you decide to do so, you will feel different about the world and yourself, and you will be treated different, you will be an adult. You will coach that little league team even though you hate soccer and all kids who are not directly related to you, because you are the only one in the neighbourhood free on Wednesday nights. You will knock on 300 doors getting people to sign your petition about getting the pothole in front of your house fixed, that only you care about. You will lug radiators up 3 stories for a neighbour you barely know because you realised that while you can not change the world, you can make life for those around you better. You will become a pillar of the community in a community of pillars. You will grow old and bond with your grand-children over your shared tendency to wet the bed.&lt;/p>
&lt;p>It&amp;rsquo;s not that bad, friend, the world is not ending, we&amp;rsquo;re just getting old.&lt;/p></description><category>philosophy</category><category>short stories</category></item><item><title>StarFive VisionFive 2 with Debian 13 on NVME</title><link>http://sizeof.cat/post/starfive-visionfive-2-debian-13-nvme/</link><pubDate>Wed, 25 Jun 2025 14:39:27 +0000</pubDate><author/><guid>http://sizeof.cat/post/starfive-visionfive-2-debian-13-nvme/</guid><description>&lt;p>Since StarFive &lt;a href="https://debian.starfivetech.com">hasn&amp;rsquo;t released a new Debian image&lt;/a> for its &lt;strong>VisionFive 2&lt;/strong> SBC in a while, and the snapshot repo key expired, some people have picked up the pace and provided newer images with Debian 13 Trixie, as well as GPU driver support and bits of the StarFive&amp;rsquo;s custom kernel. Getting Debian 13 (Trixie) to work on a &lt;a href="http://sizeof.cat/post/starfive-visionfive-2/">StarFive VisionFive 2&lt;/a> SBC can be a bit tricky, especially if you&amp;rsquo;re trying to boot it from a NVME drive.&lt;/p>
&lt;p>&lt;a href="https://compusofia.com/academy/SoC/Star-V/vf2-debian2409pro-20250418.img.zst">Download a compressed image&lt;/a> and write it to a SD card bigger than 8GB (make sure the SD card is &lt;code>/dev/mmcblk1&lt;/code>, else adjust accordingly).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ zstdcat -d vf2-debian2409pro-20250418.img.zst &lt;span class="p">|&lt;/span> sudo dd &lt;span class="nv">of&lt;/span>&lt;span class="o">=&lt;/span>/dev/mmcblk1 &lt;span class="nv">status&lt;/span>&lt;span class="o">=&lt;/span>progress &lt;span class="nv">bs&lt;/span>&lt;span class="o">=&lt;/span>4M
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Insert the SD card in your StarFive VisionFive 2, make sure boot mode pins are set to &lt;strong>SDIO3.0&lt;/strong> (to boot from SD card) and boot the system. The password for the initial user is &lt;code>starfive&lt;/code>, use that to login into the system, insert an USB stick that has the same &lt;code>vf2-debian2409pro-20250418.img.zst&lt;/code> file on it and write it to the NVME storage this time.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ zstdcat -d vf2-debian2409pro-20250418.img.zst &lt;span class="p">|&lt;/span> sudo dd &lt;span class="nv">of&lt;/span>&lt;span class="o">=&lt;/span>/dev/nvme0n1 &lt;span class="nv">status&lt;/span>&lt;span class="o">=&lt;/span>progress &lt;span class="nv">bs&lt;/span>&lt;span class="o">=&lt;/span>4M
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We&amp;rsquo;ll need to alter the path to &lt;code>root&lt;/code> on the &lt;code>/extlinux/extlinux.conf&lt;/code> file, so mount the third partition from the NVME drive somewhere and edit the file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo mkdir /mnt/test
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ sudo mount /dev/nvme0n1p3 /mnt/test
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ sudo nano /mnt/test/extlinux/extlinux.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Change the 4 occurences of &lt;code>mmcblk1p4&lt;/code> to &lt;code>nvme0n1p4&lt;/code> inside the file, then save it (&lt;kbd>CTRL&lt;/kbd> + &lt;kbd>O&lt;/kbd>, then &lt;kbd>CTRL&lt;/kbd> + &lt;kbd>X&lt;/kbd>). Shutdown the SBC, pull out the SD card, change the boost mode pins to &lt;strong>1-bit QSPI Nor Flash&lt;/strong> (to boot from NVME) and power on the board. Root (and sudo) password is &lt;code>starfive&lt;/code> as before.&lt;/p>
&lt;p>Next we&amp;rsquo;ll need to resize the filesystem on the NVME drive&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo fdisk /dev/nvme0n1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Delete partition number 4 and recreate it (&lt;kbd>d&lt;/kbd> -&amp;gt; &lt;kbd>4&lt;/kbd> followed by &lt;kbd>n&lt;/kbd> -&amp;gt; &lt;kbd>4&lt;/kbd>). Press &lt;kbd>w&lt;/kbd> to write the partition info, quit fdisk and now you can resize the filesystem of the partition number 4:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo resize2fs /dev/nvme0n1p4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Check with &lt;code>df&lt;/code> if the partition 4 occupies the rest of the NVME drive, depending on the size of the drive.&lt;/p>
&lt;p>Next you can do a &lt;code>dist-upgrade&lt;/code> to get all your packages to the newest version (except some core packages that are on hold, for ex &lt;code>firefox119&lt;/code>, &lt;code>vlc-3.0.18&lt;/code>, &lt;code>mesa22&lt;/code>, GPU driver). You don&amp;rsquo;t want to upgrade those, so don&amp;rsquo;t run &lt;code>apt-mark unhold&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt dist-upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Don&amp;rsquo;t forget to remove the leftover packages after upgrading. You should know that the Debian Trixie image has modified update URIs, mirroring the data from &lt;code>mirrors.ustc.edu.cn&lt;/code>, and if you don&amp;rsquo;t want to do that be sure to change &lt;code>/etc/apt/sources.list.d/debian.sources&lt;/code> and replace that mirror with the official one, &lt;code>deb.debian.org&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo apt autoremove --purge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Enjoy Debian Trixie on your StarFive VisionFive 2 RISC-V board.&lt;/p>
&lt;p>&lt;figure>
&lt;img decoding="async" loading="lazy" src="img/debian.png" alt="Debian Trixie on StarFive VisionFive 2">&lt;/figure>&lt;/p></description><category>risc-v</category><category>hardware</category><category>starfive</category><category>debian</category></item><item><title>Playing Blu-Ray movies on PowerPC G4/G5</title><link>http://sizeof.cat/post/ibook-g4-play-bluray/</link><pubDate>Tue, 24 Jun 2025 13:58:13 +0000</pubDate><author/><guid>http://sizeof.cat/post/ibook-g4-play-bluray/</guid><description>&lt;p>Well, this is more like a &amp;ldquo;How to play Blue-Ray movies on your iBook G4 notebook &lt;strong>in theory&lt;/strong>&amp;rdquo;, because the G4 CPU is not suited for this kind of workload and a dual G5 machine will &lt;del>probably&lt;/del> definitely do better. You will need OS X 10.5 Leopard (the UDF 2.5 driver was introduced in this version of OS X) and Macports installed.&lt;/p>
&lt;h2 id="step-1">Step 1&lt;/h2>
&lt;p>&lt;a href="https://get.videolan.org/vlc/2.0.10/macosx/vlc-2.0.10-powerpc.dmg">Download VLC 2.0.10&lt;/a> and install it on your machine.&lt;/p>
&lt;h2 id="step-2">Step 2&lt;/h2>
&lt;p>If you already have Macports, you will need to install the &lt;a href="https://ports.macports.org/port/libaacs/">libaacs&lt;/a> library, which provides AACS support for Blu-Ray playback.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sudo port install libaacs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you don&amp;rsquo;t have Macports, &lt;a href="http://sizeof.cat/post/ibook-g4-software/#macports">install it&lt;/a>.&lt;/p>
&lt;h2 id="step-3">Step 3&lt;/h2>
&lt;p>Download a &lt;code>keydb.cfg&lt;/code> file from the &lt;a href="http://fvonline-db.bplaced.net/fv_download.php?lang=eng">FindVUK Online Database&lt;/a> and extract the archive somewhere.
Create an &lt;code>aacs&lt;/code> directory inside &lt;code>~/Library/Preferences/&lt;/code> and copy the &lt;code>keydb.cfg&lt;/code> file inside.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ mkdir ~/Library/Preferences/aacs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cp keydb.cfg ~/Library/Preferences/aacs/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Copy &lt;code>libaacs.dylib&lt;/code> into &lt;code>/usr/local/lib&lt;/code> (linking it might work too) so VLC can find the library.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ cp /opt/local/lib/libaacs.0.dylib /usr/local/lib/libaacs.dylib
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That&amp;rsquo;s about it, now you can open VLC and &lt;strong>attempt&lt;/strong> to play a Blu-Ray disc on your laptop&amp;rsquo;s puny G4 CPU.&lt;/p></description><category>apple</category><category>retro</category><category>ibook</category><category>g4</category><category>os x</category><category>powerpc</category><category>leopard</category></item></channel></rss>