Journal from Kotnik

Nikola's thoughts and discoveries

I visited an apartment I used to live a long time ago and picked up some of my old stuff. Among them was a computer magazine Svet Kompjutera (World of Computers) I used to buy religiously. It's from April 1988, full 36 years ago. It was really fun to read it from this perspective.

Magazine screenshot

The price was 1000 Yugoslavian dinars. That country does not exist anymore, and I have no idea what the price would look like today.

Magazine screenshot

It featured computing lessons. This part was about programming and it was dry as you can imagine, going over boring algorithm schemas nobody uses anymore. I used to learn it old school like this, and I am happy to report learning resources are much more better nowdays. Progress!

Magazine screenshot

IBM's dBase III was all the rage in 1988.

Magazine screenshot

But now into fun stuff. They organized a competition of chess games, they weren't even called engines at the time, and then, as it is now, CPU power was everything so from this stage 8 bit computers were separated from 16 bit ones, since the latter were significantly more powerful. I had my horse in the game: Colossus Chess on C64. I think it's my most frequent opponent for my lifetime, and at tender age of 7, it sure did beat me most times.

Magazine screenshot

Two biggest platforms at that time were ZX Spectrum 48 and Commodore 64. The magazine had assembly language programming tricks, and here you can see some scrolling effect for Spectrum. I never learned to program Z80 processor, but I can read and understand it's assembly thanks to this magazine.

Magazine screenshot

Here you can see complete map of the game. These were immensely helpful and generating them required skill and hacking tricks of its own kind.

Magazine screenshot

Now onto some serious PTSD! We used to type in assembly programs like this, a stream of seemingly endless DATA lines with POKE instructions that were checksumed at the end, and if you made the slightest mistake you'd have to re-type it from scratch again. Here they gave us 16KB big RAM disk on C64. Playing with these routines in monitor was source of countless fun weekends for me.

Magazine screenshot

Here's classifieds section for your viewing pleasure. Software piracy was legal and you could order any game for a fraction of price. Not that we didn't want to buy originals, they simple weren't available on our socialist Yugoslavia market (we did have a market of sorts). So, games would be compressed and sold in compilations like this.

Magazine screenshot

And here is the exact time I found out about Life algorithm. Some years after this I would become obsessed with it, figuring stuff on my own without having any guidance or knowing what the rest of the folks were doing since I didn't have access to any computer network.

Magazine screenshot

Finally, the last page of the magazine. This is what peek PC was at the time. I am still amazed that it won computing. At that time we had multimedia power machines like Amiga and Atari that had multi-tasking operating systems and were able to display colorful images accompanied by nice music. And if you to go back in time and tell me they would lose, that they would be utterly and completely destroyed by a dull, gray, monochrome beeping box sold to accountants?! I would consider you mad.

Bonus

Magazine screenshot

Finally, here's a treat for #RetroGaming fans: top games in Yugoslavia at the end of 1994. Remember, they were all almost free to us, and there was no marketing – so these lists were pure and trusted.

I've been a bit under the weather lately so, in order to distract myself a little bit, I took on finishing a few projects that have been laying dormant.

As chronic self-hoster who's been self-hosting stuff for decades, I need to keep up with what's running and what is not. For a long time I used Statping, but recently I switched to Uptime Kuma, mainly because it is more maintained and also faster. There was only one piece of the puzzle missing... So, here it is now, all published now: Uptime Kuma for Homer. In case you are using Homer dashboard, now you can display stats from your Uptime Kuma instance:

Uptime Kuma for Homer screenshot

It's a small Python project that uses Flask framework to bridge two services and make them interact. I wrapped it up quickly – frankly, writing README.md file took more time – but during the build I was thinking how things are slowly getting out of hand. Even for a small project like this, one needs to have a lot of context and knowledge of many different technologies. Just to name a few:

  • Python programming language,
  • but also Markdown.
  • Containers, especially the Docker implementation.
  • How Git works, too. The project lives on two repos that sync.
  • REST services, a bit of Prometheus.
  • YAML too.

So, maybe, just maybe, all this hype regarding AI LLMs could be an attempt to handle this in the longer run?

I have always been an exceptionally geeky person and somewhat of a hardware hoarder. This post is documenting all the laptop computers I am currently using.

Lenovo Thinkpad X13. This is my current primary laptop. It runs on #Archlinux and I use it as my main driver. Everything is supported and just works. The computer itself is joy to use: the build feels great and I really like this keyboard as well.

Lenovo Thinkpad T430s. My fallback laptop. It's rather old and all scratched out but I really like it. It runs on #FreeBSD and all hardware is supported. Actually, I am right now using it to write this post. I use it for my #retro-computing programming as well (I am back coding on 6510 CPU).

Lenovo Thinkpad T480s. My work laptop running #Fedora. And the one that gave me the most headaches. When I purchased it I had to return it back two times since the keyboard was so awful it would make the computer unusable. Literally, using the keys around red nub (the TrackPoint) would stuck it somehow and the cursor would just run that way rendering mouse unusable. Eventually, support fixed the issue but the keyboard is awful and I dread having to use this computer. Luckily, it's only when I am traveling, otherwise I just keep it clean and up to date.

Lenovo Thinkpad X1 Carbon (3rd generation). My old primary laptop currently used for experimenting. I don't like it since the screen is glossy, so whenever I work on it during the day it is as if I am sitting in front of the mirror.

PineBook Pro. Like some people, I also believe that the future of computing is in RISC, and currently ARM architecture represents it the best. So I purchased PineBook Pro. It runs #Armbian. I don't do anything heavily on this computer, but I use it to play with ARM architecture, recompile stuff I worked on somewhere else, and generally as a playground.

MSI GL75. This is my gaming laptop. It runs Windows 10 and is used only for playing games. Actually, mostly by my kids, but since I have fallen with Counter Strike CS:GO, deleted forced Counter Strike 2, and decided to give up on that game, I have discovered that Enemy Territory community still thrives and came back to it.

And that is it.

While replacing living room computer for streaming I ended up with a box with pre-installed #Windows 11. It was my first time with this operating system and I was curious so I decided to see how would it work for this role: stream a few services to connected TV and access Samba shares from local NAS.

After spending almost 4 hours on this tasks I ended up disgusted and horrified, eventually installing #Fedora. What follows is what I found out in this short time.

First of all, default install is utterly bloated with crap you will never need, and some of it you can't even uninstall, like Microsoft Edge browser, Xbox integration, Microsoft's storage solution that loves to send notifications, etc. I know there are hacks for Edge, but system update always brings it back.

And don't even get me started on ads! For example, the first thing I saw when I started the computer was ugly face of the politician I really don't like staring me from news widget. I don't want to get slapped by news when I don't ask for it. Why, oh why, is this a default in any operating system? Mind you, some other photos from news feed are equally bad, and this is unacceptable for living room computer in a family with little kids. Luckily, one can easily disable that awful widget thing.

Windows 11 user settings screen

Finally, and this is the straw that broke the back, you really can't change Windows system language after the install. This was official and activated Windows 11 Pro installation, not a single language Home version, but yet all attempts to change the system language would fail. We are a family that uses four languages at home, and this operating system can simply not support us.

The photo above is result of trying to switch to English language using only available settings, not poking the registry or other hidden buttons. Good work on UI.

Things like this, from annoying ones to the utter stupidity, are the real reason people switch back to Windows 10. Maybe I would do that too in this case, but OEM licenses for it can not be purchased anymore, and I don't want to be stuck in this dead-end environment anymore.

Final goodbye to the Windows, this home is now (almost) Microsoft free.

Update: I had to revert back to Windows 10, since Ryzen 5 integrated graphics is relatively unsupported in Linux and requires frequent reboots in order for it to recognize it is attached to video output.

We have our #Renault Twingo E-Tech electric for almost a year now. We are using almost daily for chores around the town, and sometimes to drive on a highway to nearby city. Here are my impressions.

Renault Twingo

  • This car is very small, but not uncomfortable inside. I can park anywhere, or do a quick u-turn even in smaller streets.
  • Regardless of its size, it can quickly accelerate and I found that very useful for quick overtakes or just for plain fun. It's not super powerful, but very noticeable if you come from a gas powered vehicle. But it's not very fast, and it burns a lot of energy on highways because it's not aerodynamic. It's okay for me since I don't need to go faster than 100 km/h anyway.
  • Trunk space is ridiculously small. I can fit in the groceries, or kids' school bags, but that's it. It doesn't have a frunk, there is simply no space for it.
  • It's equipped with a digital radio, and I've been enjoying that immensely. The type of music I like is not very popular so radio stations playing it are not saturated with ads, and the radio is on most of the times. I can't stand the sound of FM anymore, as a side effect.
  • Most of controls are physical buttons and dials. Even turning on the engine is done by turning the key! I really appreciate this and my brain was quickly trained to automatically do stuff without looking. Gear stick is also sensor-less and follows standard P-R-N-D system.
  • The car is connected, it has a SIM card built-in and sends a ton of metrics to Renault. We can not access any of it. Yes, you can remotely turn on the climate control, or see the battery level, but that is it. I worry about privacy aspect since that data will most probably be sold, or end up leaking.
  • Mainly due to its size, the car is very energy efficient. Judging by its own stats it spends 11.3 kWh per 100 km. That is really, really low. My gas powered vehicle spends 10 times more than that, mostly by sending the heat and pollution in the atmosphere.
  • I was surprised by the price of electricity. I was expecting that using EV vehicle would be more affordable, but it really isn't that much. We spend around 60€ per month for electricity.
  • Cruise controls and speed limiter are really awful, they are my biggest issue with this car. I use them frequently, especially the speed limiter for urban zones, and hate it every time. To turn it on you use seesaw switch next to the gear stick, but the rest of controls are on the wheel itself: on the left side are +/– and the right of the wheel pause and resume buttons. Just next to them is voice-assistant one, and I frequently hit it by accident. It's a usability nightmare.
  • There are no front or side proximity sensors. Cars in these pay-range usually don't have them, but I would really appreciate the side ones. It does have a high quality parking camera and it is very helpful.
  • Battery capacity is very small. I knew this before purchase but I still hate to have to recharge the car twice a week. It is designed to be plugged in during the night at home, but we can not do that. Also, forget about advertised autonomy, it's a complete fairy tale. During the summer one can go about 160 km until battery drops below 10%, but during the winter, when you have to have heating turned on, we can count on only 90 km of autonomy. It's a small city car, I understand that, and I happily recharge it frequently, but I would really appreciate battery upgrade option.
  • I don't like automatic wipers, it works well if it's really raining, but where we live it usually drizzles and I have to nudge it manually all the time.
  • I can control regenerative braking in three levels, and it is great when going downhill. I use the maximum level for deceleration generally, since it is very powerful and I like the feeling of regenerating energy, but a lot of times I worry about cars behind me since the maximum level does not turn on the stop lights even though it can bring a car to almost a halt fairly quickly.

Regardless of all the criticism above we are very happy with our little Twingo and use it all the time. Would we purchase it again? Definitely yes! I am sorry I didn't consider this option before.

I would love the option to upgrade the battery, maybe even after the purchase. I hope that will be possible with newest developments in battery tech. But, I strongly advise having a plug at home, even 220 V one works and car can be fully recharged over night using it. In the meantime we will continue using charging stations on the street and driving our car around the town.

In case you followed my previous posts you already know that ARM architecture should be avoided. It's in early development, things barely work. But, if you are like me: that is exactly what brought you here! So we can continue in the next episode of setting up my #PinebookPro.

But first, #opsec. You really want to fully encrypt your laptop storage, swap included. I think Pine64 is making big mistake by not having an option to do that easily. This post is all about that, if there was an option to secure system then I would happily continue using default Manjaro install.

These are the steps to install Armbian with full-disk (or in this case eMMC) encryption based on very helpful Armbian forum post. Installer does not support this, so you have to do it manually, so let's go.

1) Download Armbian for Pinebook Pro and dd it on microSD. Boot from it using Tow-Boot. I chose Desktop version, but do use CLI option if you want something else than Cinnamon desktop environment.

2) Once in Armbian set up cache directory:

export WORKDIR=/mnt

3) Update your system and install dependencies:

apt update && apt upgrade
apt install cryptsetup-bin gdisk

4) Start installer, when asked choose booting from eMMC and ext4 filesystem (or something else, of course), then exit at the end. Ideally, all this work should be part of installer itself, and eventually it will:

armbian-install || true

5) Now, we want to move installed files and replace the disk with encrypted volume. So, we need to take a copy of data:

mkdir -p ${WORKDIR}/emmcdata
mount /dev/mmcblk2p1 ${WORKDIR}/emmcdata
rsync -a --info=progress2 ${WORKDIR}/emmcdata/. ${WORKDIR}/backup
sync
umount /dev/mmcblk2p1
rmdir ${WORKDIR}/emmcdata

6) Create partition layout. We need two partitions: unencrypted /boot and the rest for encrypted data:

sgdisk -og /dev/mmcblk2
sgdisk -n 1:32768:+512M -t 0:8300 /dev/mmcblk2
sgdisk -n 0:0:0 -t 0:8300 /dev/mmcblk2

7) Create partitions. Simple /boot and encrypted rootfs volume. Notice how we use temporary key for encryption. Don't worry, we'll set up passphrase later. Again, I chose ext4, but you don't have to:

mkfs.ext4 -F -L bootfs /dev/mmcblk2p1
dd if=/dev/zero bs=$((512/8)) count=1 of=/dev/shm/keyfile
cryptsetup luksFormat --batch-mode --cipher=aes-xts-plain64 --key-size=512 --hash=sha512 /dev/mmcblk2p2 /dev/shm/keyfile
cryptsetup open /dev/mmcblk2p2 rootfs --key-file=/dev/shm/keyfile
mkfs.ext4 -L rootfs /dev/mapper/rootfs

8) Mount partitions for sync:

mkdir -p ${WORKDIR}/restore
mount /dev/mapper/rootfs ${WORKDIR}/restore
mkdir -p ${WORKDIR}/restore/boot
mount /dev/mmcblk2p1 ${WORKDIR}/restore/boot

9) Restore installer files from backup at step 5:

rsync -a --info=progress2 ${WORKDIR}/backup/. ${WORKDIR}/restore
sync

10) Tell Armbian not to try to be smart and attempt partition resizing at the first boot, or it will mess up your encrypted volume:

touch ${WORKDIR}/restore/root/.no_rootfs_resize

11) Prepare your new environment:

cd ${WORKDIR}/restore
mount -o rbind /dev dev
mount -t proc proc proc
mount -t sysfs sys sys
cat /etc/resolv.conf > etc/resolv.conf
cat /etc/hosts > etc/hosts
cat /etc/apt/sources.list > etc/apt/sources.list
cat /etc/apt/sources.list.d/armbian.list > etc/apt/sources.list.d/armbian.list

12) Make it aware of proper root filesystem volume:

sed -i '/^bootlogo=/s,=.*,=false,;/^rootdev=/s,=.*,=/dev/mapper/rootfs,' boot/armbianEnv.txt

13) Add active modules to initramfs:

lsmod | cut -d ' ' -f1 | tail -n+2 > etc/initramfs-tools/modules

14) Create crypttab:

echo "rootfs UUID=$(lsblk /dev/mmcblk2p2 --nodeps --noheadings -o UUID) none initramfs,luks" > etc/crypttab

15) Create fstab:

echo "/dev/mapper/rootfs / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1" > etc/fstab
echo "UUID=$(lsblk /dev/mmcblk2p1 --noheadings -o UUID) /boot ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 2" >> etc/fstab
echo "tmpfs /tmp tmpfs defaults,nosuid 0 0" >> etc/fstab

16) Chroot into your new system and do what installer should be doing in the first place (don't forget, you should be in ${WORKDIR}/restore in case you went to explore around in the meantime):

cat << EOF > config
#!/bin/sh -vx
apt update
echo 'force-confdef' > /root/.dpkg.cfg
apt --yes install cryptsetup-initramfs
rm /root/.dpkg.cfg
lsinitramfs /boot/initrd.img* | grep 'usr.*cryptsetup'
exit
EOF
chmod +x config
chroot . ./config
rm config

17) Set up your final passphrase that will make temporary key obsolete. Use something strong here:

cryptsetup luksChangeKey --key-file=/dev/shm/keyfile --cipher=aes-xts-plain64 --hash=sha512 /dev/mmcblk2p2

18) Umount all filesystems:

umount | awk '/restore/{print $3}' | sort -r | xargs umount 

19) And finally, power-off and remove Armbian installer's microSD card, then start your system. Your data is now protected at rest and you can finally start properly using your Pinebook Pro.


Posts in #PinebookPro series:

This is the second post in my #PinebookPro series. I plan to document all the steps of making it usable.

The first step is installing an operating system. Your Pinebook will arrive with #Manjaro pre-installed on eMMC. It's a fine operating system, but the system is not encrypted and there is no way to do it post-install. Yes, you can do tricks to have encrypted /home directory, but my #opsec requires full disk encryption.

Pinebook does not support booting off an USB drive, and you can't just insert microSD card with operating system and expect it to work. Boot order is hard-coded: SPI chip, then eMMC, and finally microSD.

Side note: I still didn't figure out what does SPI mean, but basically it's a 16MB disk on chip. It's some ARM relic. It arrives empty, and you can flash it with custom bootloader, which is exactly what we will do here.

But first, you need to make sure pre-installed Manaro isn't booting up the first. In order to do that you need to open your Pinebook and disable the eMMC chip. It's easy, there's an on/off switch on the motherboard just next to it :) And opening your laptop is also very simple since it is designed to be opened and modified.

Opened Pinebook Pro

The chip is on the top right corner, between ARM SoC (CPU, GPU, etc) and the battery. Next to it is a little on/off switch, and I had to peel off a small protection cover in order to turn it off. So, it's off, put back the bottom cover and prepare the boot loader on microSD card.

There are other options, but I chose Tow-Boot. Get the latest release for Pinebook Pro, extract it, flash spi.installer.img onto microSD card, and boot your laptop with it. Select Flash firmware to SPI on the mini-menu, reboot, remove microSD card and you are done. Now you can switch your eMMC to on, and firmly assemble your laptop.

That's it. Now, when you boot your computer, you will be able to press Escape key and select the boot device. Even USB is supported! This will be essential to the next blog post: installing Armbian. But, more about that the next time.

PS. I really enjoy the hacking involved in making all this possible. Working directly with devices, sending commands and watching the verbose output during laptop initialization. Nowdays Linux on x86 just works, and I didn't know I was missing the excitement of doing things myself.


Posts in #PinebookPro series:

Recently I have been searching to replace my laptop after spending many years with #Thinkpad X1. It's still an okay machine, I will not throw it away, but it has an issue where screen would turn off without any way to turn it off except leaving computer off for a while.

I use this laptop for reading and researching, occasionally for light retro programming. And that's it. So I revised features I need:

  • It should be #ARM based, as this is the architecture I want to experiment with.
  • It must be without active cooling. My phone is without a fan and it can do a lot, so why should I accept noisy fans in my laptop?
  • It shouldn't be expensive.

There are not many options out there. There are some Acer Aspire ones. MNT Reform sure looks great, but it's very expensive. Apple Air with their own CPU is also an option, but it is also expensive. And then there's Pinebook Pro from PINE64. Price is around $200, so very affordable, and I am already successfully using their PineBuds Pro headphones. So that's what I chose.

Pinebook Pro

On the order page PINE64 is not joking: they clearly state that this computer is not for casual users and it is built for people who want to work on ARM architecture. And my, aren't they right. But let's see.

First of all, let's quickly go over the main issues with the ARM architecture itself. While being very advanced and powerful, it is completely driven by companies that are not playing with each other, or with open source developers for that matter. X86 architecture, mainly due clones and clone wars, has a reasonable design: there's a bus where devices are discoverable. ARM, on the other hand, are massive chips that integrate a lot of peripherals which talk to each other in proprietary and custom ways. This is best witnessed if you follow up significant but slow work in Asahi Linux; it's mainly reverse engineering with a lot of trial and error type of work. This is a bit simplified view, of course.

At this point, I am writing from the Pinebook. 😊

I want to focus on the good stuff, so let's note what I like so far (I will revise this list as the time goes by, of course):

  • Aluminum case feels so good, in compared to Thinkpad's plastic one.
  • Keyboard is nice, and it feels high quality. Firmware itself is open source, so that is a big plus.
  • I had to open my Pinebook (more about that later) and many parts are replaceable. Most notably the battery. The thing is designed to be opened and it shows.
  • Passive cooling! No fan, no noise, and practically no heat as well.

Now, these are the things I didn't like:

  • Suspending is not working. I got used to this too much under Linux.
  • Keyboard is not backlit.
  • Screen can not be tilted back much, my estimation is 100°. That is not enough.
  • Software support is basic and in development. So far I tried three distributions: Manjaro, postmarkOS and Armbian. You really need to know what you are doing and have to have a lot of experience in order to install and set up your software.
  • There is one known issue with speakers, and this is potential deal-breaker. From time to time it clicks and emits really annoying sound that is somehow related to the level of screen brightness.

All in all, after spending a lot of time to achieve basic things, or at least what has been basic in Linux for more than a decade, I am a bit disappointed. And what I mean by basic is really basic, like installing operating system, achieving working WiFi, encrypted disk, etc.

I will keep and use #PinebookPro, there are a few issues still, but it is usable now. My search for good ARM based laptop is continuing.


Posts in #PinebookPro series:

An interesting thing happened in #China a few weeks ago:

An influencer who posts videos teaching people how to cook has gotten himself banned for posting a video in November about how to make egg fried rice. The reason this is controversial is because some early memoirs by PLA veterans about the North Korean war describe that Mao Zedong’s son died in Korea when he made himself some egg-fried rice and the smoke from cooking drew in American planes who bombed him to death. And this all took place on the 25th of November. The CCP has since declared that all of this is rumours made up to slander a war hero, and that he was in the base instead of the air bunker where everyone else is in order to protect vital documents. Nonetheless, among Chinese people who are anti-CCP, a lot of them keep a tradition of celebrating “Chinese Thanksgiving”, where they eat egg fried rice on the 25th of November—to give thanks and celebrate the fact that this foolish decision ensured Mao didn’t have a legitimate heir, which they think is the only reason China didn’t turn into a family dynasty like North Korea.

The influencer was banned because this was the third year in a row now that he’s posted a video about egg fried rice some time in the month of November, and the censors think that he’s dogwhistling anti-CCP sentiments. The influencer defends himself by saying that he barely even graduated middle school, he has no idea about this history until now, and that he posts daily videos, and just about every month, he does an episode about egg fried rice. So yeah, he posted about egg fried rice on three Novembers in a row, but he posts about it in June and December and March too.

Emphasis mine.

Last night I uninstalled Counter Strike 2.

After spending more than 800 hours of play time in Counter Strike Global Offensive (the previous version) I have decided to give up, and here is why. Not that I am complaining, I really had good time playing CS:GO, I don't regret it. The game was popular and well balanced and it run well at high quality setting on my gaming laptop.

And then came Counter Strike 2. Valve decided to force push update, and it removed CS:GO from my computer, even though I payed for it.

Core of the issue is that it is completely different game. It's all in pastel colours, a bit cartoonish, with different mechanics in every respect. All the muscle memory of the buy menu is going to be stuck in my brain for no reason, and that's just one example.

Then, the performance. The same gaming laptop that run CS:GO at high details now can't run Counter Strike 2 at lowest. I had to enable shadows, it's core part of the game, and it brings FPS down to 20 at times, and especially during duels. It's really annoying to die during glitch, only to find out after few seconds after the screen unfreezes. And it happened to me around 20% of times.

Finally, as the last drop in the bucket, I figured out that I might spend money for new hardware to continue playing, spend another 800 hours in the game, only for it to be removed from my computer because someone in Valve decided so. And I can't do that anymore. There are so many good games I want to play, and I don't want to wait for CS2 to become stable, life is too short to spend it on stupid ideas of some person in Valve.

Good bye Counter Strike, it was a good run.