blinry's homepage 2024-03-16T00:00:00+00:00 Fifty Things you can do with a Software Defined Radio 📻 50-things-with-sdr 2024-03-16T00:00:00+00:00 blinry Last week, I went on an adventure through the electromagnetic spectrum!

It’s like an invisible world that always surrounds us, and allows us to do many amazing things: It’s how radio and TV are transmitted, it’s how we communicate using Wi-Fi or our phones. And there are many more things to discover there, from all over the world.

In this post, I’ll show you fifty things you can find there – all you need is this simple USB dongle and an antenna kit!

The device looks like a big USB stick with a bronze screw connector at the back end. It's labelled "RTL-SDR Blog V4".

The “Make 50 of Something” technique

A couple of years ago, I heard about the “Make 50 of Something” technique in Vi Hart’s Fifty Fizzbuzzes. Since then, I’ve already made fifty programs for the fantasy console TIC-80 in one weekend in 2021.

I found that a very exciting experience – trying to make so many new things really pushed me to leave my comfort zone, to be creative, and not to get sucked into rabbit holes too deep.

I knew I definitely wanted to try the technique again. So, when I took a week of vacation, I decided to try to find 50 things to do with a Software Defined Radio!

What is an SDR?

A Software Defined Radio is essentially a radio that relies on a computer to do most of its data processing. It doesn’t rely on analog hardware too much – instead, most of what is does is “defined in software”, hence the name.

Usually, SDRs can detect electromagnetic waves in a much wider range than a common FM radio, which makes it especially exciting! I got interested in SDRs after reading about Albert’s project to build one as a module for the Framework laptop!

What you’ll need

I went into this week without much knowledge of the things I’d find. I’d read through a introductory course for aspiring amateur radio operators (more on that later), but I barely knew which way to point my antenna.

If you want to follow along, this section is intended to help you get started!

Most of the 50 things also have a little infobox at the beginning, explaining the frequencies, and some special knowledge needed to receive them.


I looked into the topic a bit, and a popular, cheap SDR right now is the RTL-SDR Blog V4, which has the form factor of a simple SUB dongle. You can get it for around $30, or as a kit with telescopic antennas for $50.

Everything I tried during this week was done using this USB dongle, the antenna kit, and a long piece of wire!

(By the way, there’s another great option if you don’t want to buy anything – lots of people make their SDR accessible through the Internet! You can find a map here.)

Using the antennas

I tried to adjust my antenna to the desired frequencies as best as I could. I think for receiving, it’s not super important that your antenna is perfectly configured, though.

For most applications, I used the dipole antennas that came with the kit I purchased. Dipole antennas have two sides that stick out the same length. You generally wanna make the whole antenna half as long as the wave length you want to receive, and orient it vertically.

My rule of thumb was to divide 72 by the frequency in MHz, and take that as the length of each side of the dipole in centimeters. That’d make the whole antenna a bit shorter than half of the wavelength.

For example, this is what the configuration looked like for frequencies around 100 MHz:

A 1.4 m long, two sided antenna, attached to my window.

And for higher frequencies, I used the tiny screw-on antennas from the kit:

The antennas are only a couple of centimeters long.

For specific applications like receiving satellites, or receiving locators for airplanes, I used special configurations, but I’ll discuss these as we go!


The software I liked best, and which I used for many things, was SDR++. It allows you to explore the frequency spectrum very smoothly, and has a modern user interface!

But I also used plenty of other software, on Linux in my case. I’ll link to the software as needed below.


On Monday morning, I was excited to start this project! I sat down at my desk, and got to work!

1: Listen to FM radio

  • Frequency: 87.5-108 MHz
  • Modulation: FM (“frequency modulation”)

This as an obvious first thing to do, as the signals are very strong! I was using the SDR++ software, and it felt very nice browsing around and discovering the stations around me! It reminded me of exploring the radio as a child.

I found a local station that gives 1-hour slots to civic groups, for example!

2: Listen to Freenet

  • Frequency: 149.01-149.11 MHz
  • Modulation: FM

This is a special frequency range in Germany: Anyone is allowed to send there, using licensed devices. There are 6 channels.

I think someone was testing their device there when I listened in. :D I heard a “Hellooo?”, then a “Test, test”, and then a “General call to all stations”. Oh, and shortly after a short transmission on channel 3 in a Slavic-sounding language!

Freenet devices have a range of only a couple of kilometers, so these people must have been pretty close! :O

A short burst in the waterfall diagram, at 149.05 MHz.

3: Receive weather conditions from airports

  • Frequency: Differs by airport, search term is “ATIS”
  • Modulation: AM

While browsing the aviation frequencies, I found this station that reports weather conditions in an endless loop. It seems to be the “Automatic Terminal Information Service” of Hamburg airport!

Thanks to that, I found out that the current air pressure was 1011 hPa! :D

4: Listen to airplane communication

Listening to “messages not meant for the general public” is not allowed in Germany, so of course I didn’t do that. And if I had accidentally done that, I wouldn’t be allowed to tell you about it. 🙅

5: Track aircraft via ADS-B

  • Frequency: 1090 MHz
  • Protocol: ADS-B

That’s short for “Automatic Dependent Surveillance – Broadcast”. Aircraft send it automatically to be tracked.

For this, I built my first antenna! From wire and and an antenna connector called “SMA”.

A antenna made from two short wires.

And it worked! \o/ I decoded the signal using the software SDRangel. Fascinating! I saw some big & small airplanes, and even a helicopter!

Planes around Hamburg on a map, together with a table of their properties.

6: Listen to stereo FM radio

  • Frequency: 87.5-108 MHz
  • Modulation: FM

How stereo audio is transmitted is really interesting, because it’s backwards-compatible to receivers that don’t support it:

Here, you see the demodulated audio frequency spectrum, as shown in SDRangel. Below 19k Hz, it’s just mono audio. Then, to mark a stereo station, there’s a constant “pilot tone” at 19k Hz! (Outside of what most humans can hear.)

Then, if you double the frequency of the pilot tone, you can derive the sections where the difference of the left & right channel to the mono channel is transmitted!

Correction: I’ve been told that instead of what I call “left” and “right” in this diagram, the upper frequencies transmit the difference of the left and right channels! That way, the receiver can calculate the left and right channels from the mono signal (which is, esseutially, the sum of left and right).

An audio spectrum, with the pilot tone and the frequency ranges marked in blue.

7: Receive road traffic information

  • Frequency: 87.5-108 MHz

If you triple the frequency of the pilot tone, you get to a range where FM stations transmit small amounts of digital metadata, like the name and genre of the station, and the current song! That’s a protocol called Radio Data System.

This system can also transmit road traffic information! There seemed to be a road closure at “0x64BE”, as decoded by SDRangel.

Metadata of a station called N-JOY.

The Federal Highway Research Institute publishes an Excel table, where I could look up that this is a town in Lower Saxony!

An Excel file, with the proper street and town highlighted.

8: Listen to conversations on the 2-meter amateur radio band

  • Frequency: 144-146 MHz
  • Modulation: FM

This is a frequency range reserved for amateur radio operators – for non-commercial use only. You may send on this band after getting a license.

What I found here is seemingly a conversation circle facilitated by a relay around 15 km away from here – it takes input on a certain frequency, and outputs an amplified copy of it on another frequency! Klaus, Bernd, Jürgen and Horst were talking about antennas, relays, and Windows XP! 😁

An FM signal at 145.75 MHz.

9: Listen to digital radio

  • Frequency: 174-240 MHz

The SDRangel software also has a demodulator for Digital Audio Broadcast! :O I continue to be amazed by it!

I think this was the first time I’ve received digital radio via air! I saw so many stations, and I’ve only checked a couple of channels.

The advantage of this digital channel is that there’s no noise. And I even saw a “cover image” in one of the programs!

10: Listen to PMR446

  • Frequency: 446.0-446.2 MHz
  • Modulation: FM

This is a frequency range for “Private Mobile Radio”. It’s another of these bands where anyone can transmit using a licensed device!

Not a lot of activity here. I heard “Hello, hellooo!”, “Can you hear me?” and some short transmissions that sounded like a child! :D

There also seemed to be digital transmissions, but I didn’t know how to decode them yet.

Some speech burts in a noisy waterfall diagram.

The range of PMR446 devices is pretty low (a couple of hundred metres in cities), so again, the people must’ve been close!


After the first day of SDR experiments, I was amazed how much invisible communication is going on around us in the electromagnetic spectrum at the same time!

I posted each of these things on Mastodon as I went, and asked people for suggestions for more things I could receive.

11: Read your neighbors’ sensors

  • Frequency: 433.05-434.79 MHz

At 433 MHz, there’s a frequency band for “industrial, scientific and medical” applications. And wow, there was quite a lot of activity nearby!

Short signal bursts in the frequency spectrum, at different frequencies around 433 MHz.

Using the decoder rtl_433, I saw two sensors that output the current temperature, humidity, and air pressure!

There were also some “IBIS beacons” flying by, which are used in public transportation, so maybe it’s buses driving by?

Command line output of rtl_433, reporting sensor data.

Later, an “Interlogix Security” device also appeared, reporting “closed switch states” :O

12: Track ships!

  • Frequency: 162.025 MHz

Ships send out their status using AIS (Automatic Identification System). And again, I received a lot of them here in Hamburg! :O

I was especially excited to receive data from the MS Stubnitz (a fisher boat that was turned into a culture center/techno club)! It reports its status as “moored”, and its speed as 0.1 knots! :D

A table of ships, along with a map.

Again, I used the software SDRangel. Apparently, it can also display a 3D map, but I haven’t figured out how to add 3D models…

13: Detect GSM activity

  • Frequency: 876-959 MHz, I looked up the specific ranges for Germany on Wikipedia

I was curious whether you could tell if someone used their phone! So I borrowed a GSM phone, tuned to the correct frequencies, and made some test calls.

What surprised me most: You can kind of “see” the volume at which I was talking!?

In the recording, the three dense bands at the end were when I was humming into the phone at the other end. This only worked in the “receiving” direction.


14: Receive signals from a satellite!

  • Frequency: 136-138 MHz

I spent all Tuesday afternoon and evening learning about satellites. The program gpredict is really nice to find out when satellites will pass overhead! I learned a lot, including that one satellite I was trying to receive burned up last week! :D

A map of the Earth, with satellite positions and predictions.

I was super excited when I first received a signal from a NOAA satellite! 🛰️

A striped signal in a waterfall diagram, at around 137 MHz.

But I didn’t manage to decode it properly yet. Maybe my reception was too noisy? I wanted to keep trying, but I had to move on.

A noisy image with borders.

15: Admire TETRA signals

In Germany, the police has switched to an encrypted digital protocol called TETRA.

Even though I’ve seen some interesting talks at CCC events about weaknesses in the decryption, all I wanted to do for now is looking at the pretty signals in SDR++. :3

Colorful, very orderly strips in a waterfall diagram.

16: Listen to taxi dispatchers

Again, this is communication not meant for the general public.

I didn’t listen to someone dispatching taxis to specific addresses, and you also shouldn’t do that either. 🚕

Stay away from a site called “frequenzdatenbank”!

17: Ponder mysterious signals

Some of the most fun I had was just browsing frequencies and seeing what I can find! Sometimes, I encountered signals I can’t identify.

For example, at 865-868 MHz, there was a family of slow, continuous, digital signals that made a nice melody when listened to in single-sideband demodulation!

Digital chirps, separated by 200 kHz.

And at 177-180 MHz, there were two very broadband transmissions. Might be TV? But I couldn’t find out what type. (It later turned out that I’d already listened to these signals – it was digital radio, DAB+.)

Broadband RF in a waterfall diagram.

18: Track weather balloons

  • Frequency: 400-405.9 MHz

As I was browsing around for things to receive, I saw on this tracking website that a radiosonde was just launched in Hamburg! SDRangel could decode its transmission! It had climbed to a height of 7 km, and it’s -17 °C there!

I knew that it would eventually burst and fall back to Earth, and that I could try to get to it and find it!

Data about the balloon. Location on a map, height data graph.

19: Hunt weather balloons!

I decided to go on a field trip, using trains and my bike.

I'm holding a bike at a train station.

I was following the tracker. The balloon popped earlier than predicted, and I frantically changed travel plans!

Balloon paths on map.

Eventually, it landed in a forest. I hoped I could get to it! What made this adventure more tricky was that my mobile Internet contract ran out while I was on the go, and my battery was also almost empty.

But I made it to the forest, and entered it.

All pictures show me in a swampy forest.

As I circled the site, I encountered a person in their 60s, with a stubbly beard and a blue wool hat. He was looking in the direction of the crash site, and was holding a smartphone, so I asked him whether he also was looking for the radiosonde.

He was! We looked for it together for half an hour, jumping over small rivers and crawling through the woods, while he gave me a lot of tips related to hunting sondes.

He told me that he had found around 40 of them so far!

Usually, the sondes keep broadcasting after landing, but this one wasn’t. So he quickly guessed that someone else could’ve taken it. Or maybe it landed in the water and died?

Some pictures of the area we searched:

Eventually, we gave up, and walked back to our vehicles. He also is an amateur radio operator, and could answer a couple of questions related to building antennas!

And he was right: Someone had been faster than us! The status was changed. So in the end, I didn’t find the sonde. But something that might be even better – a friend!

20: Receive amateur packet radio

  • Frequency: 144.8 MHz

In the 2-meter amateur band, there are certain frequencies for the “Automatic Packet Reporting System”. It’s a bit like IP – packets have a “from” and a “to”. They can also broadcast their position, or weather data.

Some stations seem to announce themselves as repeaters, which probably help forward the packets to increase the range.

And two people seemed to be on a “fieldday”, and broadcasted their location. :D

A table of packets in a rather cryptic format.

SDRangel can create a map automatically:

Icons on a map around Hamburg.


I started the day by building an antenna!

A big roll of green wire.

This was going to be a simple “random wire” antenna, to allow me to get better reception in the lower frequencies, which I’ve omitted so far (because I knew it would be much more fun with a better antenna)!

I measured out 21.6 m of wire (which for ✨magic✨ reasons seem to be a good universal antenna length)…

Green wire spread across a carpet.

…directly attached it to the center of another SMA connector…

A golden screwable connector on the end of the wire.

…and draped it all around my room!

The green wire draped over a wooden shelf.

People on the Internet say that there are many problems with this – that it would be better to have it outside, and that there’s an impedance mismatch between the receiver and the wire.

I could address those problems, but I wanna try how well this works first :)

21: Receive Morse code from other countries

  • Frequency: 10.10-10.13 MHz
  • Modulation: CW (“continuous wave”)

On the 30-meter amateur band, I found people sending Morse code! :O

I’d been learning it a little bit, so if I recorded it and slowed it down, I could understand it: They’re sending their callsigns. These are from Belgium, France, and Italy! \o/

I compared to my 2-meter dipole antenna, and the reception was definitely better – I can pick up more transmissions, and with much less noise!

22: Receive maritime weather reports

  • Frequency: 11.039 MHz

The German Weather Service broadcasts maritime information throughout the day on various shortwave frequencies.

They use a protocol called RTTY (radioteletype), and it took me a while to decode it. But I found a neat little program called “fldigi”: You can pipe audio to it (single side band modulation), and then if you pick the correct settings (see screenshot), it happily transcribes the messages!

Here’s the station weather reports for the Baltic Sea and Northern Sea!

The reports contain temperature, pressure, and wind direction.

23: Receive digimodes from other countries

  • Frequency: 10.130-10.15 MHz

I found some other strange signals on the 30-meter band. The Signal Identification Wiki was really helpful for figuring out what they were: FT8!

FT8 is quite a new protocol, invented in 2017, and it seems to be super popular right now! It allows you to transmit short messages, and again, people are looking for people to talk to (CQ), saying how well they receive each other, or saying goodbye (73).

This is the WSJT-X software.

A waterfall diagram, and a table of decoded messages.

24: Detect whether your notebook is charging

  • Frequency: Below 1 MHz

As I was browsing the very low-frequency bands, I had a strange problem: Sometimes, that would work okayish, sometimes I could even make out voices!

But other times, it wouldn’t work at all, and everything would be loud, angry noise. Even in regions where I had better reception before!

Eventually, I found out how to solve that issue – by unplugging my notebook charger. D’oh! :D

25 & 26: See ionosondes and radar signals

  • Frequency: 6-30 MHz

In the low frequencies, occasionally, you can hear a short chirp! :D These are caused by ionosondes, scientific instruments which measure the properties of the ionosphere by sweeping a wide frequency spectrum.

Another signal (which I accidentally got in the same screenshot) is a radar system – in this case, according to the Signal Identification Wiki, it’s a “CODAR” system, used to measure the motion of water waves and currents along coasts! :O

A diagonal line across 16 MHz, and a shorter, repeating pattern, repeating 4 times a second.

27: Listen to “single side band” conversations

  • Frequency: In all amateur bands, especially the ones below 30 MHz
  • Modulation: SSB (“single side band”)

How do you transmit speech over long distances? You can use “amplitude modulation”, where you change the volume of the carrier frequency to model your audio.

As a side effect, the bands to the sides of the carrier will contain a signal, as well.

One trick is to transmit just those sidebands, which saves power! But you have to “guess” the base frequency when listening. Depending on which part you transmit, this is called “lower side band” or “upper side band”.

SDR++ makes it very easy to play with this! :) Here’s someone from Serbia!

28: Listen to AM radio from the other side of the world

At night, low-frequency radio waves can travel further around the world, because they’re reflected by the layers of the ionosphere! There’s something magical about this.

I put my antenna outside, and I could hear a lot of broadcasting stations! On, you can look up where they are located.

Some stations in China are broadcasting with very high power! Some I could hear were over 7500 km away.

Wow. It’s full of stars! 🌌


Originally, I had planned the project to run from Monday to Friday. When I still had 32 things to do in Friday morning, I knew I’d need to extend it. But I hadn’t run out of ideas yet:

29: Listen to CB radio

  • Frequency: 26.965-27.405 MHz
  • Modulation: FM or AM

After I’d looked into the low frequencies on Thursday, I went to a higher band again: The Citizens Band!

This is the third frequency band I’m aware of where anyone is allowed to transmit – provided that you use a licensed device!

This is a band where my random wire antenna really came in handy. Without it, I would have had a hard time understanding anything. And even with it, transmissions are extremely noisy.

CB radio is used internationally, especially by truck drivers, it seems.

30: Assess the propagation of radio waves using beacons

  • Frequency: 14.100, 18.110, 21.150, 24.930, and 28.200 MHz
  • Modulation: CW

The International Beacon Project runs a network of 18 stations, which take turns transmitting their callsigns at certain frequencies.

Using this system, you can quickly get a sense of how well radio waves are currently propagating to your location. Clever!

I picked up the beacon from southern Finland! You can see its callsign scrolling away in the video. It’s followed by four dashes send with decreasing power. I only heard the first one…

31: Receive a time signal

  • Frequency: 9996 kHz
  • Modulation: CW

I would’ve loved to receive DCF77, which powers the radio clocks in Germany! But no matter how hard I listened to 77.5 kHz, there was nothing there. I don’t think my dongle can do that.

So I used higher frequencies! Russia transmits its “RWM” time signal at 9996 kHz, which beeps every second, with a long beep for the full minute.

Not enough to tell the time, but enough to adjust your wrist watch, I guess!

32: Receive a weather fax

  • Frequency: 3855, 7880, and 13882.5 kHz (see for more)

The German Weather Service broadcasts weather maps throughout the day! You can decode them using fldigi’s “WEFAX-576” setting.

I caught this one only halfway through. According to the schedule, it’s the “Surface weather chart North Atlantic, Europe”!

If you squint really hard, you can make out the coast of Spain and the Mediterranean Sea on the right side!

A partial map with pressure lines on it. Number's are hard to read. At the bottom, there's today's date, and a copyright note by the Deutscher Wetterdienst.

33: Decode images from a weather satellite!

  • Frequency: 137.62, 137.9125, and 137.1 MHz

I couldn’t stop trying to capture a weather satellite, it’s just too cool to receive an image from space!

That evening, an American satellite called NOAA-15 passed right over us, so I thought I’d try again. And this time, I got parts of an image! \o/

This is real-time data! At night, both transmitted images are infrared recordings.

I recorded the FM signal using SDR++, and then decoded the image using noaa-apt, which also added country outlines.

Grayscale map of Europe, with several very noisy parts. Border lines are drawn on top. You can see a cloud cover on Italy.

34: Estimate the speed of satellites

  • Frequency: 136-138 MHz

Here’s what the NOAA-15 weather satellite sounds like, by the way! tick-tock

While recording, I noticed something strange: The transmission didn’t happen at the frequency I had expected it to! And also, the frequency changed.

Then it hit me: Doppler effect! At the time of the recording, the frequency was around 4250 Hz higher than expected.

After looking up the formula, I calculated a relative speed of 9 km/s! (Which got close to its real speed, 7.5 km/s.)

35: Listen to number stations

  • Frequency: 5-30 MHz?
  • Modulation: Differs by station

These stations send encrypted messages using number sequences, possibly for espionage purposes!

So why not listen to one? There’s a surprisingly well-maintained database of them on a site call Priyom.

So I tuned into the next frequency that was listed, and: Bingo!

Allegedly, this was a station in Moscow. That day, it sent “218, 218, 218” in a loop, followed by three long beeps, which is the format of a “null message”.

So no news for the Russian spies.


The week was really intense for me. Initially, I thought I’d do 10 things per day, but it turned out that that was too much. I had to learn so many new things.

Many things I tried don’t work on my first attempt. Finding LoRaWAN signals, decoding packet radio, finding something on PMR446, decoding the satellite – those were all things that required a second (or third) attempt.

This project was exhausting, but also joyful – having committed to it, I got in a nice flow state, where I could focus on it for hours.

Often, I thought: “Okay, this is it. I can’t possibly find more things.” But this is the power of the 50 Things technique: I have to keep looking, leave my comfort zone, be creative, try things I otherwise wouldn’t have tried!

So, 15 more things, huh?

36: Receive images from amateur radio operators

  • Frequency: 14.230, 14.233, 21.340, 28.680, 145.625 MHz seem to be popular

Using a protocol called “SSTV” (slow-scan television), amateur radio operators send each other postcards! :D

I’ve been browsing the usual frequencies, and tried to decode images using the software QSSTV on Linux. And I accidentally caught a piece of what seems to be a test image!

SSTV has the prettiest noise! :3

Colorful TV test image at the top, colorful noise at the bottom.

37: Listen to The Buzzer

  • Frequency: 4625 kHz
  • Modulation: Upper side band

There’s a mysterious Russian station broadcasting at 4625 kHz. Sometimes, it sends encrypted voice messages.

But usually, all it does is send a honking sound every two seconds, to deter other stations from using the same frequency.

The purpose of the station is unclear, but most theories think it’s military communication.

38: Catch a LoRaWAN chirp

  • Frequency: 868.1-868.5 MHz

This was a bit like trying to catch a rare insect! 🐛

LoRaWAN is a low-power, wide-area networking protocol, intended for “Internet of Things” applications.

You can see transmission in the lower half of the screenshot! It has a very cute structure: You can see eight “down-chirps”, followed by two “up-chirps”. That’s the header, followed by the payload.

To look for the signal, I made a “baseband capture” in SDR++, and opened the recording in Sonic Visualizer.

A spectrogram, displaying a signal consisting of diagonal lines.

39: Read data from utility meters

  • Frequency: 868.95 MHz

Devices like smoke detectors or meters for water or heat are sending their readings via a protocol called Wireless M-Bus.

Again, I was surprised by how many devices seem to be around! Thanks for the tip, @envy :)

wmbusmeters is a really nice tool for decoding the messages.

A log of transmissions found, and a decoded message that gives room and radiator temperature.

40: “Watch” TV

  • Frequency: 174-786 MHz

The chips in my SDR stick are also being used in DVB-T dongles! So, can we watch TV? Unfortunately, no.

From what I pieced together, there’s a difference between using the stick in SDR mode (where it sends the full spectrum), and in TV mode (where it sends the decoded video).

In Germany, there’s now DVB-T2, which my hardware doesn’t support in TV mode. And in SDR mode, the bandwidth is too narrow for DVB-T2. But we can scroll over a channel and look at it! :3

41: Track cars and buses

  • Frequency: 433.05-434.79 MHz

Did a little walk to a big intersection, to see what “device signals” I’d find there at 433 MHz.

I could confirm that the IBIS beacons are in fact being sent by buses! The included “vehicle ID” even matches the white number that’s printed on it.

I also saw some messages from tire pressure monitoring systems in cars! They also include an ID, and usually, the brand of the car! The owners probably aren’t aware how easy it would be to track them… (Thanks, @scy!)

A bus on an intersection. There's a white number printed on it at the front.

Side note: I wonder why some signals in that band are warped like the one at 433.96 MHz here!

At first, I thought “Ah, Doppler effect again, it’s coming from a moving car!” But if that’d be the case, that car would be moving at over 700 m/s…

One signal has a little frequency warp to it.

Friends later suspected that this effect is due to weak batteries affecting the crystal in the sending devices, or temperature changes.

42: Receive Morse code from a satellite!

  • Frequency: 145.860 (status information) and 145.960 (beacon)
  • Modulation: CW

So I caught a satellite again! :D This time, it was school project, the Italian satellite “Max Valier”. It continuously sends Morse code on a beacon frequency.

Pretty weak signal, but here’s what I could hear:


Super happy about this! I got both the name of the satellite, as well as its callsign at the end, and what seems to be some kind of greeting? I later learned that ES is Morse code shorthand for “and”, and that Manfred and Christa Fuchs were the founders of a company that helped launch the satellite!

(Thanks for the tip, @manawyrm!)

Faint Morse code in a waterfall diagram.

43: Receive emergency service pagers

This is another thing that’s not allowed in Germany, so you shouldn’t do it.

Pagers use a format called “POCSAG” (Post Office Code Standardisation Advisory Group…), which you should not decode using multimon-ng.

Because you would find that the content is short and cryptic anyway. It would probably be repeated by several stations all around you, to make sure the whole region is covered.

Do not read the English Wikipedia page! It contains frequencies!


At this point, I was pretty tired. Focusing on this project for 6 days straight took a lot of energy, and I was always uncertain if I could actually complete all 50 things in that week! But I woke up with a fun idea:

44: Detect when a smartphone is turned on

  • Frequency: 13.56 MHz

I was curious whether I could see the NFC transceiver in my smartphone! And yeah, especially using my random wire antenna, this works really well!

My smartphone seems to emit at the NFC frequency a couple of times per second. And when unlocking the screen, it emits five very strong beeps on that frequency! I can see those from the other side of our apartment.

Surely, these signals are the same for every device, right? 😶

Observe the five beeps here:

45: Communicate wirelessly using… a book

  • Frequency: 13.56 MHz

Piko and I played around with NFC a bit more, and we found out that when getting close to an NFC tag, a smartphone emits at 13.56 MHz continuously!

So, we started sending Morse code to each other between rooms, using a smartphone and a library book! :’D

Take that, Bundesnetzagentur!

Seems that the shortest signal you can create is 0.7 s long, resulting in a meager communication speed of 3-4 words per minute…

Morse code signs in a waterfall diagram.

46: Receive navigational aids for airplanes

  • Frequency: 108.00-117.95 MHz

There are ground stations that emit a signal that allow calculating your angle relative to it! If you receive two, you can determine your position. (Thanks, @fly_it!)

I heard the one close to Hamburg! And SDRangel has a decoder, of course! It calculated angles between 210° and 230°, which is pretty close to the actual value of 224°! I don’t think they are meant to be used from the ground.

The neat navigational map is from!

View of SDRangel, it decodes the signal in the lower left, and shows 229°!

An aeronautic navigational chart.

A map where I show that the real angle is 224 degrees.

I spent ages trying to build my own decoder in GNU Radio. But I wasn’t familiar with it at all, and I eventually gave up. Still, that seems to be the software you wanna learn for tasks like these!

All screenshots show experiments I did in GNU Radio and Audacity.

By the way, how the ground stations work is fascinating: In my case, it’s a “Doppler VOR”: It transmits a static frequency via amplitude modulation, and adds another signal that moves around in circles, so you get a Doppler frequency shift.

If you compare the two, you can calculate the angle!

47: See how low you can go in the frequency spectrum

  • Modulation: mostly AM

This was a fun exploration: What’s the lowest-frequency broadcast I can receive?

The RTL-SDR Blog V4 stick I’m using has a neat feature – a built-in “upconverter”, which is enabled automatically when you try to listen to frequencies below what the chipset supports. This allows it to receive down to ~500 kHz!

The first stations that are comprehensible started at 1 MHz for me.

48: See how high you can go in the frequency spectrum

The chipset in my SDR stick go up to maximum frequency of 1766 MHz. It seems pretty quiet up there, probably because I lack proper antennas. I found these three lines in an amateur band, but they probably originate from the stick itself, or another device.

So the highest-frequency thing I’ve received is ADS-B at 1090 MHz (see entry #5)! 🎉

Three lines at around 1296 MHz.

49: Listen to marine radio

We’ve been over this. Not allowed in Germany. Don’t do it. ⛔

But if you’re in the US, anyone can purchase a marine radio, and even use it to transmit! :D

50: Go mobile!

Just now, I was wondering whether there are any Android apps for controlling SDRs.

And it turned out, the software I liked best that week, SDR++, had an Android version since a couple of weeks! \o/

So now I could go track down the source of some of these strange signals! :3

Me, a red-haired, red-bearded white human, hold a smartphone, connected to a Framework module, connected to my SDR stick, connected to an antenna! I look happy and tired.

Looking back

And with that, … 🥁 … I was officially done with my “50 things to do with a software defined radio”! 🎉

This were seven very intense days, where I learned a lot of new things about radio waves and the many things they can be used for!

I was proud! I was tired! I was amazed that all those things I received are all around us, everywhere, all at once – if you know where to look. :O

More things to explore

Here’s some things that I haven’t tried or that haven’t worked:

  • Receiving digital voice modes (SDRangel should be able to do it, but I couldn’t figure it out)
  • Receive something from the ISS
  • Use the GRAVES radar to detect meteors (couldn’t detect it)
  • Receive videos on ham bands
  • Receive Iridium satellites
  • Listen to pirate stations
  • Receive Cubesat

Also, doing things with Wi-Fi/Bluetooth/Zigbee could be fun, but I’d need a more expensive receiver for those frequencies.

Future thoughts

So, was this project in fact a gateway drug to getting an amateur radio license?

Yeah, probably. I’d love to transmit something and experiment more! :D

In Germany, a new license class will be introduced in summer 2024, that’ll allow you to send on the 10-meter, 2-meter and 70-cm bands (the “N class”).

In fact, there’s a really good German online course that teaches you everything you need to know:

Highly recommended, even if you’re not planning on getting a license.

Finally, thanks to Piko, Chris, and Cqoicebordel for proof-reading this blog post! <3

Why you might want a personal wiki wiki-talk 2023-09-02T00:00:00+00:00 blinry At the MRMCD 2023, I gave a talk about my personal wiki, which I’ve been using for 12 years now! My wiki consists only of a folder with text files inside, and a simple Vim plugin, but it has since become a central part of my life and ultimately the secret to my productivity!

In the talk, I explain how my wiki works, what I use it for, and encourage you to build one too! Here’s the (German) recording:

You can also open the slides!

Mücken Open Air muecken-open-air 2023-08-24T00:00:00+00:00 blinry Made after a lot of mosquito bites at the Hacken Open Air camp…

The SVG source is available, if you want to repurpose this design for something! The font is Geo.

Haptic compass belt 🧭 compass-belt 2023-08-04T00:00:00+00:00 blinry I’ve always wanted to build a compass belt! The idea is to attach a couple of vibration motors to a belt, use a compass sensor to find north, and then to let the motor that points north vibrate!

Wearing such a device seems to give some people a new sense of direction, so I was super curious to try it!

In this post, I want to document how I built one, hoping to give other people who want to build one in the future a head start! My design is cheap (the parts cost around 15 EUR) and has a straightforward design.

Overall design

The simplest implementation I could think of was to use a microcontroller to control the vibration motors, and then connect it to a smartphone via USB, to receive commands.

This means that we don’t an extra magnetic sensor, and no battery pack, because we can use the smartphone as a power supply. This is the finished compass belt in its current form:



I found this belt at a clothing store a couple of weeks ago, and immediately thought that it might be a neat basis for this project! Any belt with double rows of eyelets all the way along the belt should work. If you don’t find such a belt, you’d need another way to mount the motors, and to route the cables.


I used coin vibration motors with a diameter of 10 mm, a nominal voltage of 3 V, and a nominal current of 70 mA. These “closed” motors have the advantage that they don’t have external moving parts you need to look out for.


The electronics of the belt are based on a Raspberry Pi Pico, a tiny, cheap microcontroller with lots of output pins.

It’s not a good idea to attach the motors to the output pins of the Pico directly, as they are not designed to provide enough current.

So I asked around a bit, and Kenneth and Electronic Eel suggested using a transistor array chip called the ULN2803a (which is similar to the ULN2008A, but has 8 input and output pins). The ULN can be used to connect and disconnect the motors to the ground on demand. They also already contain a “flyback diode”, which will prevent the transistors from being damaged when the motors wind down.

Electronic Eel also helped me with finding suitable capacitors: One 100 nF capacitor acting as a bypass capacitor per ULN, and a bigger one (I used 220 µF) for stabilizing the voltage of the Pico itself.

I used the software Fritzing to design this circuit:

Fritzing also allowed me to translated the circuit into a design for stripboards, which gave me a much more stable result, compared to a solderless breadboard:

You can find the Fritzing file for both designs here:

This was the first time I used a stripboard, and overall, it was a good experience! :) I was super anxious when putting it together, because it seemed easy to make mistakes, but in the end, it worked flawlessly on the first try!

Motor clip

To attach the vibration motors to the belt, I designed parts which would house the motors and their thin cables, and clip to two of the belt’s eyelets. I used the Python library CadQuery to model this part in a parametric way. Quite neat!

I then printed one clip for each motor on a 3D printer.

I published the source code for the motor clips here:


Firmware running on the belt

The Picos can be programmed using MicroPython or CircuitPython. Both would work for my prototype, but I picked MicroPython to be able to use the Picos’ Bluetooth features at a later point. To communicate with the attached Android phone, it suffices to use Python’s input() function, which will read text from the Serial connection via USB.

The firmware is pretty simple: It reads numbers between 0 and 1 from the serial connection via the USB cable connected to the Android phone, and then activates the matching motor. 0 means “at the front of the human”, 0.25 is right, 0.5 is back, 0.75 is left. Essentially, the angle is a clockwise “factor of tau”.

The MicroPython code has a list of motor positions and pin assignments baked in – if you want to use it with our belt, you have to modify the array at the top:

I copied the firmware to the Pico using the following Linux command. Naming it on the controller makes it auto-start this program after booting:

ampy -p /dev/ttyACM0 put

To test the firmware with my computer, I connected to it using this command (but other serial terminal emulators like picocom or minicom would also work):

python -m ACM0 115200

Android app

To send serial data over USB with Android, I originally envisioned a simple solution like “write a bash script and run it on Termux”. There is a termux-usb command which passes a file descriptur under which the USB device can be accessed to another program, and with a bit of work (like started by Querela), it seems possible to write software which uses this to write serial data. But I couldn’t get Querela’s code to work.

For testing purposes, I was already using Kai’s Simple USB Terminal, and I was delighted to find that Kai published a simplified open-source version of it, published under the MIT license.

So I forked it, and added a bit of code to the SerialService class, which permamently calculates the desired vibration angle (currently assuming the device is held upright in front of the person), and sends it to the board.

This seemed like the fastest way to get the job done. With more time, it’d be nice to write a cleaner app with additional features (like allowing the user to enter a GPS coordinate to guide them to). But because this was a weekly project, I needed something fast.

You can find my modified app here:

My experiences

I’ve just built the belt this week, and taken a short walk with it, so I don’t have tons of experiences to share.

But I’m surprised by how strongly the vibration can be felt through the belt!

Also, I thought I might attach 16 motors to the belt – but I don’t think I could differentiate between them. The current 8 seem enough.

Here’s some things I’d try next:

  • Extending the app to guide me to a certain GPS coordinate.
  • Changing the calculation so that I can put the smartphon in my pocket (at a fixed, known angle?), instead of having to hold it in front of me.
  • Later, maybe experimenting with an on-board magnetic sensor, so that I can twist the attached smartphone however I want?
  • And it’d be great to get rid of the USB cable. If I attach a small battery to the Pico, I could probably communicate over Bluetooth.

Running my first marathon first-marathon 2023-05-07T00:00:00+00:00 blinry In the spring of 2023, I ran my first marathon, the Hamburg Marathon! 🏃

This is the story of how I got there: how I started running in 2020, to how I ran 42 km (26 miles) three years later.

How I got started

When the Coronavirus pandemic hit in 2020, I was feeling restless and anxious, and was looking for an outlet.

Running seemed like an good choice. I didn’t need a lot of equipment, and could do it outdoors. I found the Couch To 5K running program, that’s designed to gently guide people towards running 5 kilometers. In the first week, you run only for 60 seconds, followed by 90 seconds of walking. In the eight weeks after that, the time you run is gradually increased.

My favorite overview is Tom Benninger’s visual overview of the program:

I remember that initially, the 60 seconds of running were pretty exhausting! That’s because I was running way too fast. When I slowed down, the program seemed more manageable, and after nine weeks, I ran 5 kilometers without stopping for the first time! It took me 42 minutes! I was mighty proud! :)

I used a smartphone app that would keep track of the walk/run rhythm for me, I think it was this one. It worked pretty well for me.

After that, I just kept running 3 times a week, because I just… intrinsically enjoyed it a lot! I got fresh air and sun, and moving outside through nature is just really nice! For the first time since a long time, I paid a lot of attention to the changing seasons! I saw the first flowers in spring, and mushrooms in autumn. A site that’s helpful for figuring out nice routes is Strava’s Global Heatmap.

I reached a number of other milestones:

Running 5K in under 30 minutes

I sometimes tracked the time I needed to run 5 km, and noticed that I got faster! In October of that year, I ran that distance in under 30 minutes (with a pace of under 6 min/km):

Running 10K

One advice I found was that for running faster, you’d need to run longer distances. It seemed safe to increase the distance by 10% each week, so I did just that! I’d run 5 km two times a week, and for the third run, I’d gradually increase the distance. In June, I ran 10 km in 01:19:00!

Running a half marathon

I wanted to keep increasing distances! A marathon seemed like a huge goal, though.

In June 2021, I started seriously considered training for one, but thought that a half marathon would be a more suitable first step. In Braunschweig, where I lived at the time, there would be a small combined marathon/half marathon race at the end of October 2021.

I found a really in-depth comparison of marathon training plans, and one of the most beginner-friendly ones was Jeff Galloway’s training plan! I made a big spreadsheet with the required distances. Again, the rhythm would be to run 5 km (or 30 minutes) two times a week, and then do a “long run” as the third run.

I’d run along the “Ringgleis” in Braunschweig, a circular green track around the city, which has almost exactly the length of a half marathon. It was a nice feeling to know that eventually, I would be able run completely around it! But for shorter distances, I ran half of the distance in one direction, and the then back.

My training went pretty smoothly, and I completed the race without much trouble:

Training for the Frankfurt Marathon

In the summer of 2022, I was at a decision point for whether I wanted to train for a full marathon or not. I calculated that training for it using Jeff Galloway’s training schedule would require me to run a total distance of around 450 km. With a pace of 7 min/km, I’d need to run for around 50 hours in total. I thought that sounded okay!

So I made a training plan, which would end in November 2022 with the Frankfurt Marathon!

Well, turns out I hated running in summer. :/ On some days, it was so hot that I was afraid to get a heat stroke, and I just walked some distance. I sweated a lot.

And in addition, a surgery took me out of my training for two weeks, and I realized that I wouldn’t be able to follow my schedule in September.

Training for the Hamburg Marathon

So I picked another goal: The Hamburg Marathon, in April 2023! Again, following Jeff Galloway’s training plan, I started training in December, and for motivation, actually signed up for it officially this time (which cost about 100 EUR). This gave me a lot of motivation!

One thing that was great about training for a spring marathon was the cold temperatures in winter! I ran 5 kilometers every Monday and Wednesday, and did a “long run” on Fridays, with gradually increasing distances.

Following this went rather well, except for a two-week break I had to take in March due to unrelated heath reasons. The next long run after the break was supposed to be 35 km. Usually, runs would be exhausting, but would go smoothly. This time, after 30 km, my knees started to hurt so badly that I stopped running and walked the rest of the distance. This left me a bit anxious, because I didn’t know whether or now I would be able to run the marathon distance of 42 km three weeks later!

The day before the race

I was on a calorie deficit diet in the weeks before the marathon, but the day before the race, I decided to pause it, and just eat whatever I wanted. Among runners, “carb loading” is a technique to increase glycogen stores in the body in preparation for the race. I don’t know much about how this worked, but getting a lot of energy seemed like a good idea.

It was an interesting feeling to allow myself to eat until I didn’t want to eat more. After months of dieting, I very rarely got that sensation.

Also on the day before the race, I went to fetch my starting number. Close to where the marathon would start, the organizers had set up a “marathon expo”, where other cities advertised their marathons, and companies advertised their clothing products.

I showed my national ID card and my registration, and was handed a big red bag, which contained a booklet with all important info, a map of the race track, deodorant, protein bars, and most importantly: the starting number! It’s a big piece of thick paper, with my name and my racing number. Glued at the back, there’s a passive electronic chip, which is used to track me during the race.

There was also a stand where you could get official running shirts, if you had ordered one. I hadn’t, but I found a shirt from last year – red, with the marathon route on the front, and with 42 tally marks on the back (as a reference to the marathon distance). I’m proud to wear it! I fixed the starting number to the shirt with four safety pins.

This Saturday there was another event: the “Long Museum Night” in Hamburg, and I explored a museum about food additives, and an astronomical observatory, and arrived back home pretty late. I packed the bag with fresh clothing and my running clothes.

I slept really badly this night, rolling around in bed and wondering whether I had forgotten anything…

Morning of the race day

I woke up before my alarm at 7:30, ate a slice of bread and a protein shake.

I grabbed my bag, and, together with Piko, took a subway to the start of the track! Wow, there were a lot of people! In the starting area, the organizers had installed a big sound system, and an announcer entertained the crowd with fun facts about the race. I wasn’t really focused enough to listen.

We found the entrance for runners, and hugged goodbye. I followed signs to a big hall inside of the conference center where you could change into your sports clothes. During winter, I had trained mostly in jeans and a warm fleece jacket. But on the race day, the weather report said it would get warm enough to run in a sport shorts, and my new red shirt!

I was also wearing the running shoes I had gotten after my half marathon 1.5 years ago, a running belt with a zipper pocket borrowed from Piko, and put my smartphone and a chocolate bar in it. I put on a bone conduction headphones, to listen to podcasts while running, and an Android watch to track my pulse and have an easy way to assess my speed.

Important preparation: Putting bandaids on my nipples! On long runs, this prevents chafing, which can hurt a lot. And as another precaution, I rubbed some vaseline on the place where my thighs would rub against each other, to reduce friction. Another runner approached me: “Hi, um, this is a bit awkward… but could we have some of your vaseline? We forgot it!” She pointed at her friend. “Sure, happy to help!”, I said, handing it over.

After changing, I put all things I wouldn’t need on the run in my red bag, and handed it in at the back of the hall. Teenagers were tasked with watching over them. My bag had the same number on it as my race number on my shirt.

I followed signs to my starting block. When signing up, you could specify your guess on how long it would take you to run the full course. My guess, 4 hours, had been a bit optimistic, and I knew it when I got in line: I was more likely to take around 5 hours, which I knew from the speed of my long runs. But this put me approximately in the middle of the field, which I was happy with.

The organizers had tasked several “pacers” to help people keep track of their current timing: these are people wearing signs announcing the time they’d take to reach the finish line: “4:00”, “4:15”, and so on.

It was a chilly morning, but according to the weather report, it would get sunnier and warmer later. Some people wrapped themselves in emergency blankets to stay warm.

When I reached my starting block, there were only 10 minutes or so left before the race would start! The announcer made some jokes, and instructed us to do a wave from the front to the back. Finally, there was a short countdown, a bang, and the race had started!

The beginning of the race

The runners at the front were first to start, but they were so far away that I couldn’t see them. It took a few minutes until we could start walking, then jogging slowly, then running over the starting line! Piko had texted me that they would sit in the first spectator’s stands at the right, I spotted them and waved excitedly, happy to have them cheering for me!

A passive chip at the back of the starting number was used to track the time. At multiple places along the track, there were rubber mats, making beeping noises as people ran over them. They would be used later to calculate the official finishing time.

The course was marked with a dashed blue line, which I had already seen being painted all over the city in the weeks prior to the race. At first, it was barely visible among the running crowd, but it would be my guide for the next few hours.

During the race


The 42 km of the marathon route started and ended at the Hamburg TV tower. It went alongside the Elbe and the harbour, and around the inner and outer Alster, which are artificial lakes in the center of the city. It then surrounded a big park, and went back to the TV tower.

In addition to the blue dashed line, which marked the officially measured marathon course, there were also markings on the ground for every kilometer. Sometimes, I saw signs alongside the street making those kilometer markings more visible. And especially every 10 kilometers, there were big, very visible signs, together with electronic mats for timekeeping.


For the first couple of kilometers, the running crowd was so dense that it needed some navigating around others. I knew that I’d need to let myself fall back a bit – it’s a common mistake to start out too fast. But for the first 10 km or so, I was surprised how much everyone pulled me with them. According to my tracking, I ran a speed of around 6 minutes per kilometer for the first 15 kilometers, with kilometer number 10 being my fastest one, with a pace of exactly 6’00”!

I took a pee break at kilometer 15, there were portable toilets all along the track. After this, I slowed down a bit, to a pace of 6’30”. As I’ll talk about later, I sped up quite a bit in the end again! :)

The pacers with the “4:15”, “4:30” and “4:45” signs slowly passed me during the course of the track, often followed by a rather big crowd, who wanted to stick to that time!


The crowd alongside the race track was amazing! So many people were there to cheer on the runners!

Some held up signs. My favorite one simply read: “Remember: You paid for this!” Another good one: “The pain will pass, but the pride will stay!”

Multiple people had cardboard signs with a painted-on Super Mario mushroom on it, with a text like “Touch for power up!”. I touched at least three of those, thankful for the support.

Many people cheered when runners passed them by, and because everyone had the sign with their first name fixed to their shirt, people in the crowd could actually call the runner’s names! A couple of times, people actually dared to pronounce my name and shouted “Yay, blinry!!”, which was a great feeling! :D

A lot of children stretched out there hands, inviting high fives, which also felt like a nice, encouraging interaction. One child handed out flowers, but I was too slow to react to it. Others kindly handed out cups of water, or small salt pretzels! And one even offered sunglasses to people: “Look, they even have baseball caps attached to them!”

There also were music performances, like drumming bands. The music definitely pushed me forward, but I also had to pause my podcasts in those sections… At the beginning of the race, someone on the third floor of a building had put their speaker system next to their windows, filling the street with music.


Taking enough food had been a problem during my training. Sometimes, I had stopped at a gas station to get something to drink or a snack half-way. During this run, there were a lot of food and drink stations. I think the first food station was after 10 km, and repeated every 5 km after that. There were banana pieces, and later, energy gels. I didn’t enjoy their taste, but I knew that they would be an ideal source of energy, so I ate at least 5 of those, as well.

There were also drinking stations, which always provided water in plastic cups, often isotonic drinks, and sometimes cola or energy drinks. I often used these to take a walking break, to drink my cup or eat my banana, happy to be able to give my legs some rest. A hundred meters after those drinking stations, there were big garbage cans, it was fun to aim at them and throw the cups! Nevertheless, hundreds of plastic cups also littered the ground around these stations, and made spectacular noises when people ran over them.

I saw a lot of runners who brought their own energy gels, and put a couple of them in their belt. Another option was to hand in your own snacks and drinks the day before, the organizers would then put them on special tables along the track.


So… how did my body feel during the 42 km of running?

One thing I was afraid of was knee pain. During my training, when I was supposed to run 35 km, after 30 km, my knees hurt so badly that I had to stop running, and walked the rest of the distance. This was maybe overly cautious, but it was a few weeks before the race, and I didn’t want to risk an injury. This time, I felt even more “locked in”, determined to finish the distance. It would’ve been okay for me if that included some walking in the end, but also, it would’ve sucked a bit. Luckily, my knees never became a problem on the race day. I paid a bit of attention to them, and sometimes they would sting a bit, but the pain didn’t last – maybe the adrenaline rush during the race also prevented me from feeling that a lot.

The thing that did start hurting after a couple of kilometers were my shoulders, surprisingly! With my arms swinging below them, maybe they got an unusual amount of force.

After the first half (21 km), my legs definitely hurt, and were feeling heavy. My body wanted to stop running. I felt similar to how I felt after my half marathon. But the crowd and the commitment kept me going. Especially in the second half, time seemed to pass more slowly. The kilometers felt really long, and I was happy about every food or drink station, where I allowed myself to walk for a few minutes. Starting to run again after those breaks didn’t feel great, but I had enough motivation.

Other runners

In addition to people who ran the full marathon, there were also people running a half marathon, who took a shortcut after going around the outer Alster.

And also, it was possible to run the 42 km distance as a team, as relay runners. The track was divided into four segments, and after each segment, there was a special “pit stop” for the runners, where they could pass on the task of running to the next person! Close before the finish line, there was such a section where all people in the team could then cross the finish line together. I hadn’t heard of this system before, but it sure sounds like a nice way to run a marathon!

When new relay runners came in, they would often be faster than the rest of the crowd, and would surpass us. Fortunately, they had signs on their back telling others about their special role, so people wouldn’t be too disappointed to be surpassed.

Some people ran in a costume! For example, I saw someone dressed as a chimney sweep, one as Scrooge McDuck, and one as a water carrier, carrying two buckets on their shoulders. According to the print on their shirt, they had been running the Hamburg marathon for 20 years in a row or so, and had completed over one hundred different marathons! Wow!

Some people seemed like they were dressed way too hot, with a warm jacket. And some were even still carrying their red cloth bag.

Last kilometers

Along the course, there were several first aid stations, especially alongside the last kilometers. I saw one person lying on a stretcher, close before the finish line. :/ Another person lay next to the track, with a infusion bottle connected to their body. Maybe they drank to little? Medics were observing them, and seemed in a good mood.

Knowing that these first aid stations were there was a big relief for me. I knew that, in the event that I would hurt myself, I would be able to get fast help.

There were also two stations where you could get a massage along the last few kilometers! I briefly considered using their services; it would’ve been a fun experience, and would probably have felt good! But as I was approaching the finish line, I didn’t want to spend too much time there.

I had brought a chocolate bar, and had eaten half of it after the first 21 km. To motivate myself, I made an agreement with myself that I would eat the rest when there were only 5 km left to go! This turned out to be a huge motivation! :D When the last 5 km rolled around, I happily gobbled it up, yum!

As I said, the last half of the race was especially tiresome. But when the track led us back into the city center after kilometer 31, there suddenly were a lot more people cheering us on, that was also a really nice motivation!

In the last 5 kilometers, I saw many people talking long walking breaks. And to be honest, it felt good to surpass them!

The professional runners at the beginning of the field finished the course in just over 2 hours, which I think is pretty amazing! They must’ve ran with an average speed of over 20 km/h!

Bernard Koech, a Kenian runner, ran the fastest time, with 02:04:09! For comparison, the official world record, as recognized by World Athletics (the international governing body for athletics), is 2:01:09, set by Eliud Kipchoge at the Berlin Marathon 2022! Here’s the “top 10” places of my marathon:

The website said that the finish line would be closed after 6 hours, and I was confident that I would make that, even if I’d need to walk at the end of the race.

My mindset for this run was that I wouldn’t care about my finish time at all, I was just aiming at making it the full distance. But at the end of the run, when it was only 5 more kilometers, and I already saw the TV tower where I knew would be the finish line, I got a bit ambitious! :D Looking at my watch, I realized that I could make it in under 5 hours, if I kept running at the pace in which I had trained. In my recording, you can see that I indeed sped up a bit when I realized that. I skipped the last water station, and just kept running. At the last water station, there were people with a water hose, offering to spray the water on people, which I definitely made use of!

The last stretch was coming up, covered with a red carpet. And there already was the finish line! I threw my arms in the air triumphantly. The electronic mat beeped one more time, and I slowed down to a walk. After running such a big distance, it felt wrong to stand still, my legs just wanted to keep walking!

I made it 04:56:51!

Behind the finish line

Very close after the finish line, there were people handing out silver medals! As they put the band over my head, they remarked: “Well, someone’s looking super happy!” I was! :D I snapped this picture:

Walking further into one hall of the conference center, there was a big buffet with pieces of fruit, and chocolate cookies! I snatched a few cookies, but I wasn’t very hungry. They also served alcohol-free beer, which I happily gulped down.

The sun had come out in the last hours of the race, and I had a bit of sunburn in my face.

I got back my red bag, and took a cold shower. At this point, I could only limp, and I observed many others doing the same. I had my name and finishing time engraved into my medal. The organizers also offered massages in the finish area, but when I went there after showering, they told me that, unfortunately, they had already closed. Piko would give me an extensive leg massage later at home, which felt great!

The days after the race

So… how painful were the next few days? Would I ever walk normally again? Well, going down flights of stairs sucked in the first two days. I had to brace myself on the railing to take some weight off my legs.

But I’d been worse, after some of the long runs in my training! After 4 days, my legs were almost back to normal, and on the fifth day after the race, I was back to running in the morning (albeit carefully).

A friend asked after the marathon if I was now sick and tired of running, or if I wanted more of it. To my own surprise, I was already looking forward to doing this again! There’s the Frankfurt Marathon in autumn, for example…


Blinry Container Standard containers 2023-04-21T00:00:00+00:00 blinry Kitchen Organization Group blinry blinry-quest for Comments: 1 April 2023 Category: Standards Track Blinry Container Standard version 1.0 Status of This Memo This document specifies a standard for the Home Cooking community, and requests discussion and suggestions for improvements. Distribution of this memo is unlimited. Abstract This document describes a system for storing kitchen ingredients. The containers allow versatile stacking, are translucent and have a single lid size. They can be put in the dishwasher, the microwave, and the freezer. The containers are readily and cheaply accessible. Labelling is done in a uniform and highly visible way.

Table of Contents

   1. Introduction ................................................... 2
      1.1. Purpose ................................................... 2
      1.2. Range of application ...................................... 2
      1.3. Intended audience ......................................... 3
      1.4. Compliance ................................................ 3
   2. Containers ..................................................... 3
      2.1. Material .................................................. 4
      2.2. Shape ..................................................... 4
   3. Labelling ...................................................... 4
   4. Usage .......................................................... 5
      4.1. Initial adoption .......................................... 5
      4.2. Supply of empty containers ................................ 5
      4.3. Physical layout ........................................... 5
   5. Security Considerations ........................................ 6
   6. Suppliers ...................................................... 6
   7. References ..................................................... 6
   8. Acknowledgements ............................................... 7
   9. Author's Address ............................................... 7

blinry                      Standards Track                     [Page 2]

BFC 1                  Blinry Container Standard              April 2023

1. Introduction

   1.1. Purpose

      The purpose of this specification is to define a system for
      storing cooking ingredients that:

          * Provides home cooks with a good overview of their available
            ingredients, in an elegant and minimalist way;

          * Is affordable, and can be implemented quickly;

          * Uses shelf and appliance space efficiently and flexibly, due
            to stackability and lid-compatability;

          * Is suitable for the large temperature range required for
            storing and preparing ingredients in a kitchen;

          * Allows different implementors to easily exchange ingredients
            and prepared meals, and integrating them into their own

      The system is designed to be an alternative to other storage
      standards, like Gastronorm containers [1], which only provide
      big volumes of 1 litres and more, which is not suitable for most
      home applications.

      Other plastic containers are often much less affordable, or not as
      easily stackable.

   1.2. Range of application

      The described system can be used to store all dry, paste-like and
      liquid substances in a kitchen.

          * On the shelves, the containers can store dried legumes,
            flour, sugar, all kinds of spices, pasta, rice, baking
            ingredients, or nuts.

          * In the fridge, they can store leftovers, pre-cooked or
            pre-cut vegetables, condiments, or dough.

          * In the freezer, they can store prepared dishes, vegetables,
            bread, herbs, or ice cubes.

          * During preparation, containers can be put in the microwave,
            or receive boiling water.

blinry                      Standards Track                     [Page 3]

BFC 1                  Blinry Container Standard              April 2023

   1.3. Intended audience

      This specification is intended for home cooks who need to store a
      small to medium amount of ingredients.

   1.4. Compliance

      Unless otherwise indicated below, a compliant home cook must be
      able to accept and integrate any container from other implementors
      that conforms to the specifications presented here; a compliant
      home cook must produce containers that conform to all the
      specifications presented here.

2. Containers

  Containers used in this system are cylindrical, lidded containers
  made from translucent polypropylene.

  2.1. Material

     Polypropylene is a thermoplastic polymer with a combination of
     convenient properties: With a melting point of 160 °C (320 °F), it
     can withstand applications like microwaving, which produces a
     maximum temperature of 100 °C (212 °F), dishwashing, and filling
     directly with boiling water.

     Below 0 °C (32 °F), Polypropylene becomes brittle, and
     occasionally, a container might crack.  But handled with care, this
     seldomly poses a problem.

     Polypropylene withstands acids and bases, and is a good barrier
     against fat.

     Translucency is important for being able to see the containers'
     contents easily.

blinry                      Standards Track                     [Page 4]

BFC 1                  Blinry Container Standard              April 2023

  2.2. Shape

     The most important property of the containers' shape is the lid
     interface, which is the same for all containers: Containers have an
     inner diameter of 110 mm, and an outer diameter of 119 mm.  The
     lids have dimensions that fit the resulting rim.  While in theory,
     commercially available "deli containers" often seem very close to
     each other in dimension, care has to be taken to make sure that
     they are, in fact, lid-compatible.  It can be wise to pick a single
     manufacturer, and stick to their products.  Recommendations are
     listed in section 6.

     The lids have an outer rim that secures containers that are stacked
     on them from sliding off to the sides.

     The containers are cylindrical, and taper towards the bottom, to
     fit the lid of the container underneath.

     While the lid diameter of all containers is the same, they come in
     different heights, ranging from 145 mm to 44 mm, resulting in
     volumes between 250 and 1000 mL (8 to 32 fl oz).

3. Labelling

    In the absence of other packaging, most containers should be
    labelled, to identify their contents.  Exceptions can be made when
    the content is clearly and unmistakably recognizable (as is the case
    for walnuts or pasta).  But especially for white powders (which
    could be salt, sugar, flour, citric acid, or monosodium glutamate),
    labelling is important.

    This specification prescribes using blue tape as labels, which can
    be spotted easily (deep blue is a very uncommon food color).  Using
    painter's tape with a width of 24 mm (0.94 in) is recommended.

    For optimal visibility, a white paint marker should be used for
    writing on the tape.  Recommendations for both products are given in
    section 6.

    Often, writing the name of the stored content is enough, but
    sometimes, adding some crucial preparation detail from the original
    package can be helpful.  Examples include water ratios for cooking

blinry                      Standards Track                     [Page 5]

BFC 1                  Blinry Container Standard              April 2023

4. Usage

   4.1. Initial adoption

      Implementors should screen their existing ingredients first,
      regard their volumes, and thus, estimate how many containers of
      which size are required.  Adding at least 30% to each count is
      recommended to avoid running out of supply later.

      Converting to the containers should be a straightforward and fun
      process.  For ingredients which implementors expect to re-fill
      frequently, it makes sense to pick a container size that will fit
      an entire new package of the ingredient.

      Note that the Blinry Container Specification is highly compatible
      with zero waste shops, which sell ingredients without packaging.

   4.2. Supply of empty containers

      Implementors MUST have an easily accessible stash of empty
      containers available in their kitchen.  Not having that stash will
      lead to sluggish and incomplete adoption of the specification.

      Storing the containers in upside-down stacks is preferred for
      hygienic reasons.  Lids are to be stored in an extra stack.

   4.3. Physical layout

      When distributing the containers in your kitchen, make use of the
      "first-order retrievability" rule: Don't cover container stacks
      with other stacks, because doing so will prevent you from seeing
      all available ingredients at a glance.

      Stacking is highly encouraged to make use of the available space.
      Stacks higher than eight containers have proven to be ineffective.

      As for which algorithm to use to sort the containers, this is a
      highly subjective matter.  We recommend trying one first and
      changing it later on demand:

          * Categories: Group ingredients by type; possible categories
            could be: legumes, baking, spices, nuts.
          * Color: Sort ingredients by color, so that you know where
            white ingredients will be stored, for example.

blinry                      Standards Track                     [Page 6]

BFC 1                  Blinry Container Standard              April 2023

5. Security Considerations

   This speficiation is mostly limited to storing ingredients in a
   stationary environment.  While dry and paste-like ingredients can also
   be transported between homes, the described containers are not
   fully safe for transporting liquids.  While technically, some
   leak-proofness has been observed, in practice, it seems like too much
   of a risk tradeoff to just put salad dressing in the containers and
   throw them in your backpack.  Containers with more sturdy lids or
   bottles with screw-on caps should be preferred for this purpose.

   For ingredients which decay quickly under sunlight (fats and
   preserved products), the containers' translucency can be a problem.
   It is recommended to store those in a dark cupboard.

6. Suppliers

   6.1. Containers

      At the time of publication of this specification (April 2023),
      suitable containers can be found under the name "deli containers"
      for around 0.50 EUR per container.  A reliable brand is Solo's "PP
      Deli Container" [3].

      A good distributor of Solo's products is the company Monouso,
      which has multiple online stores in Europe, and the
      WebstaurantStore in the USA.

   6.2. Markers and tape

      A recommended paint marker is the "edding 780 paint marker" in
      white [4].

      Good blue painter's tape is sold by 3M under the brand name
      "ScotchBlue Painter's Tape (2090)" [5].

7. References

   [2] Jonah Reider's YouTube video: "These Are The Only
   Kitchen Containers You Need"

blinry                      Standards Track                     [Page 7]

BFC 1                  Blinry Container Standard              April 2023

8. Acknowledgements

   The author gratefully acknowledges the work that Jonah Reider [2] has
   done to promote the use of deli containers in home kitchens.  The
   author hopes that providing this document to the Home Cooking
   community will help to promote a style of cooking that's diverse,
   spontaneous, and reduces wasted resources.  Many thanks also for the
   the typo correction that Ithea Piko Nwawa provided as feedback to
   this BFC.

9. Author's Address


   EMail: mail at blinry dot org
How I do Weekly Projects weekly-projects 2023-04-20T00:00:00+00:00 blinry In the beginning of 2023, I was unhappy with my creative output. I’d often spend days on small busywork, and wouldn’t put a lot of time into creating pretty or useful things. I considered that a bug, and wanted to change it. As an artist and self-employed person, I’ve had some opportunities to experiment!

I’ve found a structure that seems to work well for me: come up with small-scope projects (3-5 days), and add accountability mechanisms and deadlines. This helps me do focused, satisfying work. Let me tell you all about it!

Flow in game jams

In 2016, I started participating in game jams, where you make a video game from scratch in 2-3 days. I noticed that these events often would get me in a very nice flow-like state, where I could focus on the game from waking up until going to bed! After the event, I’d often be exhausted, but really happy with what I’d made!

I’m attributing this effect to two things:

  1. Short duration with strict deadline: The game has to be made in two or three days, and then has to be submitted. After that, other participants are invited to play it, rate it, and comment on it.

    Of course, three days is very little time to make something substantial! I usually have more ideas and plans than I have time to implement them. That means that it seems worth it to put in a lot of time and energy during the jam, because I know that it will make the end result better! The short duration also forces me to prioritize what to work on: What’s the most important thing to do right now to make the game better?

  2. Group enery: Knowing that other people are doing the same thing at the same time. It’s just a motivating idea to know that thousands of other people are participating in the same game jam!

    And also, I often participate in a group, and we’ll make a game together with friends! It’s nice to support each other, and it gives everyone a bit of accountability, which makes it easier not to get distracted.

In January 2023, Piko and I participated in a game jam together, and made a puzzle game called Carrot Conundrum. Once again, I was fascinated by how well this worked for me, and how rare this flow feeling was in the rest of my life. I started thinking: Could I reproduce this effect without an actual game jam?

As part of a self-reflection check-in I’m doing with my friend Moritz, I came up with an idea I wanted to try: Doing a one project every week! At the beginning, I set this up as a challenge for myself, as an experiment that would go over four weeks.

Here’s how that worked out:

How I do weekly projects


Moritz kindly offered to keep me accountable for this experiment. This was extremely helpful for me. He would often be curious about which projects I picked, ask questions about it, and remind me to give him progress reports. He was surprised to find that he found it easier to keep me accountable, than to keep himself accountable sometimes!

We agreed on three check-ins I would send him, every Monday, Wednesday and Friday, as described in the following sections:

Monday: Pick a project

I come up with a project idea on Mondays, and commit to it, by describing it to Moritz in a text message before midnight.

Subject: I’ll often brainstorm a bit, or look at my big lists of project ideas. I have a shortlist of project ideas that seem especially suited for doing as a weekly project.

Most of my projects are related to programming or creativity. Examples:

  • Write a short story
  • Make a chiptunes song with Ardour
  • Write your own ActivityPub server
  • Create a 3D model of my room
  • Sew a backpack

Generally, I’d try to follow my curiosity, and emphasize topics I wanted to learn about. In other weeks, there were outside factors which determine my project – if I wanted to submit the finished project to an event, for example.

Scope: The size of the project has to hit a sweet spot between being too easy and being too large, to create a flow state. I try to pick projects which seem challenging, but where I think I’ll be able to complete if if I put in a lot of work.

Prototyping: Sometimes, I’ll quickly prototype one or two ideas, or do some research on them, before I decide. For some project ideas, that allowed me to figure out that they would be too challenging to do in a week. And for others, they immediately seemed like so much fun that I decided to pick them and to just keep going.

Tuesday—Thursday: Work phase

During the week, the project I picked is my default activity during the day.

In the first few weeks, I sometimes worked very long hours into the evening, which didn’t seem sustainable, and often left me exhausted. So now I have the rule that I’m “allowed” to call it a day at 17:00. Still, since I made that rule, I’ve often worked longer, because I enjoyed what I was doing.

For many of my projects, it’s helpful to get feedback from other people. So often, I’ll send the current status of the project to some friends on Thursdays, so that I can still ingetrate their feedback on the next day.

Friday: Release day

Finally, on Friday, I’ll do some sort of “release” of the project. Often, this would mean posting about it in the Fediverse, and making an entry on this homepage about it.

The release day feels a bit nice and celebratory, and I try to keep Friday afternoon free in my calendar for this purpose.

Four projects in four weeks

Initially, I set up the weekly project structure as an experiment for a month. Here’s the projects I picked:

  • Week 1: Finish making a learning game about navigating using the sun, which I called Compass in the Sky! I’d started to work on this project one year earlier, but had never finished or released it. This was an intense week, that reminded me of game jams a lot, and included lots of playtesting.
  • Week 2: Make a chiptunes song. I wanted to learn (again) how to use Ardour, an open-source music-making software. This project forced me to work with all the bugs and annoyances that Ardour has, and come up with something catchy! The result was the song Floppiness.
  • Week 3: “Make something with ActivityPub”. This was not very well-defined, and I think this was a mistake. I spent quite some time brainstorming what I should do. A quick result was the JSON Explorer. I also experimented with making my own ActivityPub server, and it was able to post stuff! A plan I had was to turn my homepage into an ActivityPub actor, so that people could comment on my posts. But on the last day, I realized that it would be much easier to just embed comments from a specified toot, so that’s what I’ve been doing, using a modified version of Patrick’s Toot Embedder.
  • Week 4: Make three audio-visual demos for Lovebyte, a size coding party. This was easy to decide on, because I knew I wanted to participate. This was special because I didn’t release it publicly on Friday, but released the demos at the party! I made a 32-byte demo for TIC-80, a speech synthesizer in 256 bytes, and a crossword puzzle grid thing in 34 bytes!

I liked the experimental month so much that I’ve kept this structure going since then. Whenever I’ve had free weeks, I’ve done weekly projects:

What I like about weekly projects

Variety! I’m easily bored. When I feel I have a good grasp on a topic, I tend to move on. So having the opportunity to pick new projects every week feels wonderful! I often fear comitting on the wrong thing, but because these projets are so short, I don’t have that problem at all.

Having free weekends. Because I release projects on Fridays, and I’ll only decide on the next project on Monday, I can take weekends off. There’s no chance for me to keep working on the project, leading to burnout, because there’s no active project on weekends!

Short feedback cycles. I get some feedback on my projects each week, and can take that into account when picking the next project.

And, of course, it often gets me in a flow state, when the projects have the right degree of challenge, and when I have accountability and a deadline.

And generally, I’m really excited that, using this structure, I could potentially do 52 small projects per year! <3

What’s not great about weekly projects

When I’m working on a new project each week, I seem to neglect maintaining the old ones. For example, for Compass in the Sky, several people reported technical issues on Friday and the weekend after that, but I didn’t take the time to fix those things.

Limited depth: Because I only have 5 days (or around 30 hours) to finish a project, they necessarily have a rather small scope. I won’t write any books that way, or do really deep work. I think that most big projects could be decomposed into smaller weekly projects, and build on each other. But that’s not how I’ve been using this structure so far.

Ideas for the future

I have a couple of modifications of the weekly project structure I’d like to:

  • Doing a project together with someone else!
  • Doing a project in another context, like in the online Recurse Center.
  • It would also be interesting to try to do some two-week projects, and see how that changes the scope and the depth of the projects!

If you have more ideas on how to develop this format, I’d love to hear your thoughts!

Building 15-year-old software with Nix nix-time-travel 2023-04-14T00:00:00+00:00 blinry Several people around me have been talking about Nix lately, and say that it’s cool. And because I trust those people, I decided to learn a bit about it!

What is Nix? Among other things, Nix is an ecosystem of tools that you can use to build software in a reproducible way: Usually, when I try to compile a program, I need to make sure that I have all libraries and other dependencies I need, in the correct versions. With Nix, you can describe exactly which other things a piece of software depends on, and also how to build those.

So I thought: Could we try to build some really old software? Like, for example, Firefox from 15 years ago? :D Let’s try that, and let’s also try to build the graphics programs Blender, Inkscape and GIMP.

What you will get out of this post

This post is written for two audiences: If you’re actually interested in building this old software yourself, and playing around with it, it will show you how to solve some of the problems you’ll encounter.

But also, if you’re just curious about solving computer problems in a more general sense, this post will show you some methods and tools you can use when attempting to fix bugs yourself!

If you just want to try these old software versions yourself, you can use my modified nixpkgs repository (the 2008 branch), which includes all the described changes I made.

Blender 2.45 (from 2008)

First, I tried building an old version of the 3D graphics program Blender!

Where do we get software packaged with Nix? There’s a giant collection of Nix software packages called nixpkgs, living in the Git repository nixpkgs. As I write this, it has 470,000 commits. 😳 And, according to Repology, it bundles over 90,000 software packages!

I cloned the nixpkgs repo, and located the files describing Blender using fd blender (a find-like tool). They’re in pkgs/applications/misc/blender/. Let’s look at the history of that directory:

$ git log .
commit 5bca69ac34e4b9aaa233aef75396830f42b2d3d7
Author: Yury G. Kudryashov <>
Date:   Wed Jan 30 17:20:48 2008 +0000

    Nix-expr style review

    Unneded args.something replaced with
    args: with args;
    line. After this line args is the only place where we can recieve variables from.

    Also removed several
    buildInputs = [];

    svn path=/nixpkgs/trunk/; revision=10415

commit 8779bd423223b47bf523b1feab0d9cfb3c664f9c
Author: Yury G. Kudryashov <>
Date:   Mon Jan 28 19:39:27 2008 +0000

    Removed unneeded cmake dependency for blender

    svn path=/nixpkgs/trunk/; revision=10332

commit 30669073d52466f34ac3aca52a1c26ed1a60c9fd
Author: Marc Weber <>
Date:   Sat Dec 1 18:05:26 2007 +0000

    blender default.nix

    svn path=/nixpkgs/trunk/; revision=9813

Whoa, the log goes back to 2007! Looks like this used to be an SVN repository, but they imported it into Git. Very cool. And the full repo goes back to 2003! Let’s use the 5bca69ac commit as our base, it’s a slighly improved version of the very first Blender package in the nixpkgs. We can check out this commit, change into another directory and try a build.

The following command tells Nix to build the blender package, according to the Nix source code currently located in path/to/nixpkgs:

$ nix-build path/to/nixpkgs -A blender

Problem 1: Couldn’t resolve host ‘’

error: builder for '/nix/store/0ri9g54hbni4x7xrid45a2n195bb6p1i-glibc.tar.bz2.drv' failed with exit code 6;
       last 3 log lines:
       > downloading /nix/store/vkkr1r2gdldn0j9l8vm9csl01mip3ky6-glibc.tar.bz2 from
       > curl: (6) Couldn't resolve host ''

Nix tries to download some source code from a domain that doesn’t exist anymore. It’s the source code of an old version of glibc, the GNU Project’s implementation of the C standard library. Nix needs to build it because Blender depends on Python, Python needs to be built using gcc, and gcc depends on glibc.

The domain might’ve belonged to the computer science department of the University of Utrecht? Yeah, it’s archived in the Wayback Machine:

This page in the NixOS wiki suggests that to resolve the issue with the broken domain, you could replace the references to those URLs with the more modern mirror

For this project, the only file where I needed to do this replacement was pkgs/build-support/fetchurl/mirrors.nix:

hashedMirrors = [

Problem 2: More missing source files

Here’s what happens when we try to run the nix-build command again:

downloading file curl-7.17.1.tar.bz2 with sha256 hash 0yz50r75jhfr2ya6wqi6n90bn4ij30299pjglmlckzq6jp28wrkz...

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
^M  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0^M  0     0    0     0    0   >
curl: (1) libcurl was built with SSL disabled, https: not supported!
error: cannot download curl-7.17.1.tar.bz2 from any mirror

Okay, even with the updated mirror, some other URLs where you could download the source code of programs also have stopped working. I learned that if you find other sources for the programs, you can add them to the Nix store using nix store add-file <file>, and Nix will happily take them, as long as the hash is the same.

Often, plugging broken links into the Wayback Machine worked well! I needed to download the following sources for missing files:

In my modified nixpkgs repo (on the 2008 branch), I already replaced the specified URLs, so you won’t have to download them manually.

Problem 3: Impurity in Python package

Let’s try to run the nix-build command again!

error: builder for '/nix/store/zpnw9n45d92fj28bqprqdfws1fhxhfgq-python-2.4.4.drv' failed with exit code 1;
python$EXE ../../Tools/scripts/ -i '(u_long)' /usr/include/netinet/in.h
Traceback (most recent call last):
  File "../../Tools/scripts/", line 175, in ?
  File "../../Tools/scripts/", line 75, in main
    fp = open(filename, 'r')
IOError: [Errno 2] No such file or directory: '/usr/include/netinet/in.h'
make: *** [Lib/plat-linux6] Error 1

During the build process, Nix tries to access the path /usr/include/netinet/in.h, but it’s not there! It can’t find it because builds happen in isolated “sandboxes”, which only have the things which the package explicitly specified. If builds try to access things from the outside, they would no longer be reproducible, because those outside things could be different on different computers.

I searched the nixpkgs commits for a reference to that file, and found this commit from 2013:

commit 723d5a5581a1ec4dc32eec3b197abb49def666e2
Author: Florian Friesdorf <>
Date:   Wed Jan 9 08:26:15 2013 +0100

    fix python-2.6 build: purity for systems with stdenv.gcc.libc

    On other systems python26 will continue to look for
    /usr/include/netinet/in.h among others. I don't know whether/what to
    do about that.

That commit introduces a patch that substitutes a couple of references to /usr/include with ${stdenv.gcc.libc}/include/, a path that’s now dependent on the package’s inputs. I added this to the preConfigure step of the python/2.4.nix file:

for i in Lib/plat-*/regen; do
  substituteInPlace $i --replace /usr/include/ ${stdenv.gcc.libc}/include/

I backported those lines into the python package from 2008, and it would now successfully build, yay!

When I continued the build, I discovered that, in addition to Python 2.4.4, Nix would also try to build Python 2.5.1. It’s probably a dependency of another of Blender’s dependencies? The same fix helped here, too. \o/

Problem 4: OpenAL has no Makefile

I tried running the nix-build command again…

error: builder for '/nix/store/60sysjw0cnm48q2a3vdwzaaczpmvnwpv-openal-soft-1.1.93.drv' failed with exit code 1;
       last 10 log lines:
       > openal-soft-1.1.93/OpenAL32/alThunk.c
       > openal-soft-1.1.93/OpenAL32/alBuffer.c
       > openal-soft-1.1.93/openalrc.sample
       > source root is openal-soft-1.1.93
       > configuring
       > no configure script, doing nothing
       > building
       > make flags:
       > make: *** No targets specified and no makefile found.  Stop.

Nix complains that the source code of OpenAL (an audio library) has no makefile. (A makefile is something like a recipe for building software.) And indeed, when I looked at version 1.1.93, it only had a CMakeLists.txt file, which is related to the CMake buildsystem. I knew that running cmake . would generate a makefile. Nix has a “default builder”, which knows how to build typical projects.

I would’ve expected that this default builder would know about CMake, but surprisingly, running rg cmake in the whole nixkpgs only yielded about 10 packages where it was mentioned. Maybe it was not a big thing back then?

So, how would I add a step that would run cmake before the rest of the building continues? After some googling, the answer was adding these lines to the OpenAL package:

configurePhase = "cmake . -DCMAKE_INSTALL_PREFIX=$out";

Problem 5: doesn’t exist

So, we run the nix-build command again! I got my favorite error in this series:

error: builder for '/nix/store/69sa0wgax1ijd7pw7cdq6xi4dyzib2pq-blender-2.45.drv' failed with exit code 2;
       last 10 log lines:
       >   BF_OPENEXR_LIBPATH = /nix/store/4vdd02llb0gs4jk2pv5kfcrmp5z2hr87-openexr-1.4.0/lib
       > Command-line targets
       >       No targets given, using default
       > config/ doesn't exist
       > not found, no user overrides
       > scons: *** Error converting option: WITH_BF_OPENAL
       > Invalid value for boolean option:
       > File "SConstruct", line 171, in ?

This stumped me for a while, and I was looking at the wrong places. I tried setting the WITH_BF_OPENAL variable to different values, but eventually I realized that the error was trying to tell me something else: There was no config/ file. My guess was that this file would set a bunch of different things, depending on the operating system. I’m using Linux kernel version 6.2.9 currently. So, what other configuration files are there? I extracted the source code of Blender 2.45, and was amused to realize that the most “modern” configuration was in a file called config/ I guess the the Blender developers back then didn’t think Linux kernel versions would ever start with a 6? :D

The platform was being set in the SConstruct file, so the most direct thing I could think of was to force it to always be “linux2”. I added this line to the beginning of the buildPhase string in the Blender package, which performs that substitution:

sed -i -e \"s/^platform.*$/platform = 'linux2'/\" SConstruct

Now, when running nix-build, Blender actually compiled, and I ended up with a binary, wheeee! Or, as the included README puts it: “Welcome to the world of Blender!”

Problem 6: X_GLXCreateContext fails

We have a binary, let’s run it:

$ ./result/bin/blender
Checking for installed Python... got it!
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  152 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Value in failed request:  0x0
  Serial number of failed request:  29
  Current serial number in output stream:  30

Oh. When I saw this error, I immediately knew that this would be a hard one to solve, because I know so little about graphics drivers. GLX is the OpenGL extension of the X Window System, so it’s used to display 3D things in graphical applications on Linux.

Usually, when I got these types of GLX errors, the solution was to update whatever I tried to run, or to reboot. But I had never really understood what was going on here, and I had no idea on how to debug it. I asked for help on Mastodon, and jix had a couple of ideas.

  • Compile the offending program and its dependencies with debug symbols. (Never figured out how to do that in a way that wouldn’t take a lot of work.)
  • Run it in gdb (the GNU debugger) and see where exactly it crashes.
  • Enable the indirect rendering mode in Xorg (I tried this, but then Blender crashed Xorg.)

Other approaches I tried:

  • Use nixGL as a wrapper (it sets some environment variables in a wrapper script, which fixes modern OpenGL programs built with Nix in a way I don’t understand).
  • Boil down an OpenGL example program to only leave the lines that reproduce my crash.
  • Use xtruss to trace calls into the X Server (didn’t give me new information).

I talked to jix again a few days later, and they suspected that the easiest workaround would be to fall back to a way of rendering 3D graphics that wouldn’t go through a graphics card, and instead, just be a software implementation of OpenGL. This would be slow, but it might avoid some incompabilities between my modern X Server/graphics driver, and old 3D software.

They came up with the fix to build the mesa library (an open source implementation of the OpenGL API, which talks to graphics cards) in a way where it would only use software rendering: Replacing the “linux-dri-x86-64” target in the mesa package with “linux-x86-64”. This seems to remove the “Direct Rendering Interface” capabilities.


After rebuilding using nix-build, we can now finally run Blender! <3

Sweet, sweet nostalgia! Of course, there already was default cube in the scene back then. And you had to right-click to select objects by default…

Inkscape 0.45 (from 2008)

Another program I started using a lot 15 years ago is the vector graphics program Inkscape.

Problem 1: Missing source files

When running nix-build path/to/nixpkgs -A inkscape, I encountered a similar error as before, where two source files were not present at their original locations anymore. I downloaded alternatives from these URLs:

Problem 2: Segmentation fault

That gives us a binary. Let’s try to run it:

$ ./result/bin/inkscape

Emergency save activated!
Emergency save completed. Inkscape will close now.
If you can reproduce this crash, please file a bug at
with a detailed description of the steps leading to the crash, so we can fix it.
fish: Job 1, './result/bin/inkscape' terminated by signal SIGSEGV (Address boundary error)

That doesn’t sound very good. SIGSEGV is a signal related to a “segmentation violation”, which happens when a program tries to write to memory outside of its allowed regions. I tried using various tools to inspect the coredump, but didn’t get very far.

Maybe we can run a debugger and see more detail about what happened? Let’s use the GNU debugger:

$ gdb ./result/bin/inkscape
Reading symbols from ./result/bin/inkscape...
(No debugging symbols found in ./result/bin/inkscape)

No debugging symbols, okay… let’s try it anyway:

(gdb) run
Starting program: /nix/store/vx7f9ihpd7ahvgp8x17c0plqddwz35hc-inkscape-0.45/bin/inkscape

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff54e523a in translate_array () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/

This is the same crash as before, but now we can try to print a backtrace:

(gdb) bt
#0  0x00007ffff54e523a in translate_array () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/
#1  0x00007ffff54e9134 in load_truetype_glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/
#2  0x00007ffff54e99cf in Load_Glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/
#3  0x00007ffff54dda41 in FT_Load_Glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/

I’m not sure how this works so well without debugging symbols, but yay!

Huh, so the crash happened somewhere in a “load glyph” function. One very neat tool to see more about what a program does is called strace, which prints all system calls the program does in the Linux kernel. You can see which files it accesses, for example. Let’s try it:

$ strace ./result/bin/inkscape
stat("/usr/share/fonts/handjet/Handjet[EGRD,ESHP,wght].ttf", {st_mode=S_IFREG|0644, st_size=372832, ...}) = 0
open("/usr/share/fonts/handjet/Handjet[EGRD,ESHP,wght].ttf", O_RDONLY) = 6
fcntl(6, F_SETFD, FD_CLOEXEC)           = 0
fstat(6, {st_mode=S_IFREG|0644, st_size=372832, ...}) = 0
mmap(NULL, 372832, PROT_READ, MAP_PRIVATE, 6, 0) = 0x7f217ef13000
close(6)                                = 0
brk(0x2f50000)                          = 0x2f50000
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7f217ec1b000} ---
+++ killed by SIGSEGV (core dumped) +++
fish: Job 1, 'strace ./result/bin/inkscape' terminated by signal SIGSEGV (Address boundary error)

Interesting, the font library that Inkscape uses tries to load various fonts installed on my system… and crashes after opening one called Handjet, that seems to be a very fancy variable font with multiple parameters? Maybe the Fontconfig from 2008 isn’t able to handle it?

Let’s, um, “fix” this problem by moving the font somewhere else:

$ sudo mv /usr/share/fonts/handjet/ /root


Firefox (from 2008)

Another program I wanted to build is Firefox.

$ nix-build path/to/nixpkgs -A firefox

Problem 1: No rule to make target

error: builder for '/nix/store/dkdxljpvhdr2bn3i5cvpj5p9fy50hwpr-firefox-' failed with exit code 1;
       last 10 log lines:
       > building ../coreconf/
       > /nix/store/36sp3r35nxhhj5m83bxsvf7xqgdrhz1l-gnumake-3.81/bin/make -j1: *** No rule to make target ../coreconf/  Stop.
       > make[3]: *** [../coreconf/] Error 1
       > make[3]: Leaving directory `/build/mozilla/security/coreconf'
       > make[2]: *** [.nss.cleaned] Error 2
       > make[2]: Leaving directory `/build/mozilla/security/manager'
       > make[1]: *** [tier_50] Error 2
       > make[1]: Leaving directory `/build/mozilla'
       > make: *** [default] Error 2

This is a similar problem like we’ve encountered before with Blender: The build process didn’t expect there to be a Linux kernel version more modern than version 2.6. I solved this by applying ckie’s solution, which just copies over a config file for version 2.6. I added this to firefox/

patchPhase() {
    if test -z "$patchPhase" -a -z "$patches"; then return; fi
    header "patching sources"
    startLog "patch"
    cp security/coreconf/ security/coreconf/


“Congrats! You’re using the latest version of Firefox! An even newer Firefox is available.” 😂

Firefox uses the codename “Bon Echo” here, I think Mozilla didn’t allow binary distributions using the original Firefox branding back then…

For some reason, Firefox showed “Server not found” errors for all websites I tried to visit, until I configured a Proxy server (under Edit -> Preferences -> Advanced -> Network -> Connection -> Settings). I just installed and started mitmproxy, and used as the proxy.

I couldn’t access, I think the allowed SSL algorithms are too new for Firefox 2.0…

GIMP 2.4.3 (from 2008)

After all fixes from before, this one “just worked”:

$ nix-build path/to/nixpkgs -A gimp

Today’s GIMP still uses the same icon set!

Closing remarks

This was fun! Trying to build old software allowed me to get some pretty deep insights into various parts of Nix. So many different errors…

One thing I still would like to try is building a full GNOME desktop (version 2.16). There is a pkgs/desktops/gnome directory, but the support seems very rudimentary, only packaging the window manager metacity, the gnome-panel, gnome-terminal, and a couple of helper libraries… other components, like a GNOME settings program, don’t seem to be packaged, so I’m not sure how to get started. The “operating system” related things used to live in the nixos repo back then, before it was merged into nixpkgs, so maybe there’s something in there?

Other open questions:

  • What would I need to do to have 3D-accelerated graphics in Blender?
  • Why can’t Firefox 2.0 resolve domain names?
  • Why was I able to debug the Inkscape crash, even though it had no debugging symbols?
  • Is it possible to “override” Nix derivations from 2008, to fix them in a more elegant way than to modify the nixpkgs repo?

Wanna time travel to 2008 yourself?

Again, I published a modified nixpkgs repository (the 2008 branch), which includes all required changes to build an run Firefox, GIMP, Inkscape and Blender from 2008 on my Arch Linux machine in 2023. Give it a try and let me know how it went for you!

Linux Puzzles linux-puzzles 2023-03-10T00:00:00+00:00 blinry ]]> JSON Explorer json-explorer 2023-02-01T00:00:00+00:00 blinry ]]> Floppiness floppiness 2023-01-27T19:40:00+01:00 blinry A chiptunes track made in Ardour in a week! I’m… not too fond of Ardour, to be honest. It had weird behaviour, crashed a couple of times, and forgot instrument setting after re-opening a project. Anyway, I made a song! :)

The only instrument I used is the Helm synthesizer.

Compass in the Sky compass-in-the-sky 2023-01-20T00:00:00+00:00 blinry ]]> Carrot Conundrum carrot-conundrum 2023-01-10T00:00:00+00:00 blinry The incredible adventures of the bunny who hopped through time!

A grid-based puzzle game about breaking the fourth wall,

Made for Ludum Dare 52, together with Piko! Play here!


Toki Pona cheat sheet toki-pona-cheat-sheet 2020-01-07T11:53:00+01:00 blinry In the beginning of 2020, I did a workshop about the constructed, minimalist language Toki Pona. I always wanted to try to put the entire grammar of Toki Pona on one page, and I’m super glad that worked out pretty well!

Here’s the cheat sheet, with the entire grammar on one side, and the entire vocabulary on the other side:

Toki Pona cheat sheet

If you want to modify it, you can also download the ODT file. You’ll need the fonts Fira Sans and Roboto.


A number of people kindly translated the cheat sheet! More translations very welcome!

  • Russian (by /dev/urandom): PDF, ODT
  • French (by David): PDF
  • Italian (by Lorenzo): PDF, ODT, GitHub
  • Brazilian Portugese (by Felipe): PDF, ODT
  • Esperanto (by Vaughn): PDF, ODT
  • Persian (by Ali): PDF, DOCX (fonts available on request)
  • Japanese (by jan wanashi): PDF, DOCX
Alarm Clock Arcade alarm-clock-arcade 2022-10-03T00:00:00+00:00 blinry For the Ludum Dare 51 game jam, Kiki and me made another game!

It’s an arcade game taking place inside an alarm clock! Inside the first digit of the seconds display, to be precise!

Quick, start the alarm to wake up your human! But make sure not to be in a segment when it turns off!

Play it at the Ludum Dare website!

This was really fun to make – the game even has its own intro animation, and features lots of fun sounds!

The Dutil-Dumas Message dutil-dumas 2022-06-11T00:00:00+00:00 blinry A talk for INLAWS - International Negotiations on Love, Art, Wizardry, and Science.


Print, cut, and staple your own zine!

Message Data

The binary message (reconstructed by me from this document): message.txt

What is color, anyway? what-is-color 2022-05-20T00:00:00+00:00 blinry I gave this talk (in German) at the 20th Gulaschprogramiernacht in Karlsruhe.

Interactive tool

You can try the tool I made for interactively exploring the xyY color space here!

Sliderland sliderland 2022-05-13T00:00:00+00:00 blinry ]]> Tides tides 2022-04-16T00:00:00+00:00 blinry For the demoparty Revision 2022, Winnie and I made a music video that uses only HTML sliders! :D It won first place in the “Wild” competition!

There’s a recording on YouTube:

Online version

You can play the demo here (works in Chrome, click to start the music).

Make your own animations

I remade the framework as an interactive, minimalist creative coding tool! You can try it at!

Shepherd's Island shepherds-island 2022-04-05T00:00:00+00:00 blinry ]]> The Everything Exhibition everything-exhibition 2022-02-21T00:00:00+00:00 blinry 🏛️ Visit the exhibition

You can find the current build here:

🐞 Report bugs!

If something doesn’t work or looks broken, please let us know! You can describe the issue you’re having in our issue tracker.

✏ Write a content plugin!

We’d like to make it easy to add more content sources, besides MediaWikis! We think that HTML will be an even better “intermediate format”, compared to Markdown.

But we’re not quite there yet! Feel free to follow us to get notified as soon as we build an easy way to add content plugins:

🔭 Follow us!

💰 Support development!

Our current funding will run out at the end of February. If you wanna help us put more time into making open software and content, you can support us on Patreon! Here and here!

📩 Get in touch!

Want to use this game in your teaching? Or at your workplace? Something resonated with you? We want to hear from you! :) Drop us an email:

Operation Mindfuck Vol. 5 operation-mindfuck-5 2021-12-27T00:00:00+00:00 blinry Recording


Here are the slides we used: (Open them in fullscreen)

Making fifty TIC-80 carts in a weekend 50-tic80-carts 2021-12-05T00:00:00+00:00 blinry Ever since I read about the “Make 50 of Something” technique in Vi Hart’s blog post about Fifty Fizzbuzzes, I wanted to try it for myself! Creating 50 of, well, anything, in quick succession seemed like a fun challenge!

So, on a free weekend in early December, I decided to try to make 50 programs for the open-source retro fantasy console TIC-80!

On this page, I document my experience, and release all resulting programs/”carts” under the free CC0 license, so you can study, modify and reuse them however you like!

You can click on “play in browser” below each video to see the cart in action! To see the source code, press escape, click “Close game”, and press escape again!

Saturday morning

I started by compiling a list of rough ideas. The first thoughts that came to my mind were about trying technical things, like graphical effects, or exploring the features of the console. I cracked my knuckles, opened TIC-80, and got to work!

1: Dissolving

This doesn’t clear the screen each frame, but instead clears 5000 random pixels before drawing the circle!

play in browserdownload .tic fileview tweet

2: Pattern fill

TIC-80 doesn’t have a built-in pattern fill, so here I rasterize the circles myself, using the 16-bit patterns 0xada7, 0xaeab and 0x8520.

play in browserdownload .tic fileview tweet

3: Text effects

We can offset the plain print() function a bunch of times to get these effects! For the striped version, I use clip() to limit what is drawn in each color to a single line.

play in browserdownload .tic fileview tweet

4: Smooth rainbow

TIC-80 normally just has a 16-color palette, but it’s possible to change it in each scanline! :)

play in browserdownload .tic fileview tweet

5: Sprite drop shadows

Using the palette swap region in the RAM, I swapped all colors to black before drawing a shifted copy of the sprite.

play in browserdownload .tic fileview tweet

6: Patterned shadows

Similar idea, but drawing each shadow 32 times and using clip() to constrain it to a checkerboard pattern. There’s… probably a way to do this more efficiently! :D

play in browserdownload .tic fileview tweet

7: Alien art

Drawing bit fields using a simple formula on the pixel coordinate. The modulus can be changed with the arrow keys. Shoutout to Martin Kleppe! :)

play in browserdownload .tic fileview tweet

8: Shaking text

Another text effect. We have to split the string into individual characters to do this.

play in browserdownload .tic fileview tweet

9: Thick lines

TIC-80 has a line() function, but it’s only 1 pixel wide. We can use tri() to draw a thicker rectangle, and close it off with circles at the ends. Doesn’t seem to work very well for odd line widths.

play in browserdownload .tic fileview tweet

10: Chromatic aberration

I love this retro effect, which separates the color channels more as we get closer to the edge of the screen!

play in browserdownload .tic fileview tweet

Saturday afternoon

Making the first 10 carts took me roughly three hours. I felt good about this challenge! I had plenty of more ideas in my list, and with around 20 minuts per carts, I was well on track time-wise! I started tweeting about my progress, here’s the thread, which gave me a good medium for reflecting on my own progress, and invited encouragement! :D

I got lunch, and kept going:

11: Sprite outlines

Another effect on sprites, swaps all palette colors to black and drawing shifted copies of the sprite! The cartoon style of the second tree should come in very handy games!

play in browserdownload .tic fileview tweet

12: Piano

TIC-80 has built-in editors for sound effects and music! Here’s a virtual piano that you can play with your computer keyboard! I like how arpeggios (fast pitch patterns) instantly make a sound chiptune-y! :)

play in browserdownload .tic fileview tweet

13: Sliding notes

The sfx() can only play fixed semitones, without any effects. I wanted a “note slide” effect, so I prepared a music track which uses that effect, and when playing a note, poke around in the RAM to insert the source and target pitch!

play in browserdownload .tic fileview tweet

14: RAM viewer

I was curious about TIC-80’s RAM (virtual computer memory), so I wrote a visualizer! In this video, I show two cool things I found: The default character set (not really readable in this layout), and the two bytes where the mouse position is stored! :D

play in browserdownload .tic fileview tweet

15: Floating letters

A text animation that pushes away letters that are further from the “focal point”. The things you can do with trigonometry! <3

play in browserdownload .tic fileview tweet

16: 2D distance functions

I love writing pixel shaders in GLSL, and with TIC-80, you can use the same approach (but much slower)! Here’s two distance functions describing circles, combined with a smooth minimum function.

play in browserdownload .tic fileview tweet

17: 3D distance glitch

A pretty bug I encountered while trying to implement a 3D renderer using ray marching! I think the factor I was using to cycle through the color palette was way too high.

play in browserdownload .tic fileview tweet

18: 3D distance functions

And here is a “properly” rendered 3D sphere. Without a 3D vector library, coding prettier shading felt like a hassle, so I just did a simple rainbow pattern and moved on. :)

play in browserdownload .tic fileview tweet

19: Direct sound

Diving deeper into TIC-80’s audio capabilities, I found the “sound registers”, which you can directly write to! Okay, first experiment: filling them with random bytes! 🎶

play in browserdownload .tic fileview tweet

20: Theremin

Neat, this allows us to have much more control! We can set the waveform, the volume, and the frequency! So let’s build a theremin! :>

play in browserdownload .tic fileview tweet

Saturday evening

At this point, I realized that making 50 of anything is a lot! But I also really enjoyed the exercise, it made me think outside the box, and allowed me to follow my curiosity! To spread the 50 carts out equally over two days, I decided to make 5 more that day:

21: Noisy gradient

The further we progress on the x-axis, the more probable the right color becomes!

play in browserdownload .tic fileview tweet

22: Day of the week

TIC-80’s tstamp() function gets us the seconds since 1970-01-01! Compared with most other date calculations, finding out the day of the week is relatively straightforward! (Famous last words.)

play in browserdownload .tic fileview tweet

23: Screen shake

An effect that helps make games 💦juicy💦! This is really satisfying. :D I’m sorry, Japan. Today’s earthquakes are on me.

play in browserdownload .tic fileview tweet

24: Particles

Another 🥵juicy🥵 part of many games! These particles have a position, a color, a direction, a speed, and a “frames to live” counter. They shrink and slow down as they age.

play in browserdownload .tic fileview tweet

25: Liquify

Quick effect to finish the day off! Because TIC-80’s UI is still in the screen RAM when a cart runs, we can do effects on it! Here, each pixel has a chance to assume a neighbor’s color!

play in browserdownload .tic fileview tweet

Sunday morning

Encouraged by my friends cheering me on on Twitter, I started into the second day with a lot of energy! Saturday had been exhausting and exciting! I had some more ideas on my list.

26: Tree

Here, I’m doing a simple recursion with a dash of randomized angles, using a green color gradient.

play in browserdownload .tic fileview tweet

27: Bliss

Having some fun with TIC-80’s sprite editor, and assembling dynamically-sized objects from tiles!

play in browserdownload .tic fileview tweet

28: Inversion

Again, this is a custom circle rasterizer that checks the current pixel value, and inverts it. A little shadow to round it off. Kudos to TRASEVOL_DOG, whose Doodle Insights were a big inspiration for me!

play in browserdownload .tic fileview tweet

29: Vignette

I love vignetting effects, where the image corners fade out into darkness. It’s harder to replicate with a 16-color palette, but I’m not unhappy with this.

play in browserdownload .tic fileview tweet

30: Animated character

In many games, you move around with a character, and it looks much nicer when it’s animated! This was good practice for implementing a system like that.

play in browserdownload .tic fileview tweet

31: Fuzzing

Okay, let’s just put random bytes all over TIC-80’s entire RAM! This can change the screen offset, the border color, or make cute noises! And if you watch the recording until the end, you can watch me learn that there’s a bit for capturing the mouse! :’D

play in browserdownload .tic fileview tweet

32: Cross-stitch

I had the idea to make a filter which takes the current screen content, and replaces each pixel with a stitch! Here it is being applied to the duck cart! :3

play in browserdownload .tic fileview tweet

33: Paint

A very rudimentary drawing program. Really wanted to spend more time on this, but I had to move on!

play in browserdownload .tic fileview tweet

34: Falling sand

The same program as #33, but with an additional rule! :D

play in browserdownload .tic fileview tweet

35: Water reflection

Each pixel from the top half of the screen is reflected to the bottom half, mapped to a darker color, and shifted around a bit horizontally! Really happy with the interactive part here!

play in browserdownload .tic fileview tweet

Sunday afternoon

At this point, I was in a deep flow state - similar to what I experience when I participate in game jams: I have a lot of focus, and can work on something basically from waking up until I go to bed. That’s pretty unusual for me, and a really intense feeling! Also, at this point, I felt like I was out of ideas. Every idea felt like it would be the last. I think it is exactly the point of this exercise - to exhaust the obvious ideas, to get to the weird ones!

I badly neede another break, so I made vegan gingerbread cookies, went for a quick walk, and continued after that. To be able to finish the remaining carts during the weekend, I started using a 20-minute timer to remind me to move on.

36: Rain

A modification of #24, but with two types of particles – raindrops and water splashes!

play in browserdownload .tic fileview tweet

37: Spirograph

Three connected arms with random lengths and rotation speeds. We trace the last arm’s path (and memcopy to an unused part of the RAM, so we can draw the arms on top)!

play in browserdownload .tic fileview tweet

38: Voronoi diagram

I’ve never implemented Voronoi cells before! Each point has an associated color, and we paint each pixel according to which point it’s closest to.

play in browserdownload .tic fileview tweet

39: Game of life

A classic “cellular automaton”, which simulates its cells in a particular way, often leading to interesting patterns. This starting pattern is called “Acorn”!

play in browserdownload .tic fileview tweet

40: Cursor impostors

Only one of these cursors is real! Can you figure out which one? The others dance with you in the same speed. (Note to self: make a real game around this idea at some point.)

play in browserdownload .tic fileview tweet

41: Television

A filter that adds noise, some horizontal lines, and cheap distortion using the SCN() function.

play in browserdownload .tic fileview tweet

42: Typewriter

TIC-80 has access to the states of most buttons on your keyboard, so we can build a typewriter! With some letter imperfections, “editing” capabilities, and *ding* sound at the end of the line! :P

play in browserdownload .tic fileview tweet

43: Moiré pattern

An interference pattern created by two sets of concentric circles.

play in browserdownload .tic fileview tweet

44: Map generator

For this, I distribute some colored pixels on the plane, and make them grow outwards, like bacteria. Surprisingly effective and cheap!

play in browserdownload .tic fileview tweet

45: Truchet tile editor

This patterns is made from four tiles, which all fit together. You can click on a tile to change it. Would be fun to make a font with this!

play in browserdownload .tic fileview tweet

Sunday evening

I was into crunch territory now, wringing out my brain for new ideas. I felt mentally and physically exhausted, but I also said to myself: “I can do this!”

46: Mountains

The layers keep track of a up/down direction for changing the height. They add noise to it, but also try to flatten it out over time. I like how smooth this makes them.

play in browserdownload .tic fileview tweet

47: Timeline

I heard you like timelines, so I put a timeline in your timeline so you can scroll through a timeline while you scroll through your timeline!

play in browserdownload .tic fileview tweet

48: Squircle

The so-called squircle is a superellipse defined by x^4+y^4=r^4. It’s close to a rounded rectangle, but I like it much better! It’s being in UI design, for example for app icons!

play in browserdownload .tic fileview tweet

49: Mandelbrot set explorer

A famous fractal! It has a simple definition, but a highly complex boundary! The colors show how many iterations we did from that point before diverging.

play in browserdownload .tic fileview tweet

50: Fireworks!

And finally, let’s do another application for a particle system. Here, I spawn the particles along some hand-crafted lines and ellipses. Whoa, I really made it!! 🎉

play in browserdownload .tic fileview tweet


After completing the 50 carts, I felt pround, and excited, and completely exhausted! In total, I had spent around 16 hours on creating the 50 carts, and around 4 hours on tweeting about them!

My ears were ringing, my eyes were dry, and my mind felt restless. This was a really intense exercise! Similarly to how I’ve experienced it after game gams, I needed around three days and a lot of sleep to fully recover from this.

I really encourage you to try this sometime! You could paint 50 small-scale paintings! Or write 50 koans! Or, I dunno, cook 50 sandwiches?

Inkdiary 2021 inkdiary-2021 2021-10-31T00:00:00+00:00 blinry In October 2021, I had a streak of bad luck, hugged people, and loved and ran a lot!

And here’s a Twitter thread with the individual drawings:

Cat Tree Generator cat-tree-generator 2021-08-17T00:00:00+00:00 blinry I spent a one-week “mini batch” at the Recurse Center in 2021. I wanted to learn how to do 3D things in the browser, and how the wave function collapse algorithm works!

What I built is a “cat tree generator”! I modelled the tiles in Blender, and wrote an algorithm that makes sure that the final structure will be consistent. For example, a ladder will only be placed if:

  • there’s nothing over it,
  • there’s something solid under it, and
  • there’s a solid block next to it.

Check it out here! Each time you refresh the page, you’ll get a new cat tree!

You can find the source code on GitHub. I use THREE.js for 3D rendering.

The Ferro Paradox ferro-paradox 2021-06-13T00:00:00+00:00 blinry ]]> I'm (officially) blinry! pseudonym 2021-03-10T00:00:00+00:00 blinry “blinry” is now printed in my official German ID documents! I want to tell you how I did it, and document this as well as I can, so that you can maybe do it, too!

Specifically, it’s printed in the field “Ordens- or Künstlername/Religious name or pseudonym”, which is present both on the Personalausweis, as well as the Reisepass!

Why have it officially recognized as a pseudonym?

There’s no clear single reason for me. I was curious how the process would work. It might make it easier to use it to sign contracts or to receive letters under this name.

Really, it’s mostly about closing the gap between the name I identify with, and the name printed in official documents.


Who can have their pseudonym officially recognized in Germany? There don’t seem to be precise requirements, unfortunately. The Law on National ID Cards is very brief on this, and just mentions that there is a field for a pseudonym, and that applicants need to produce evidence if they want something printed in there.

But when trying to find out what the requirements might be, I found a few recurring themes:

  • You’ve been using that pseudonym for a while.
  • You’re doing art or other forms of publication under this name.
  • You’re known under this name on a nationwide or international level.

That seemed like it all applied to me! So I started collecting evidence.

My application

I put together a 10-page letter with lots of screenshots, here’s what that looked like for me! (German original here, feel free to base your application on it!)

I hereby request that my pseudonym “blinry” be printed on my national ID card.

I am known by this name internationally since around 2017, and do publishing and art under this name. As an independent designer, artist, and speaker I am only using this name at this point, meaning that it displaced my birth name. I am introducing myself as “blinry”, and most customers, colleagues, and friends only know me by this name. I would like to be able to use it when sending invoices or opening bank accounts.

I have attached eight pieces of evidence to demonstrate that I am internationally known by this name.

If you have questions, feel free to reach out at [email address].

A Google search for “blinry” (in an anonymous browser window, without being logged in, to make the results more neutral), results only in hits concerning my person, including my homepage and various social media accounts.


I’m doing art and other publishing on the social networking service Twitter, and have over 2800 followers.

My tweets regularly get over 500,000 people per month.

Talks and publications

On my website I’m linking to many of my public appearances. Some of the contexts are conferences like the Chaos Communication Camp north of Berlin or the yearly MRMCD in Darmstadt. In addition, I’m part of different groups who create small video games. Since 2017, I publish these only under the name “blinry”.

My website has had over 400,000 impressions on Google in the past three months.

Opening of the 36th Chaos Communication Congress

A the end of 2019, together with a friend, I gave the opening speech of the 36th Chaos Communication Congress, one of the largest meetings of tech enthusiasts, artists, and hackers of the Chaos Computer Club, which is taking place each year in Congress Center Leipzig. Over 27,000 people watched the recording.

Deutschlandfunk and the Dresdner Neuesten Nachrichten reported on this opening:

Report in the c’t

After publishing a video game, the c’t, a magazine for computer technology of the publisher Heise, reported on it in the 13th edition of the year 2017.

Pixel art poster

At the end of 2016, I designed a pixel art poster, which I offered on a pay-what-you-want basis. About 1500 posters were handed out. The poster is signed with “blinry”.

Freelance design work

In my freelance design work, I also use the name more and more. Here’s an example for how a customer announced one of my logo designs.

Commercial design work

Together with a friend, I designed a t-shirt for the online shop “getDigital”. The product page has the following description:

I printed all of that out, put it in a thick envelope, and sent it to my city’s municipal office (“Bürgeramt”).

The response

And then waited. 10 days after mailing this out, I got this email!

After reviewing your documents, I don’t see any reason why we can’t put the pseudonym “blinry” on your national ID card. Please call me to schedule an appointment. […]

I was excited, and really surprised how fast and unproblematic this went!

Visiting the office and doing the paperwork went almost exactly like doing any other extension of the ID card. The office worker told me that she had never entered a pseudonym before. She also told me that her colleague (who had sent me the email) “had done some additional research, and had attached some more screenshots to my letter”, and that it all seemed to check out!

By the way, because all information in the German ID card is in ALL CAPS for some reason, I didn’t have to explain why “blinry” should be written in lowercase…

After this appointment, the ID card was printed and mailed to the Bürgeramt, which took a few weeks. Because of the pandemic, and because the Bürgeramt is placed inconveniently far away from where I live, I only went to get it today!

Finally holding it in my hand feels super meaningful to me! :’) It feels validating for what has become my core identity.

The future

Next steps probably involve putting the name on my mailbox, so that I can receive letters with it! And possibly changing my main email address, oof.

I also anticipate that it will be challenging using the name in any official context. I guess I’m mononymous now, and forms asking for a “first name” and a “last name” don’t really make sense.

But whenever I get strange looks, I now can pull out my ID card and show them that it’s officially recognized! :)


If wanna try this for yourself, and have questions, feel free to ping me! I don’t have a good sense for how many pieces of evidence you might have to produce in order to apply successfully, or how they need to look like, overall, but if more of us do it, maybe we can find out!

There’s one other person who I know of who documented how to apply for a pseudonym in Germany: leitmedium – it’s also a super interesting read!

Oh My Git! oh-my-git 2021-03-08T14:41:00+01:00 blinry ]]> Operation Mindfuck Vol. 4 operation-mindfuck-4 2020-12-29T00:00:00+00:00 blinry Recording


Here are the slides we used: (Open them in fullscreen)

3D-printed counter ring counter-ring 2020-12-04T00:00:00+00:00 blinry This is the replica of a “knitting row counter ring” that I like. It has two rotating number rings, which you can use to set numbers from 0 to 99.

Between the number rings, there is a thin, slightly bent “tension ring”, which holds the number rings in place.

I designed and tweaked the ring using a Prusa Mini+.

  1. Download the .stl file, and open it in PrusaSlicer.
  2. It seems important to activate the “Detect thin walls” option under Print Setting -> Layers and perimeters -> Quality. Without it, the thin walls of the inner and outer ring would consist of multiple extrusions, and they wouldn’t fit together. Other than that, I used Prusa’s standard 0.20mm QUALITY print profile, with an extrusion width of 0.45 mm.
  3. Slice and print! This will take around 20 minutes.
  4. Cut off any blobs or stringing from the parts.
  5. Bend the thin tension ring into a zig-zag shape. Three upward zigs and three downward zags seem to work well. Strongly crease them!
  6. Put the pieces together in this order:
    1. Outer ring (the wider of the high, thin rings)
    2. A number ring, with the dents facing outwards
    3. The bent tension ring
    4. Another number ring, with the dents facing outwards
    5. Inner ring
  7. Align the outer cutouts in the inner and outer rings, and carefully push them together all the way. Done!

Make modifications!

If you want to make changes to the models (like changing the inner diamete), you can find the OpenSCAD source file on GitHub. It has a lot of comments! :)

Inkdiary 2020 inkdiary-2020 2020-10-31T00:00:00+00:00 blinry In October 2020, I spent time in nature and indoors, made and played games, and was pretty exhausted.

And here’s a Twitter thread with the individual drawings:

Patreon avatars patreon-avatars 2017-11-07T00:00:00+00:00 blinry Sometimes, people have so much unconditional trust in me that they throw money at me at a regular basis. That’s awesome, and I’m always very humbled and thankful when that happens. I have this thing where, if you seriously want to give me $25 or more per month, I’ll set up a Twitter bot that talks like you, and I’ll draw you a custom profile image for your social media accounts. Here are the ones I’ve done so far:


Moritz’ wish was an avatar in a hand-drawn cartoon style. I drew this one in Krita, from a photo reference:


Marudor asked for a panda in a vector graphics style. There are also two alternate versions: For his protected account, and for the bot, @markovdor.


Christina liked my pixel art poster of the CCH, so I made her a simple pixel art avatar from a photo reference. Theres also a robotic version for @botchris451.

Thomas described the honey badger as his “spirit animal” – judging from a few popular YouTube videos, it seems to be super fearless! For this one, I aimed for a cartoon look. I always make sure that my avatars look good when they are placed inside circles, like Twitter does these days:


You can bribe me! :D

DIY soft drink recipes diy-soft-drinks 2020-09-21T00:00:00+00:00 blinry ]]> Pengutronix intro pengutronix-intro 2020-09-14T00:00:00+00:00 blinry The company Pengutronix does embedded Linux consulting & support, and which employs a number of my friends! They’ve been a lovely client of mine, and comissioned a number of logo designs over the years – and in 2020, they asked me to create a video intro for their talk recordings!

Version 0.1.0

Pengutronix’ logo is a cute penguin, so that it seemed like an obvious choice to put it front and center! I put together a small 3D scene, and rendered it with Blender:

Version 0.2.0

In the next version, I added snow and an audio jingle, incorporating dial-up modem sounds. :D

Version 0.2.1

… which turned out way too Christmas-y, so I removed the snow again, and changed the instrumentation.

Version 0.3.0

Here, I swapped out the jingle to something more soothing, changed the camera movement to go through two phases, and added a fish friend! 🐟

Version 1.0.0

A bit of polishing, and a few hours of render time later, this was the final intro video!

I really enjoyed the whole process, and being able to create this using open-source software is a great feeling. If anyone else wants an intro video like this, I’m open for commissions! :)

Boids boids 2020-09-09T00:00:00+00:00 blinry A small interactive swarm simulation. Made with Godot.

Play it here!

]]> logo marudor-logo 2020-08-11T00:00:00+00:00 blinry Marudor wanted a custom logo for, a website providing a plethora of information about trains in Germany!

Here’s the logo we ended up with:

Clean SVG here, PNG here, multi-resolution favicon here.


I usually start a logo design with some sketches with ink on paper. Here are some directions I came up with:

We settled on the “letter m” direction, I digitized the sketch and made some variations with different letterforms and different outlines:

Finding a good logo usually involves making a lot of variations. This is a playful process I really enjoy, and it usually leads into some hilarious dead ends, like these:

Clickbait clickbait 2020-07-12T00:00:00+00:00 blinry An action game where the goal is to close all popups! But your mouse cursor might have other plans…

Play it in your browser!

Some early praise

“god I hate this game so much <3 <3 <3”

“Loved and hated this! Playing it on a laptop trackpad was an experience, would highly recommend.”

“So good! This is a 10/10 for me!”


The GMTK Game Jam is organized by a team around the British video game journalist Mark Brown, and has grown into one of the largest online game jams! It focuses on clever game design and mechanics, which I really like!

This year’s theme was “Out of Control”! Bleeptrack and I made an action game involving a lot of popups, a very disobedient mouse cursor, and a paperclip that’s definitely not helping! :P Winnie composed an original score for us, which is released under CC BY-SA: Windows 9001. Thanks to Winston for playtesting!

This is also my first game that comes with a silly trailer:

We made the game using the open-source game engine Godot, which I’ve really grown fond of this year! You can find the source code on GitHub.


The GMTK Game Jam is 48-hour jam, and whew, after doing a lot of 72-hour jams, I really felt the difference! You need to start playtesting and polishing much earlier, at the beginning or in the middle of the second day.

We spent quite some time brainstorming. Some alternative ideas:

  • A game where you play as a dog, who is out of control (or wants to get out of control?) while being on a leash, on walk through the park with its owner. You’d bark a lot, pee on everything, and if you poop somewhere, your owner would have to come pick it up, allowing you to control them a bit. :P I thought this might’ve been a fun toy, but we didn’t find a good angle on what the actual goal of the game could be.
  • A game with random time travel. You’d play Pacman or something, and at random points, the game would jump back into the past, or even ahead into the future. I’m really intrigued by the question how the future should look like if you haven’t played until that point yet - would we simulate all characters? Overall, without other gameplay elements to balance this, it might become frustrating quickly.

But we also had several ideas involving an out-of-control mouse cursor. Initially, we thought you would need to lure the cursor somewhere by putting down little food pellets or something. But when we started collecting ideas on how the cursor might misbehave, we quickly realized a fun and chaotic action game where the control mode changes a lot might be fun!

Some main challenges when developing this game was to implement our own UI system for the windows, and making sure that you can only click on the topmost one, and balancing the modes, making them not too easy and not too hard.

Two tweet from during development:

You Shall Not Pass you-shall-not-pass 2020-05-03T00:00:00+00:00 blinry Bine and I made this little game for the infamous The Boston Stupid Shit No One Needs & Terrible Ideas Hackathon in a single day.

It’s a game about finding the perfect password that fulfills all criteria. :P It has three levels, and takes a few minutes to play.

Play it in your browser!


We developed the game using Glitch, which worked amazingly well! You can look at the source code (or remix the project) here.

As so often, we got a lot of super helpful input from our followers on Twitter and Mastodon when we posted about your work-in-progress, see the replies to theese tweets:

We definitely had more ideas than time, so who knows, there might be an extended ersion in the future? :)

DJ Hamster dj-hamster 2020-04-21T00:00:00+00:00 blinry At this point, I’ve lost track of how many games I’ve made for Ludum Dare, but I’ve been doing it since 2016! For Ludum Dare 46 (with the theme Keep it alive), I made a “music game” for the first time: you’re DJ Hamster, and it’s your job to keep some old-fashioned records spinnig!

The game looks back on the soundtracks of the games I’ve worked on in the past, and it’s a declaration of love to the people who made them with me: Agustín, Alan, Byung, Kiki, larkinia, Lena, Leslie, Mai, Moritz, Pecca, rohieb, Steffi, Tim, and Winnie! <3

Play the game in your browser! The submission page on the Ludum Dare website is here.


When brainstorming, I thought I had a strong initial idea, but I dropped it after half a day, and I think this was a good decision!

Ihro Mayastät Podcast Intro ihro-mayastaet-intro 2020-04-10T00:00:00+00:00 blinry When I want to learn something new, an approach that works really well for me is to take on small, real-world projects, and learn everything I need while realizing that project.

In this case, I wanted to practice making music, so I asked around whether someone needed intro music for a podcast or something like that:

And to my delight, I got several nice requests! For example, Ihro and Maya just started producing a German podcast about BDSM and polyamory. The name they picked (“Ihro Mayastät”) is a play on words on a phrase used to address people of high royal position.

Intro music

The intro music reflect this by using a baroque instrumentation, and announces the podcasters with fanfares and a orchestral buildup. I also like how the lead instruments – a trumpet and a cello playing pizzicato – seem to have a conversation, much like Ihro and Maya in the podcast! :)

Emotionally, I wanted to evoke a strong, proud, and optimistic mood.

Outro music

There’s also an outro version, which is softer, has a reduced instrumentation, and is less dramatic and epic. It also flows downwards, musically, to give listeners some nice closure at the end of the episode.

I used the open-source DAW Ardour to produce these, as well as the Creative Commons-licensed orchestral sample library Virtual Playing Orchestra.

The podcast

Make sure to check out “Ihro Mayastät” here:

xkcd in Toki Pona toki-pona-xkcd 2019-10-23T14:56:00+02:00 blinry Toki Pona is a minimalist constructed language created by Sonja Lang in 2001. It has around 120 root words and a very small grammar, and you can learn it in a few hours.

To practice this language, I started to translate some of the “xkcd” webcomics by Randall Munroe, which are published under a CC BY-NC 2.5 license. To make my life easier, I’m basing my translations on the SVG files of the German translation project xkcDE by Peter Schlömer, released under the same license.

My translations are released under the terms of CC BY-NC 2.5, as well. The font is Comic Jens Bold by Jens Kutilek, published under CC BY-ND 3.0, you can download it from 1001 Fonts.

mi toki e pakala la sina o pona e ona! musi pona!

505: kiwen mute lili

Thanks to jan Ne for proofreading! (Original version)

1133: tomo tawa mun nanpa luka

Thanks to jan Kiki for proofreading! (Original version)

2287: jaki li ken ala pakala

This was a collaborative translation with jan Kiki. (Original version)

Hungry Spider hungry-spider 2020-03-28T00:00:00+00:00 blinry Ever since I’d seen RujiK’s tweet about this, I wanted to try implementing inverse kinematics myself!

So for the Berlin Mini Jam in March 2020, I made a tiny prototype about a human-eating giant spider in Godot! :)

You can play it in your browser! Move your mouse, and click-and-hold to jump/eat people! :>

Made with Godot. You can find the source code on GitHub.


The Glitch Gallery glitchgallery 2020-02-18T00:00:00+00:00 blinry ]]> Wurst Day Ever wurst-day-ever 2020-02-02T00:00:00+00:00 blinry An abstract 2D puzzle game, inspired by Sokoban, Snakebird, and Stephen’s Sausage Roll. Repair all sausages to win! Like Writespace, this is a game with simple rules, but a lot of interesting consequences! I had a lot of fun discovering these consequences for myself and designing the levels. Each level holds a new idea for the player to discover. You can play it in your browser!

Alternatively, you can download binaries for Linux, macOS, and Windows.


“My favorite game at Global Game Jam Berlin!”

“You should add a few more levels, and then just put it on Steam!”

“Obviously, you know how to design puzzle games.”


This year, I participated in the Global Game Jam for the first time! I have a lot of experience with the Ludum Dare game jam, where you participate with your group from your own home. But at GJJ, you actually go to predefined sites, to participate with other follow jammers in person! I joined the folks in Berlin meetin at the SAE institute, and I enjoyed the experience a lot, especially demoing the resulting games to each other in the end in a fabolous presentation!

Also, it’s the largest game jam in the world, with about 50000 participating at the same time. This year’s theme was “Repair”! I intentionally wanted to make a solo submission, to see what I could come up with in 48 hours, and I’m super happy with the result!

Winnie created an original score for the game, which I really love! Thanks!


I tweeted a bit about the development of the game:

36C3 opening & closing 36c3-opening-closing 2019-12-30T16:30:00+01:00 blinry Bine and me on stage, after the closing

After Bine did the design for this year’s Chaos Communication Congress (a large, annual hacker conference taking place in Germany), she was asked whether she also wanted to do the opening and closing sessions! These sessions are intended to give the official part of the Congress a nice frame, and set a positive mood. So, this conversation happened in late November:

Bine: “Hey, you?”

Me: “Yeah?”

Bine: “I was asked whether I wanted to do the opening and closing. I can take a second person on stage, and thought you might be up for that?”

Me: “Oof. That would be pretty scary. But I bet we would make a good team. Let me sleep on that.”

Me: “Hmm, we could do some absurd statistics, like ‘the amount of Club-Mate consumed, in swimming pool equivalents’!”

Bine: “Or try a data poetry performance!”

Me: “Ohhh, yeah! Or highlight the work of those who don’t get a lot of attention. Or give tips against post congress depression?”

Bine: “Or use GPT-2 to do some completions?”

Me: “Or visualize Twitter trends over time?!”

(Next day)

Me: “Alright, it seems that I basically already decided yesterday, huh? We’re gonna rock that stage!”

Here’s what we came up with:


(We talked in German, live translation into English and French available via the cog icon.)

Alternatively, there are recordings on YouTube in German and English.


Same here, the original is in German, English translation available via the cog icon. Be warned that it’s a lot of untranslatable puns, though. Philipp (“the official dubbing voice of bleeptrack and blinry” :P) can frequently be heard sighing: “Ugh. It’s a pun. I’m sorry.”

Special thanks to lastfuture, who provided us with the awesome chaosschau-jingles. You can listen to the raw jingles here: intro, outro (CC BY lastfuture).

And thanks to everyone who contributed a newsticker headline! <3

Alternatively, there’s a recording on YouTube in German.

Operation Mindfuck Vol. 3 operation-mindfuck-3 2019-12-29T21:00:00+01:00 blinry At the 36th Chaos Communication Congress, Bine and I did a third “Operation Mindfuck” talk about art, computers and curiosities! You can find the previous editions here and here.

In this edition, we talked about strange chess variants, artsy Twitter bots, ray marching, daily drawings, mathematical paradoxes, leaf venation simulation, illegal prime numbers, and fun in latent space! Enjoy!


We gave the talk in German, but some kind friends did an awesome job live translating it into English! \o/ In the player, you can switch languages using the cog icon:

Alternatively, the recordings are also on YouTube in German:

and English:


Here are the slides we used: (Open them in fullscreen)

Gutes Cyber, Schlechtes Cyber cyber-sticker 2019-12-27T00:00:00+00:00 blinry Linus had the idea for this sticker – it’s a pun on a German soap opera! :P

Stickers that say "Gutes Cyber, schlechtes Cyber"

Find the print files here: SVG, PDF

How I do backups backups 2019-11-17T19:08:00+01:00 blinry I updated my backup strategy and this page in 2022.

Until 2019, my backup strategy was not very sophisticated: I occasionally made backups of my notebook on an external hard drive, using the command line tool rsync. It was a manual process, and I didn’t have a regular schedule, which meant that I basically only made a backup “when I thought of it” (often several months apart). If my notebook had been stolen, I would’ve lost a lot of work.

In 2019, I set up automated backups using borg, borgmatic, and rsync. My server had a backup of my notebook on it, and the other way around. If one of them exploded, I could’ve restored it using the other. This worked well, but eventually, my server ran out of disk space, and adding more storage would’ve been rather expensive.

In 2022, I switched to restic, another great open source de-duplicated backup solution, which felt a bit simpler and faster compared to borg. The only downside is that it needs more storage space, because it doesn’t compress the backups.

For storing the (encrypted) backups, I’m using Backblaze. They charge 5 USD to store 1 TB of data for a month, that seems very fair to me. I currently pay around 2 USD per month. I’d like something self-hosted even better, but I also badly needed to make automated backups happen again.

This page is documenting how I set up my backups, and how to restore them, mostly for myself. :P



  • Register a Backblaze account, and create a bucket.
  • Then, follow this guide.


  • If your notebook explodes, get a new machine, and install restic.
  • Log into using my main email account. You’ll need the Backblaze password.
  • At “Account -> App Keys”, create a new application key, and write down the keyID and the actual keyphrase.
  • Set the environment variable B2_ACCOUNT_ID to the keyID, and B2_ACCOUNT_KEY to the keyphrase.
  • Run restic -r b2:blinry-restic mount directory/to/mount/to, you’ll need the password of the blinry-restic backup for this step.
  • Copy out all of what you need.


I store all my passwords in a password manager called gopass. It’s a minimalist command line tool, and a reimplementation of the classic password manager pass. The passwords are stored as GPG-encrypted files in ~/.password-store/ on my notebook.


To install and set up gopass, basically follow the instructions on


To access the passwords, you need physical access to your notebook and the passphrase for your GPG key. If you don’t have access to your notebook, you’ll need the password for the user account on your server, the keyfile (see below) and the passphrase for the backup of your notebook, and the passphrase for your GPG key.

So I put some more thought into it. My backup strategy revolves around two devices: my notebook “thinkerbell” and my server “”. At this point, Internet connections are fast, and online storage is cheap, so I just store a backup of my server on the notebook, and a backup of my notebook on the server, using a combination of rsync, borgmatic, and gopass. The backups are fully automated and run once per day.

The motivation for this post is threefold: first and foremost, I wanted to write documentation for myself on how I do backups, and how to restore them. Second, I want to give you all the resources you need to set up a similar system for yourself. And third, this might be useful information in an emergency – some people I trust have access to my secrets listed below.


I do daily, nonincremental, unencrypted backups of all files on my server to my notebook, using rsync. Most projects which are deployed on my server I have locally versioned in Git anyway, so a single copy of the server’s files seems sufficient. I mostly care about configuration and log files, and it wouldn’t be catastrophic if I lost them.


Make a copy of the backup-server script. It uses rsync to make a full copy of the remote host, excluding some irrelevant directories, and especially excluding the directory where the notebook backup is stored, avoid cyclic backups (see below). Modify it to your liking. The script uses gopass to read the root password of the remote host, and stores the backup locally in ~/permanent/backups/

Set up a systemd timer to run the backup-server script each day. Copy the two backup-server.* files from my dotfiles repo to your local ~/.config/systemd/user/ directory, and run this command:

systemctl --local enable backup-server.timer

Alternatively, you could use a cronjob.


If your server explodes, you still have a snapshot of all files on your notebook, which you’ll need physical access to. Get a new server, and either install a base system and copy back the files you need. Or if your hoster has the option to mount the server’s complete emtpy file system, you can try to copy back all the files, I guess?


I do daily, incremental, encrypted backups of my notebook’s home directory to my server using borg. I really care about many files on my notebook!


Install borg (a command line tool for making incremental, encrypted backups) and borgmatic (a wrapper script for borg which simplifies its use). Create a copy of my borgmatic config, and modify it to your liking. Take care to exclude the location of the server backup to avoid cyclic backups. borg supports multiple modes to encrypt backups, we will use the “keyfile” mode, which stores an encrypted keyfile in ~/.config/borg/keys/. My configuration uses gopass to read the passphrase for decrypting borg’s keyfile, so you need to create one before you continue.

Run borgmatic init --encryption keyfile to initialize your backup. To make actually make a backup, you can use my (pretty trivial) backup script, which basically just runs the command borgmatic prune create.

Setup a systemd timer to run the backup script each day. Copy the two backup.* files from my dotfiles repo to your local ~/.config/systemd/user/ directory, and run this command:

systemctl --local enable backup.timer

Again, alternatively, you can use a cronjob.


If your notebook explodes, get a new machine, and install borg. You’ll need the keyfile, its passphrase, and the password for the remote user on the server who owns the backup directory. Copy the keyfile to ~/.config/borg/keys/. To list the available snapshots, run the following command:

borg list

To list the contents of an available snapshot, run a command like this:

borg list \

To extract files from an available snapshot, run a command like this, or leave out the filename to extract everything:

borg extract \ home/seb/wip/cool-project/


To summarize, the passwords you need to access all of my stuff are the following:

  • The password for seb@thinkerbell, the user account on my notebook.
  • The password for, the user account on my server.
  • The passphrase for the GPG key A624F8B6, which is used by gopass to encrypt my passwords.
  • The passphrase for the keyfile, which is used by borg to encrypt the notebook backup.

In addition, you’ll need the following two files:

  • My GPG private key (for the key A624F8B6) used by gopass to encrypt my passwords.
  • The keyfile used by borg to encrypt the notebook backup.

I hope this gives you an idea of how all the components I use for making backups play together. If you try implementing a similar system for yourself, and get stuck at any point, don’t hesitate to ask me for help! :)

SillyPond sillypond 2019-11-09T23:54:00+01:00 blinry This year, I participated in PROCJAM 2019 for the first time, a friendly jam around procedural generation!

My entry is called “SillyPond” (thanks for suggesting that name, sofia! It’s a generator for unplayable sheet music in the style of John Stump’s “Faerie’s Aire and Death Waltz”. Using a mixture of generative grammars, a linguistics library, noise functions, and a lot of hand-stitched random distributions, SillyPond constructs a description of sheet music, which is then converted to an image using the open-source music engraving software LilyPond.

You can find the source code on GitHub, and you can use it to generate your own sheet music! The README contains usage instructions, you’ll need Ruby and LilyPond installed. Both the code and the generated files are released under the terms of CC0 1.0. The official jam release is on

When working this generator, I really enjoyed that it’s basically a bunch of smaller generators, bundled together: a title generator, a subtitle generator, a melody generator, an instruction generator… – and that each part can be improved separately.

Giving the page some interesting high-level structure was the most challenging part for me. Because I don’t really keep a state while generating the elements, they tended to be distributed on the page pretty evenly. I solved this by using Perlin noise to influence some of the random distributions slowly, progressing down the page.

Fun fact: LilyPond can actually create MIDI files, so if you want to listen to “On the Beautiful Blue Penguin”, you can find an MP3 file here!

Some more examples:

Inkdiary 2019 inkdiary-2019 2019-10-31T00:00:00+00:00 blinry In October 2019, I visited Amsterdam and Berlin (multiple times), spend a lot of time with Toki Pona! :D

And here’s a Twitter thread with the individual drawings:

My time at the Recurse Center rc-talk 2019-09-14T21:00:00+02:00 blinry The Recurse Center describes itself as “a self-directed, community-driven educational retreat for programmers in New York City”. In Spring 2019, I spent three months there, and loved it! At MRMCD 2019, I gave a (German) talk to share my experiences!

You can open the slides here, and here’s a recording:

Alternatively, you can find a recording on YouTube.

Content of the talk

The Recurse Center is a continuous experiment on how to build and maintain a healthy, diverse, and inclusive Community. Over many years, it established some structures and traditions which I really liked, like the weekly feelings check-in, or the coffee chat bot, which supports people getting know each other quickly in a group. I think many of these ideas can be transfered to other communities.

There are four simple social rules, which promote mindful and kind behaviour, and lead to an environment where people can focus on learning from each other. What happens at RC is almost completely shaped by the participants - they are trusted to know best how to structure their time, in the tradition of the Unschooling movement.

This is a quite personal talk where I tell the story of how I got into the Recurse Center, what I did and learned there.

Making video games in a weekend game-jam-talk 2019-09-04T14:40:00+02:00 blinry At the Chaos Communication Camp 2019, I gave a talk about “the why and how of game jams”! This is an extended version of my earlier talk Dare to Ludum Dare, offering a more general view on game jams.

Here’s the recording - you can switch between English audio and a German live translation via the cog icon. If you prefer, there are also English and German versions on YouTube. You can open the slides here.

Game Jams



Game I worked on:

Ludum Dare

One Hour Game Jam

A Flicker of Hope a-flicker-of-hope 2019-08-07T13:45:00+02:00 blinry This is the second full song I ever created!

I had been flirting with the open source music creation software LMMS for many years, and always found it quite archaic and ugly. But a few weeks ago, I was annoyed how that prevented me from actually making music, so I decided to try to become friends with it. And while there are some annoying things missing for a really smooth workflow, I was actually pretty happy with the software.

I had the lead melody for this track in a drafts folder for several years, and expanded it to a full song. Thanks a ton to lastfuture, who gave me incredibly helpful advice, that made the song a lot better!

You can listen to it on SoundCloud or download it as MP3 or FLAC. The LMMS project file is available here, you’ll need the FluidSynth soundfont for the distorted guitar.


With dancing mousecursor, in the style of Kevin MacLeod. :D

The Hitchhiker's Guide to Iceland hitchhiking-iceland 2019-08-05T14:32:00+02:00 blinry Rohieb and me just spent 10 days in Iceland! When we initially planned this trip, we realized that Iceland is an expensive country. So we figured that, instead of renting a car, or booking apartments, like many people seem to do, we could bring a tent, and hitchhike around! The two of us had already hitchhiked for a short section of our trip in the Scottish Highlands last year, which was the first hitchhiking experience ever for both of us. That had been exciting, and also went reasonably well, so we agreed to try that again in Iceland. We didn’t really know what to expect, of course. Here’s what happened.

From Reykjavik to Mosfellsbær

For the first three nights, we booked an AirBnb in Reykjavik (or, as we abbreviated it, R7k, because we’re lazy and have no manners). I slept pretty badly the night before we had to leave our apartment, and was nervous all morning. What would happen? Where would we end up? Would we actually be able to find a place to put our tent, and find water and electricity? And would people actually stop when we put out our thumbs?

Adding to that, it was raining that morning, not ideal conditions for trying this for basically the first time. We sighed, put on our rain jackets, pulled rain covers over our backpacks, and headed outside. We had a destination in mind: Þingvellir (the Þ is pronounced like the th in “thing”), which is of historical importance to Icelanders - an early form of democratic assembly met there for hundreds of years, and it’s also where the independence was declared in 1944. To get there, we knew we had to get to the Ring Road (Road 1) that goes all the way around Iceland, follow it a bit to the north, and then head east. We walked up to a somewhat traffic-heavy street in central Reykjavik, found a bus stop, and raised our thumbs.

We had written a sign (on a sheet of A4 paper) that said “[1] North / Þingvellir”, that we showed to cars that passed by. Of course, the sign got wet and soggy, and people didn’t really seem to notice us. We tried another section of that street, a bit further down the road, but didn’t really notice a difference. A man who lived in a nearby building stepped outside and approached us, and recommended to take a bus to a better traffic hub. We thought that seemed like a good idea; positioning ourselves closer to the edge of the city in the right direction would make it more probable that cars would go our way. So we paid 440 Icelandic króna each (about 4 USD/3 EUR), and actually took a bus to one of the last towns inside Greater Reykjavik - Mosfellsbær (the æ is pronounced like the i in “icy”), which also already was located on the Ring Road.

From Mosfellsbær to Þingvellir

We figured that Þingvellir might be a popular destination for people passing through Mosfellsbær, so approaching tourists at a gas station might work. We spent 15 minutes or so asking people who stopped for gas “Excuse us, are you going to Þingvellir?” Not a single soul did. A friendly-looking man with an Icelandic accent recommended we should position ourselves next the street that went alongside the gas station. We decided to also take that advice, and soon realized that was a pretty good spot: that section of the street came out of a roundabout, so people were driving slowly, and actually had time see us and our sign. There also was a conveniently placed lay-by, where cars would be able to stop safely.

It was here where we first got some reactions from the drivers: some shrugged apologetically, because they had no room left (either because their car was filled with their own luggage, or with kids riding in the back seats). Some seemed to applaud our valor, and cheered us on with various gestures - shaking their fist, flexing their biceps, or putting up their thumb in response to ours. Some waved very friendly, a reaction that was not very helpful for us. Many people just seemed to be delighted and amused by the idea of people trying to hitchhike along the Ring Road, and we exchanged many smiles with people, which was always nice. Standing in a spot like that was actually a lot of fun for me! By far the most common reaction, though, was no reaction at all.

Very quickly, though, after at most 10 minutes, an older lady stopped in the lay-by. For a second, we were unsure whether she actually stopped for us, but after she waved at us, we approached the car and opened a door. “I can take you in the right direction!”, she said. She allowed us to put our luggage (two large backpacks, two small backpacks, and a tent) in the trunk of her car, and we got in. She told us that she lived a bit behind the intersection where we needed to turn east, but kindly offered to take us a bit into the correct street, to a place where other people would be able to pick us up again. We mentioned that we were from Germany, and, after maybe half a minute of consideration, she said “Wir können uns auch auf Deutsch unterhalten!” Which we did for the rest of the short trip! She dropped us off at a campsite on the road to Þingvellir, and recommended to check out the nearby farm, where they would grow delicious vegetables!

We decided we wanted to keep going instead. Figuring out the best place to stand always took some guessing – we wanted to be seen by as many cars as possible, with many of them going in the right direction. They had to drive pretty slowly, and it had to be safe for them to stop. In this case, we stood next to the street to Þingvellir, in front of another bus stop, on the corner to the road to the campsite, so we would catch both streams of traffic. The road to Þingvellir was very straight at this point, so people could see us from far away – plus, all cars heading east were going in the right direction!

It took maybe 15 minutes for another car to stop, which was large and fancy. We introduced ourselves, and the driver introduced himself as Omar. He was headed for a place well behind Þingvellir, where he was going to spend the next weeks in his summer house with his family, which was already there. He enthusiastically described landmarks as we passed them – Þingvallavatn, the largest lake in Iceland, and Hengill, a nearby, prominent volcano. “You’re not scared of the car, are you?”, he asked, as he stepped on the gas pedal. “The speed limit is 90 km/h here, so we can drive 140!” He strongly stepped on the brakes again, as the car he wanted to overtake pulled out. “Tourist…”, he sighed. “Uh, I trust you!”, I said. We chatted a bit about our impressions of the country so far, and how there were so few trees. Omar told us a joke: What do you do when you get lost in a forest in Iceland? – You stand up! He also told us that all sheep in Iceland were roaming freely during the Summer, and that the owners would find them by their markings later in the year. Omar also spoke some German, because he had worked in Stuttgart many years ago, but he didn’t feel very comfortable using the language. He dropped us off at the Þingvellir Tourist Information Center, which was also where the campsite we wanted to go to was located. We were so excited after that, seeing that our plan had actually worked out, and getting there had been so much easier than we expected!

From Þingvellir to Mosfellsbær

Two nights later, we were ready to leave Þingvellir again. This section of Iceland has no bus network whatsoever, so we knew that hitchhiking had to work somehow. But, given how well getting there had worked, we were not too worried. Our destination for the day was Húsafell, a small town with a charming campsite, about 90 minutes to the north. There was a road directly going there, but we knew it passed through mountainous terrain, and we were not sure how many cars would take that route. We gathered our things, found a good spot to stand at the side of that road, and waited. We started the habit of using a timer on our phones, to know how long we had been there. This road indeed seemed to have very, very little traffic. We counted maybe 7 or 8 cars in the 30 minutes we waited there. One driver made a gesture to signify he wasn’t going very far. He stopped in the picnic parking spot opposite to us, got out with another person, they walked up a nearby path, and disappeared. When they returned 10 minutes later, we approached them. “If you’re trying to hitchhike there, you’re going to wait for three days”, he said with that distinct Icelandic accent, “few people take that road, because it’s so mountainous. Going back to the Ring Road and heading north would be your better option.” We nodded, as that was indeed our backup plan. “We don’t assume you’re going there?”, we asked. “No, I’m actually working, I have to safe a company bus. Uh, also, if you walk up that path, you’ll find a pretty creek! No tourists there, at all!” Again, we decided to take both pieces of advice. We quickly checked out the creek (it was indeed very pretty!), and then found another spot by the street going back to the Ring Road.

I think we waited for another 20 minutes, before someone stopped. Again, the person behind the wheel was an Icelander who was driving by himself. He introduced himself as Helgur. I had gotten into the habit of asking people about their experiences with hitchhikers, because we started to see a pattern: all people who picked us up told us that they often would see hitchhikers on the road, and would take them whenever possible. Helgur was no exception. He was just returning from a stay at his summer house, and was on his way to Reykjavik, where he lived. Getting to casually chat with locals was something I really enjoyed; we asked about Hákarl, the fermented shark that we had seen in the supermarket. At least Helgur didn’t like it at all, but had some family members who did. His hobbies included skiing, and he said that he would sometimes do that after work, half an hour away from Reykjavik. He also mentioned that, close to his summer house, there would be a geothermal area with hot water in the ground. His family had made a special bread there called hverabrauð (“hot spring bread”): you put a special bread dough in a container and bury it in the ground for 24 hours, after which it is done. As we stopped at the intersection with the Ring Road, he got a large package of that bread from his trunk and let us try it – it was delicious, very dark and sweet and dense, almost like cake. “Here, you can have it all!” We couldn’t thank him enough. This seemed worth the long wait!

We scouted around for the next location to stand. We needed to go north, and Helgur had dropped us off at a traffic-heavy, almost highway-like street coming out of another roundabout, with no buildings in sight whatsoever. In the direction we needed to go, the best spot we found was next to an emergency lane, but we soon realized this was a bad location to hitchhike: cars were going too fast, and they were busy watching the road, and where they needed to go. To make things worse, two tracks of the street merged into one at that point, so drivers were focusing on that, as well. We first sat down in the middle of the roundabout for lunch, and then headed in the direction of the closest village, which was a few kilometers away. This was one of the things we learned that day: try to get dropped off at a good location, definitely not at busy highway-like intersections, and preferably, close to some civilization… The village we reached was, again, Mosfellsbær, where we had started our first hitchhike. We stocked up one some food in a nearby supermarket, and stood at exactly the same place as the first time, this time only showing the half of the sign that said “[1] North”.

From Mosfellsbær to Borganes

We had luck again: after 15 minutes or so, a woman stopped. “I’m not going far”, she said, “only to Grundarhverfi”. We looked it up on the map, it was mabye one fourth of the way to Borganes, where we would have to leave the Ring Road again. But we thought that going in the right direction was a good idea. The woman seemed quiet and a bit shy, but while I was careful not to annoy her with too much conversation, she was the one that kept asking questions and finding things to talk about. She was driving back from work to where she lived. Interestingly, Grundarhverfi still belongs to Reykjavik, even though it is seperated from the city center by 10 kilometers of water, and there are no bridges or ferries, you have to drive all the way around a fjord. We told her that we were interested in the Icelandic culture and the language, and that we had installed Icelandic keyboards on our phones, which she found hilarious. Because of Iceland’s history, all school children learn Danish, and I asked about how that language compared to Icelandic from her point of view. “It’s so bad! Ughh!”, she spat out, and imitated some cawing noises, “all that chhh and tchhhh! I don’t like it!”

As we approached Grundarhverfi, we realized we might run into a problem: the village was tiny, and there were definitely no good places to stand - cars would move way to fast along the Ring Road. So our only option was to stay on the town’s gas station, and hope that someone of the few people stopping there would take us with them. A bit worried, we showed our sign to the few cars leaving the gas station. Incredibly, after at most 5 minutes, a driver lowered his side window. “Hi, I can take you!” Another Icelander. Of course. “Are you afraid of dogs?” We told him that we would be fine, and he made some room for our luggage in his little bus. One of us had to squeeze in next to a cage on the back seat row, which contained a calm, 1-year-old dog, which was sleeping pretty much all the time. The driver, Ivar, was a young, athletic person with a short beard and a restless energy. His bus was old, but seemed to be cared for well. Ivar turned on the radio. He was actually going through Borganes, and then was headed into the backcountry, to go to… his summer house. Well, what else did we expect. He showed us some pictures on his phone, which was mounted next to the steering wheel. They showed an aerial view of a large house next to a lake, built into a thick forest, unusual for Iceland, and also some jets skis. “Yeah, it’s fun there! We also have snow mobiles!” “And camera drones, apparently?” He smiled. “Yup!” Ivar was going to meet a friend, who would stay in the house the next weeks, and in exchange, Ivar would borrow his caravan.

The way to Borganes was long, and we got to touch on many different topics. Ivar also had been in Germany, “to train with GSG 9.” “Are you working in security, then? Or for the police here?” “Yeah, police.” I asked about Icelandic names, and if people would ever use someone’s last name. “No, never. I’m just Ivar, the second part of the name is not important.” He told us that a recent law had allowed people to take on arbitrary first names, independent of their gender identity or presentation. “Times are changing”, he remarked, but from what I could tell, he rather liked that change, and thought it was progressive. “And the second part of the name is derived from the father’s name, most of the time. My son is called ‘Ivarsson’, for example. But that doesn’t have to be the case.” I asked how he had experienced the financial crisis of 2008, which had hit Iceland especially hard. “Oh yeah, I lost a lot of money back then… that was not a good time.” We drove through one of Iceland’s longest underwater tunnels, and passed a long fjords, which housed two aluminium smelters, and a whale hunting company – a touchy subject for many Icelanders, so I bit on my tongue, not to ask any more questions about that. Ivar also remarked on how he thought Icelandic politicians were corrupt and not telling the truth most of the time. While my impression of Icelandic politics had been pretty positive, I guess the internal perspective can be quite different…

“We’ll be in Borganes soon! I’m going to take you over the bridge, into the city, so you can go to another gas station.” That was really thoughtful. Ivar even recommended a specific gas station, and dropped us off there. We said our heartfelt thanks, and he went on his way. At this point, it was already pretty late, and it had been a long, exhausting day, so we decided to stay in Borganes for the night. That’s one of the great things about Iceland: it has a really extensive network of campsites! There’s one in practically all larger towns, and also in some of the very small ones, which gave us a lot of flexibility.

After that night, we changed plans. The final leg of the journey we now had in mind was getting to the peninsula Snæfellsnes, all the way in the west of Iceland. (A friend remarked that Icelandic place names all sound like little dragons :3) That day, we spent many hours at gas stations and bus stops trying to get a hitchhike, but this time, it didn’t work out at all. Granted, the road there was long and lonely, and doesn’t have a lot of traffic. So in the evening, we concluded our hitchhiking adventures in Iceland, and just took a bus there.

Lessons learned

The only people who took us were Icelanders driving on their own, and we sometimes wondered why that was. Maybe Icelanders felt more obliged to help people visiting their country? Maybe the tourists travelling along the Ring Road had a lot of luggage of their own, and were not sure we would fit in? Maybe they were anxious about what would happen if they took us with them (I certainly would be!), or maybe couples wanted to spend their time alone? Another hitchhiker we met on the campsite in Borganes told us that some tourists had stopped for her, and that two guys would probably have a harder time.

Our A4-sized sign was definitely too small, it was only readable from a distance of 15 meters or so. We thought that getting a large piece of cardboard from a supermarket, and using a felt pen instead of a pencil would be a good idea. During our fruitless wait in Borganes, we looked around online for tips and tricks. Some people recommended holding the sign upside down, so people would stop out of pity. :P Or writing something silly on it, like “I DON’T STINK!” or “Runaway bride”…

The location makes all the difference. Like mentioned, places where drivers go slowly, don’t have anything else to focus on, and are headed in the right direction anyway, seem optimal, but they can be hard to find. Talking to people at gas stations didn’t work for us, but that’s maybe also because we had rather obscure destinations in mind. Taking locals’ advice on where to stand or on how to behave, however, worked well for us.

Doing this trip definitely gave me a strong sense of self-efficacy, the feeling that I’ll be able to deal well with similar situations in the future. Travelling as spontaneously and flexibly as we did was exactly what I needed, and I can’t wait to do more of that!

Maybe hitchhiking is also something you could try? :)

Further resources

While writing this post, I found Hitchwiki, which is a brilliant, extensive resource. Wikivoyage also has a short site about hitchhiking.

The Recurse Center, month 3 rc-month-3 2019-07-05T13:42:00+02:00 blinry The last part of my daily checkins at the Recurse Center, after months 1 and 2! In this month, I transitioned to doing much more graphical/interacive stuff.


Hey everyone! :green_heart:


  • Created an animation with @Winston Smith (S1’19)! We used p5, and learned things about easing functions, and about how to plan and structure this kind of multi-step animation! Also, publishing this as a GIF on Twitter was a pain in the ass, we got the best result when exporting all frames individually, opening them as layers in GIMP, and then exporting them as a GIF. :confused: Even though, in the resulting tweet, everything still looks a bit blurry. As for actually making the animation happen: we don’t store any state, but have formulas in place that give us the transformations we want. You can peek at the p5.js source code here, if you want. Fun fact: we actually had another movement pattern in mind, but a bug produced this, so we decided to keep it! Out of appreciation of the fabulous @beesandbombs, we internally called this project wasps and (gre)nades. :P arrows.gif
  • Crawled the RC API to get people’s metadata and profile descriptions, then finetuned a GPT-2 model on that. Again, I’m amazed by how fast I got good results. Funny highlights:


My name is Dasabuki Shinoda. I was born in Kyoto, Japan but spent most of my life in Tokyo. I was a professional model in two stylists’ and an assistant manager’s jobs. I then started working as a model in a fashion photography studio, and found that modeling, photography, and editing were not the most exciting and fulfilling of my interests.

I’ve since discovered the power and joy of design and programming, and have been working for a well-appointed desk ever since.

I’m now trying to figure out what the heck I really am.

I’ve been programming for a while, and recently fell in love with the idea of living in the past, and using computers as a tool for self preservation.

What I’d like to learn and work on at RC

Go, go, go

In programming I’ve primarily used Python, which is my natural language and the most natural language for programming I have.

Other than programming I love to listen to and study to the same.

Most of all, I want to get better and master my passions (music and food).

Installing ImageMagick 3.0 and getting some testing/predicting working.

Installing and setting up a “no-fuss” automated testing environment for my codebase.

Getting some “yes” questions from the community about my codebase and project in general.


  • Give a juggling workshop!
  • More GPT-2 finetuning. Maybe create a tiny web interface to display the results?


Hello, friends! :recursecenter:


  • @Tim Vieregge (SP2’19) and I wanted to get back into the habit of meditating regularly, so we made an accountability/support group in the #meditation stream, and are doing micro check-ins there since Monday. Join us! :slight_smile:
  • The juggling workshop was so fun, thanks everyone for joining! Let’s do another iteration of the Recurse Circus next Monday!
  • Paired with @Alan Chu (SP2’19) on the command line tool that helps you insert Co-authored-by tags into commit messages. All Git repositories have the convenient .git/hooks/prepare-commit-msg hook that allows you to modify the commit message before it is opened in your editor! We first wrote a shell script to insert co-author tags, and then rewrote the thing in Go, which took 10 times as many lines, but is also (at least) 10 times prettier! And it’s unit tested!
  • Was surprised to see that my brain still can spit out some Blender shortcuts after almost a year of not really using it. (@Nick Aversano (SP2’19) tried to extrude 2D vector graphics of bugs into 3D, and had some… bugs in his workflow :P)


  • I didn’t get to the thisrecurserdoesnotexist web frontend yesterday, so I might do a bit of that today! よし!!


Hey :}


  • Started making an ambient generative art thing with @Kate-Laurel Agnew (SP2’19)! The vision is a Zelda-style pixelart garden landscape. We started out with a prototype in Nicky Case’s Emoji Playground, where we defined rules for a complex cellular automaton: empty spaces sometimes spawn a seedling, which can grow into a tree, which occasionally drop nuts. Then we had squirrels moving around, which multiply when there are many nuts, but die from overpopulation. And so on. IMG_20190604_115336.jpg
  • After that, as a first step for implementing something similar ourselves, we wrote some Javascript that fills a canvas with randomly colored squares! :palette: Also, seems helpful for figuring out the keycodes of Javascript input events!
  • Made a web interface for This Recurser Does Not Exist! You can check it out here: REDACTED! Because the model could hypothetically leak real personal information, it’s password protected: Username “REDACTED”, password “REDACTED”. This version contains about 500 pre-generated profiles. Please send me a screenshot if you find something funny! :) screenshot-2019-06-05_134132.png


  • Would be a fun exercise to also generate photos for This Recurser Does Not Exist! The model would probably take the full name of a person as an input? I might do some research on how to do that today.
  • I brought my roommate’s watercolor supplies for crafternoon! Never tried that before!


Long time no see, #checkins stream! :O I had a lovely, quiet weekend. Got some organizational stuff done, got eaten by mosquitoes, and tried using watercolors for the first time! Wrote 25 postcards in total, that I’ll send off to 5 countries today! \o/ #victory 2019-06-08.jpg


  • Attended the study group, and learned about embeddings and convolutional neural networks!
  • Read the GPT-2 paper, and skimmed the two papers it’s based on. Biggest takeaway: the researchers probably also don’t really understand why and how the resulting models work. You just wire together a network in a way that makes sense to you, train it, and hope for the best! :D
  • Spontaneously paired with @Winston Smith (S1’19) over dinner on drawing plane-filling fish and a tool to do so, and on snakes^Wcaterpillars moved by Perlin noise.
  • Chilled with @Maren Beam (SP2’19) to some sick techno/house beats in Church. We gotta do that again! :green_heart:


  • Paired with @Vidhi S Shah (SP1’19) on training a GAN on the photos in the RC directory. Interesting to see how such a setup can be coded from scratch – we mostly sticked to this PyTorch tutorial. While the results are not realistic per se, I’m (again) super amazed by that training a this from scratch for a few hours gives so good results! screenshot-2019-06-10_130441.png
  • Gave a demo on This Recurser does not exist, which was super fun!


  • Made another animation with @Winston Smith (S1’19)! This one is based on an optical illusion called “contrast asynchrony”. Brains are weird! contrast-asynchrony.gif


  • Another juggling meetup aka Recurse Circus :P
  • Put together tomorrow’s talk about tools for self-organization. Fun fact: I wanted to give a similar talk at another event last year, but… didn’t find the time to prepare it. Oh, the irony!
  • Faculty invited me to give a talk at this month’s Localhost! :open_mouth: Gonna think about a good topic today. Which technical talk I gave at RC did y’all enjoy the most?


Hey all! :sunflower:


  • Recurse Circus! Thanks for joining, everyone! Good to see so many of you being happy with their progress! We ran out of juggling material on Monday, and had to improvise with paper cups and these little rubber animals for making tea! :D
  • Spicy thai food at Ugly Baby! :chili_pepper: Sweet/salty food at Milk Bar!
  • Submitted a talk proposal to the Chaos Communication Camp in August (about the why and how of game jams!)


  • Continued working with @Kate-Laurel Agnew (SP2’19) on the Infinite Garden ambient art project – we got some CC-licensed pixel art plants, and and planted them randomly in a grid! :seedling:
  • Great evening of non-technical talks about marathon running, technical diving, and lucid dreaming! Followed by an exursion to ssh! We collaborated on making a screen dedicated to RC (southeast of the Red Outpost, if you wanna visit)! screenshot-2019-06-13_143416.png


  • Paired with @Valerie Woolard (S1’19) on some NLP fun in Python: The Antonymizer replaces words in a text with their antonym, the Glossifier replaces words with a longer definition, and the Emojifier replaces words with their emoji equivalents. Running the first paragraphs of Alice in Wonderland through those filters was fun! :P
  • Paired with @Winston Smith (S1’19) on an interactive animation using nannou, a multimedia framework written in native Rust (thanks for mentioning this, @Zach Krall (S1’19))! The animation is based on the perpetual diamond illusion, which is pretty mindblowing! We might share a more finished thing later.


Yo, what’s up? :cat:


  • Most people I’ve ever seen in an in-batch feelings check-in! :O Thanks for your vulnerability, everyone, it means a lot to me! I shared the realization that I really like it if people use a neutral pronoun like they/them for me, so feel free to try that sometime, if you want! :blush: (But other pronouns are okay, as well!)
  • Gave a presentation about the Museum of Accidental Art (please don’t share the link publicly yet). I probably want to change the name, not to clash with the @accidental__aRt project – I’m attaching a poll, if you want to help me find a good one! Please submit your pretty bugs! screenshot-2019-06-17_185707.png
  • Really enjoyed exploring group theory using @Alex Berke (SP1’17)’s coloring book, thanks for making that event happen, Alex! I wish my algebra professor had framed cyclic groups that way! :D


  • Did a weekend trip to Washington, DC! (Uh, I always thought that was short for “District of California”, even though I found that strange… also, I always wondered which state Washington was in, heh. Was good to learn about the history of that place!) One of the things I liked most in DC was the excellent scooter sharing infrastructure, whee! :kick_scooter: And I touched a moon rock!!


  • Gave a dry run of my Localhost talk about legit! Thanks for attending, @Jenny Xing (S1’19) @Jaryn Colbert (S1’19) @Aaron Sikes (S1’19) @Winston Smith (S1’19), your feedback was super valuable for me! :green_heart:
  • Continued working on the Emojifier with @Valerie Woolard (S1’19)! We’re now using a better tokenizer and a part-of-speech estimator to only replace nouns, adjectives, and verbs. We tried to be clever about finding grammatical forms which work best when looking them up in Emoji dictionaries (we’re using this one, which also has alternative names embedded in the source code). The results are pretty solid, and sometimes, confusing and funny! (Valerie, wanna share some examples? :D)

(Valerie added the following:)

Yes! So since we stopped pairing on emojifier I polished it up a little so it takes in a file as a command line argument. Some choice transformations:

And the young king was then married to his true wife, and they reigned over the kingdom in peace and happiness all their lives; and the good fairy came to see them, and restored the faithful Falada to life again. -> And the young 👑 was then married to his true wife, and they reigned over the kingdom in ✌ and 😌 all their lives; and the 👍 fairy came to 👀 them, and restored the 🐶 Falada to life again.

(I thought the faithful -> 🐶was particularly inspired)

I should like a drop of sweet red christening wine myself -> I should 👭 a drop of 🍭 👺 christening 🍇 myself.

suddenly a White Rabbit with pink eyes ran close by her -> suddenly a White 🐰 with 💗 👀 🏃 close by her


Hey all! :green_heart:


  • Practiced and gave a Localhost talk about the legit programming language! When I published the language last month, I posed the challenge of writing a quine in it – the output of the program would consist of the Git commands required to create itself. The punchline of the talk was that someone on the Internet actually ended up doing that!!! :open_mouth: Here’s the program, which also contains some tools and documentation: I’m trying to find more about this person. Maybe it’s a soulmate? A soulmate with too much time. After the talk, people proposed new challenges: A transpiler from another language to legit! Or a self-hosting legit compiler! :’D screenshot-2019-06-20_170446.png


  • Went to @Valerie Woolard (she) (S1’19)’s Surrealist App Workshop, where we coded up Rails apps in 1,5 hours! Before I went there, I thought the concept was intimidating and scary. :scared: The slides which served as an inspiration explain that the event is about making a lot of mistakes, and asking for help. :wink: It was super fun, hectically scrambling for the docs, debugging strange errors, and always wondering if things like model names should be written in singular or plural. The concept was exquisite corpse-style coding: @Finn Boire (he) (S1’19) and me wrote the backend for a peace negotiation app involving camels, the frontend for a song/lyrics database of very distasteful songs, and gave a presentation about spawning rare insects that really like tacos, and why people should invest one million USD in that app. :P screenshot-2019-06-20_163423.png
  • Paired with @Winston Smith (he) (S1’19) on making a basic web interface for editing L-systems! Very satisfying to see it all fall into place, and being able to modify parameters with fine-grained sliders! Also, I learned that P5.js has functions to easily create interfaces like this (like createInput).
  • Got a 15-minute crash course on Haskell from @Tim Vieregge (he) (SP2’19)! What a fun, elegant language! :O I digged out a 2D graphics library called gloss, that feels very satisfying to use. I digged around in the demos, and especially liked the Tree one. @Winston Smith (he) (S1’19) and I modified it to be an ever-changing sequence of STOP sign trees. :D stop-tree-small.gif


  • Super intense feelings check-in, oof. Thank you all for your vulnerability and love and kindness, it means a lot to me! :hugs:


Hello! :heart_kiss:


  • Felt exhausted and quiet, so I spent most of the day on the couch in the library, reading Learn You a Haskell For Great Good (which apparently is available online under a Creative Commons license!) I found it mostly enjoyable and easy to read. Some of the examples involve sexism and fat shaming. :sad:
  • Point-free style functions blew my mind! That’s when you define a function without explicit arguments, because its definition involves functions which are missing arguments, as well! For example, instead of writing double x = 2*x, this works, too: double = (2*). Weird!
  • I had a vague idea of how to do IO in Haskell, but now I think I understand it a bit better. Also, I learned that IO can look very elegant. For example, here’s a program that reverses the lines of its input individually. The interact function is predefined, and runs a String -> String-type function on the input, which we construct using the function composition operator .:

main = interact $ unlines . map reverse . lines

  • @Tim Vieregge (he) (SP2’19) showed me how Zippers work in Haskell. I really, really like this way of looking at data structures!
  • Tried to print a Hive piece with @Nick Aversano (he) (SP2’19) on the M3D printer in Turing. Uh, we had to disable the warning in the OctoPrint interface running on the Raspberry Pi that this was an unsafe device, and could potentially catch on fire? :fear: The result was… not great, and resembled a warped hexagonal cracker. (Even though PLA is biodegradable, please don’t eat it!)
  • Went to the 16th MP3 Experiment in Prospect Park in the evening. It was silly and fun, thanks for joining, everyone!


  • Attended @Winston Smith (he) (S1’19)’s L-systems workshop! Find the online editor here! I never really understood how they worked, but after playing around with them in the editor, I think I’ve got it! I learned that doing things intentionally is hard (making a simple spiral, for example), while doing random things that look interesting is really easy (wildly orbiting loops? Unexplainably squiggly snakes?) screenshot-2019-06-25_124239.png
  • Paired with @Kate-Laurel Agnew (she) (SP2’19) on implementing movement mechanics for the Infinite Pixel Plant Garden. Right now, we add rows and columns to the 2D grid whenever we’re about to leave it, which I feel is very in line with the garden being potentially infinite! :blush:
  • Paired with @Finn Boire (he) (S1’19) on generating chord progressions! Finn has scraped all of over the last weeks, and we tried to use deep learning to process that. The results were not really overwhelming, but also not unpleasant, and mostly seemed to stay within the same key, and produced some pleasant patterns, including the very common I–V–vi–IV progression.
  • And then, we decided just to throw the complete songs, including the lyrics, into GPT-2. As always when I’m working with that model, I’m blown away by how well it worked. This is what we got, rather early in the training (note the “S” chord, and the rather touching last verse). Also, we let it run overnight on a larger input – I can’t wait to check out what happened!

     C# D#          Bm            G
I couldn't understand
   F F#          C#
How could you forget

I didn't know when they left but I guess

Fucking shit, I didn't know how long I'd been looking for
Fucking shit, I wasn't able to understand
   F#  C# S F#
I never wanted you and I never want for anything
           Bm                  G
I couldn't understand
   F#   C  S    F A C#
I didn't know when they said goodbye
C  C#      F#  F##
I heard that little boy crying his guts out
  F# D#         F#
I heard that little boy crying his guts out
F#  C           C#
I heard that little boy crying his guts out

I didn't know when they left but I guess
F# C#         F#
I knew when they left and they came back
C# F#
I didn't know when they left but I guess
F# F#
I never wanted to hear them say goodbye


Hello! So, here I am, writing my last in-batch check-in! :O It has been a pleasure, thanks for everyone who followed along!


  • @Winston Smith (he) (S1’19) and I made another animation! \o/ In this one, we change the angle of several L-systems, and smoothly transition them into each other. Meet: Sierpinski Arrowhead, Hexagonal Gosper, the Hilbert Curve, and the Dragon Curve! fractals.gif
  • Gave a talk about the minimalist constructed language Toki Pona! Slides with resources: toki-pona-talk.pdf I also made a #tokipona stream, for maybe practicing it in the future with you! :) This was the last round of non-technical talks organized by @Jaryn Colbert (she) (S1’19) and me, glad to see that @Zach Krall (he) (S1’19) will take them over! :tada:
  • Went to the Plotter People meetup with @Winston Smith (he) (S1’19) and @Wesley Aptekar-Cassels (they) (m4’19), which was a very nice and inspiring event! Paul, the organizer, explicitly expressed that he would love to see more Recursers there in the future!


  • Played against @Yoni Elhanani (he) (SP2’19)’s Ultimate Tic-Tac-Toe Solver with him, and won! \o/ Also Yoni, stepped me through the code – certainly the largest and most elegant Haskell program I’ve seen so far!
  • Checked out the results of the longer-trained song generation GPT-2 model with @Finn Boire (he) (S1’19) – it doesn’t seem overtrained yet after 5000 steps. The resulting songs are mostly coherent, and mostly have pleasant chord sequences, that kind of stay in key. We wanted to give an ad-hoc performance at tonight’s presentations, but it seems we missed the opportunity to sign up. :wink:


  • Give hugs to everyone who wants one! :hugs:


I wanted to add a few closing thoughts to this topic. At this point, I’m back in my hometown Braunschweig, which is conveniently located in the center of Northern Germany. Miss y’all a lot! :green_heart: My time at RC has been one of the most intense, joyful phases of my life, and I feel immensely grateful and privileged that I got to share that with you!

Here’s an open invitation for my fellow batchmates, alumni, and future Recursers alike: come visit me anytime! I can offer comfy places to stay in both Braunschweig and Berlin, and added that info to the couch surfing page on the wiki. If you’re ever in or near Germany, I’d love to meet you, feel free to hit me up!

Also, message me anytime you just want to chat – most things are interesting to me, but I have a lot of experience with interactive and visual stuff, self-organization, and open relationships. My email address is, and my main phone number is REDACTED (message me via Signal, WhatsApp, or Hangouts!)

You can follow me on Twitter, Mastodon, and GitHub, and probably other places, I’m “blinry” everywhere. :P My homepage has an RSS feed, if that appeals to you. Alternatively, you can conveniently subscribe to my newsletter! I also have a small Patreon page, if you feel like want to support my open source logo design work, or the nonverbal IDEA-style assembly instructions (and occasionally want to get postcards! :3).

A few thoughts for the Summer 2 folks coming in next week (hi! :wave:): in my experience, there’s no “right” way to do RC! Listen to what you need each day, and don’t feel guilty about doing exactly that. At the same time, I’d encourage you to try the things that scare you most. Remember that comparing your own inside with other people’s outside is not a fair comparison. Go to feelings check-in! Practice vulnerability, and make lots of mistakes! <3

See you in #alumni-checkins, and at NGW next year! :)

HTTP codes bot httpcodesbot 2019-06-20T00:00:00+00:00 blinry For some reason, this bot is consistently funny to me! 😂

This bot is powered by the text generation engine Tracery, and hosted on Cheap Bots, Done Quick!, where you can also find its source code! To read it, start from the “origin” text at the bottom, and work your way up through the tokens which are expanded recursively!

The Recurse Center, month 2 rc-month-2 2019-06-02T23:53:00-04:00 blinry Continuing my check-ins from the first month! Putting all of these together, I’m astonished on the variety of stuff I worked on. (Also, the Recurse Center is very neat, and you should all go!)


Hey everyone! I really needed some time off :exhausted:, but I’m back, and I feel kind of re-energized at this point. Oof.


  • Went to the event planning meeting and co-volunteered to organize the non-technical talks during the second half of my batch, together with @Jaryn Colbert (SP1’19)!


  • Published a blog post about my first month at RC, which is basically just a collection of these check-in. Wrote some helper scripts to help me with tasks like collecting all images included in these posts.
  • Polished up the docs for legit, and made the final logo, preparing a public release.


  • Published a blog post about legit, which includes the specification, and some examples. Happy to see it was well-received! One question that came up a lot is how to pronounce the name – and people agreed that it’s probably pronounced like “GIF” :P Also, I learned that you can actually do this to meta-track the changes in a Git repo:

      cd .git
      git init
      git add .
      git commit
  • Talked with @Jaryn Colbert (SP1’19), @Kiwako Sakamoto (SP1’19), and @Corin Faife (SP1’19) about organizing the non-technical talks. @Kiwako Sakamoto (SP1’19) made some very helpfull additions to the wiki page on how the event works! Sent my first message tagging Everyone at RC :bell:
  • Started working with @Jaryn Colbert (SP1’19) on making more forgiving: if a person has multiple first names, it should be sufficient to guess one of them. If a person has an alias (like me ^_^), it should be sufficient to guess that. Adding last names should be allowed.
  • Feelings check-in was really important and relieving for me. Thanks, y’all! :green_heart:
  • Gave a talk about writing generative grammars with Tracery. I should really make the HTTP status generator into a Twitter bot sometime. “311 No Choice” :P
  • Another round of Company Meet & Greets! I enjoy the format a lot.


  • Pair on game engines, Twitter bots, or!
  • Teach juggling?
  • Also, visit MoMA later today (it’s free on Fridays!)


Hello, lovely people! I spent this weekend reviewing talks for Enthusiasticon, walking through East Village, digital painting (I really want to do this more!), and making Biangbiang Noodles (fun fact: The Chinese character for that dish has 58 strokes!)


  • Continued implementing more forgiving name guessing for with @Jaryn Colbert (SP1’19). We think we’re almost there!
  • Added a “drop a marker and share the link” feature for with @Vidhi S Shah (SP1’19).
  • The “New Order” exhibition at MoMA was pretty neat, and not as full as I had expected. Also, I found this treasure on the top floor: IMG_20190503_193450.jpg


  • Even though it itches me to transition to new topics (Machine learning! Functional programming! Generative Art! ALL the frameworks!), I think I’ll keep looking at low-level stuff for a while: I’d like to learn how WebAssembly works (or what that even is), and write a tiny silly module for the Linux kernel! So maybe I’ll start with one of those topics today.


Hey all, how are you today? :sunflower:


  • Looked at what WebAssembly is and how it works. Especially Mozilla’s tutorial series seemed helpful. I think it’s hilarious that the tool converting the text-based representation to the byte format is called wat2wasm :D Wat! The language itself is interesting: Only four types (i32, i64, f32, f64), a very strict interface on how to use wasm code from JavaScript, a Lisp-like syntax based on s-expressions, and a stack-based computational model.
  • Wrote a “hello world” wasm module, here’s how it comes together with HTML and JS: screenshot-2019-05-07_132825.png
  • Looked at how to compile Rust code to WebAssembly, but that process seems so multi-layered and convoluted to me that it’s losing all elegance and the result is not very aesthetic to me. :/
  • Set up auto-formatting in Vim using Prettier (thanks for the recommendation, @Nick Aversano (SP2’19)!) and ALE. It’s so satisfying not having to do code formatting yourself! <3
  • Realized that WebAssembly is not interesting to me right now. :grinning_face_with_smiling_eyes: When exploring other technologies, like x86 assembly or the ELF format, I feel like I get new insight of stuff I already know works. WebAssembly adds another layer, and seems targeted at people who want to build high-performance applications (like game engines) for the browser. It does not add new functionality, it adds efficiency to critical pieces of your software. It’s good to know more about it, but I’m not going to explore that more, I think.
  • Instead, I wanted to look a bit at the Linux kernel! I wrote my first simple kernel module, xkcdrandom, that creates a device called /dev/xkcdrandom – when you read from it, you always get the number 4 (“chosen by fair dice roll, guaranteed to be random”). Writing kernel modules is a surprisingly pleasant experience! screenshot-2019-05-07_134531.png


  • Explorables/Observables workshop with @Toph Tucker (SP2’19)! :eye:
  • Finishing that Faces feature with @Jaryn Colbert (SP1’19)! :camera:
  • Learning how to play Dwarf Fortress with @Kate-Laurel Agnew (SP2’19)! :pick:
  • Looking for more ideas for fun kernel modules! I drew much inspiration from @Kamal Marhubi (m2’18)’s “rickroll” module, which hijacks the open syscall and always opens a “Never Gonna Give You Up” whenever userspace tries to open an MP3!



  • Made an account on Observable and learned a bit about how to make notebooks there. I think it’s a brilliant tool for making interactive explanations! Thanks to @Toph Tucker (SP2’19) for hosting the workshop! :green_heart:
  • @Jaryn Colbert (SP1’19) and me wrapped up our feature for more forgiving name guessing in!
  • Non-technical talks were so good! Check out @Max Chiswick (SP2’19)’s photos of his 12000 km bicycle tour through Africa, for example! :O
  • Built a neat little dwarven fortress with a very patient @Kate-Laurel Agnew (SP2’19). Then, we saved the game, and tried to have some fun by attacking a giant moose (apparently, a dangerous enemy when you don’t have any armor or weapons? In the end, nobody died, but I think the dwarves puked a lot out of fear?) and digging a tunnel to a nearby river to flood the common rooms (surprisingly, the dwarves didn’t care and kept socializing. Pool party? In the end, we built some escape stairs on which they – reluctantly – climbed to the outside).


  • Pairing with pears was great, thanks to @Maren Beam (SP2’19) and @Nick Aversano (SP2’19) for hosting that! Let’s do this again! I started building an Observable noteook about teaching OpenGL fragment shaders and ray marching with @Toph Tucker (SP2’19), and we got on all kinds of tangents :D We ended up with this magnificent shader: screenshot-2019-05-09_131921.png
  • Photography meetup! I learned about darktable, an open-source photo postprocessing software
  • Overcooked is a very neat game!


  • Think about how to make the Map of RC as useful as possible for NGW. Does anyone want to meet up with @Alicia Thilani Singham Goodwin (F1’17) and me to think about that?
  • Today the SP1 batch is never-graduating! :cry: The six weeks went by so quickly! :O


Hello~ everyone! :octopus:


  • Discussed some design questions regarding the Map of RC with @Alicia Thilani Singham Goodwin (F1’17).
  • Brainstormed ideas for silly Linux kernel modules with @Jeanine Peters (SP2’19)! Shrinking your video output by one pixel every minute? Making your mouse pointer move in reverse? Swapping two random keys on your keyboard? We tried actually implementing the last idea – diving into Linux’ code base was surprisingly fun! We learned how to enumerate input devices, and how to find out which drivers are attached to them – so that’s how we found drivers/input/keyboard/atkbd.c, which defines the driver for my Thinkpad’s internal keyboard. We still don’t reallly understand how scancodes relate to keycodes, but we managed to swap the x and z keys! We just copied the driver, made modifications to the scancode table, recompiled, unloaded the original driver, and loaded ours. What could possibly go wrong. I’d love to do more of this! :D


  • Worked a lot on the Map of RC, and released v0.2, featuring the positions of the first aid kits, and the fire extinguisher. Also, we’d previously left out the electrical closets, because they were not in the architects’ floor plan. Oops!
  • Split out the project into three repositories: map-of-rc contains the base SVG, contains the framework for the online version, and map-of-rc-tiles has the map tiles in different resolutions, which are used by the online version, and can be regenerated at will.
  • Paired with @Tim Vieregge (SP2’19) on making a “self-guided tour” flyer, which we hoped would be useful for the people exploring the new space for the first time during Never Graduate Week!


  • Visited the School for Poetic Computation for their student showcase. One of my favorite installations:
  • Attended !!Con. Oh wow. I’m so glad the talks were recorded, so I can share some of them with y’all! Will try to take some time this week to do a little write-up.


  • Try not to be overwhelmed by all the amazing stuff going on at RC during NGW! :grinning: I’d like to take a loot at the CTF, and @David E Lu (W1’16)’s AV systems talk sounds amazing!


Hey there, lovely people! I’m getting more input than I can process currently, which is an interesting feeling, and I think I’m fine with that! :grinning_face_with_smiling_eyes:


  • Talked about game dev and obscure digital art forms at the artist meetup organized by @Andrew Yoon (F2’16)!
  • Went to the CTF intro, and formed a group called Octopus on Toast (because we found an artificial slice of toast and a plush octopus in Sammet when we first met there)!
  • @Jacob Kozak (W1’17) gave us a whirlwind intro on the disassembly/debugging suite radare2. Super amazing to see what you can do with it! I had looked at the GUI a few times before, but the terminal version (which includes a visual mode) is so much better! We got really close to solving the IoT pet feeder challenge on Monday!


  • Fixed the remaining off-by-one errors for the IoT pet feeder challenge! I think it’s easy to get addicted to the rush of adrenaline you experience when you’ve solved a problem like this!
  • Attended the APL workshop by @phoebe beatrice jenkins (m4’18). We started with basic features, and ended up with a Game of Life implementation (consisting of a single line of scary-looking symbols)! Hilarious!
  • Had a lonnng walk over Brooklyn Bridge with @Adelle Housker (W2’19), talking about family, life after RC, and coding bootcamps.
  • We solved all challenges except for cakebox! :tada: This is so fun. I’d love to do more CTFs in the second half of my batch! People have told me good things about picoCTF?
  • Localhost talks were amazing! :green_heart: Felt a bit like a continuation of !!Con. Good job everyone!


Hey everyone! :wave:

Very exciting to see so many new friendly faces in the space! Looking forward to get to know you in the next week(s)! I have some catching up to do! Last week was “Never Graduate Week”, and participated in my second “Capture The Flag” event, so a lot of this check-in is about that:


  • Joined @Alicia Thilani Singham Goodwin (F1’17)’s outreach drive and messaged three wonderful people I think would be a perfect fit for the RC community! Also, put recommendations for them in RCs internal application system.
  • Pondered some more about the cakebox challenge with @Yoni Elhanani (SP2’19) and @Alex Segura (SP1’19) and @Shanti Chellaram (SP2’19) (the goal was to build a ZIP file containing a single file with the same MD5 hash as itself)… but to me, it felt like we would need to spend many more hours to get it done, so I gave up at this point.
  • Went to the place that must not be named, before I knew it was off limits. :surprise:
  • Had lovely conversations with @Gabrielle Singh Cadieux (F2’17) and @Adrien Lamarque (S1’16)!


  • Joined a discussion on community software and how to maintain it, organized by @Jason Owen (SP2’19) and facilitated by @John Hergenroeder (SP2’15). :green_heart: We identified the problem that an overview of community-built projects are really hard to find (there’s a list in the wiki). We’ll also do some knowledge transfer this or next week for the S1 batch.
  • By Thursday, my social batteries were pretty drained, so I spent the rest of the day listening to talks. For example, @Andrew Yoon (F2’16) showed off spectrophone, and @Rachel Hwang (m7’18) and @Adrien Lamarque (S1’16) demonstrated their reaction-diffusion system implemented in GLSL!


  • CTF wrapup! I was curious to learn how @Cameron Finucane (SP1’18) had set up the Observation is… key! challenge. This is what he answered: “I read the manual” :no_mouth:
  • Started doing challenges on picoCTF 2018, a beginner-level CTF that is open the whole year. Exactly what I need right now! If you’re interested in security stuff, definitely hit me up, I’d love to pair on solving some of these challenges!
  • Learned what a shellcode is! It’s basically a series of bytes that encode position-independent machine instructions, which, when executed, do something interesting! If you can somehow take control of the instruction pointer, you can jump there! For example, here’s some instructions spawning a shell. The spare slash gets added to make the length of the string divisible by 4: screenshot-2019-05-20_200549.png
  • When putting together shellcodes, it’s important to avoid zero bytes (because many functions expect zero-terminated strings, and will ignore everything you put after that). Sometimes, you need to use tricks to avoid zero bytes, like only writing to al (the lowest byte of the eax register), which shortens the operand in the machine instruction. Or, if you want to include a call instruction, to avoid zero bytes in the relative offset that goes after the opcode, a trick is to do a near-jump to a position in the end of your shellcode, and then do the call with a negative operand (which will be filled with 0xff bytes). This stuff is so fascinating! :grinning_face_with_smiling_eyes:
  • Learned about format string exploits, and how a thoughtless printf(string_from_user) can be abused! I might give a presentation about that this week.


Good morning! :sunny:


  • Gave guided tours through the physical RC space in the morning.
  • Meeting new folks from the S1 batch was exciting! I love what y’all are interested in, the new energy you bring to the space, and I see lots of potential for collaboration!
  • @Tim Vieregge (SP2’19) and I wanted to put together some fun Linux kernel modules! Inspired by a conversation with @Jeanine Peters (SP2’19), we had ideas like “move the mouse cursor in unexpected ways”, “shrink the screen by one pixel each minute”, or “filter all network traffic and make images appear upside down”. After some poking around in the source tree, we found that the kernel didn’t feel like the correct place for those tasks, and decided to focus on a higher layer in user space. We discovered that modern versions actually support multiple simultaneous mouse cursors, which is absolutely hilarious on its own! We wrote a program using Xlib and Xinput2 that makes two mouse cursors attract/orbit around each other. :stuck_out_tongue_wink:


  • Continue working through picoCTF.
  • Put together simple examples of basic binary exploits.
  • More Fun with Mouse Cursors?


Hey, y’all! Not feeling great today. I’m having a bad headache since Tuesday morning, that makes it hard to focus. That sucks, but I expect it to go away in a day or so.


  • Put together two simple examples of a buffer overflow exploit and a uncontrolled format string exploit. Turns out that’s surprisingly hard to do, because modern compilers have all kinds of security mechanisms built in, like stack canaries, that abort execution of a program if someone tries to overwrite the return address of a function. You need to turn that off explicitly. Also, there’s a kernel feature called ASLR, which randomizes the position of the different parts of a program in virtual memory when it’s loaded and executed, so that functions are not at fixed addresses, for example. You can also turn that off. Third, modern C standard libraries don’t have the gets() function anymore, you need to switch to an older standard to use it. And fourth, modern compilers will scream at you angrily that you really should not use gets()! :grinning:
  • @Evy Kassirer (m4’19) and I tried to connect her macbook to the pen plotter. We didn’t succeed, but we discovered that you can write stuff to other terminals if you find out which device in /dev they are connected to!
  • Plotter meetup! I like to think about how to use devices in unintended ways, so I suggested controlling the pen in real time, using a mouse! I’m super glad that @Wesley Aptekar-Cassels (m4’19) actually made that happen! The result feels a bit like an etch-a-sketch.
  • Continued working on the multiplayer mouse cursor thing with @Tim Vieregge (SP2’19). What we currently have is rather hacky, but fun! We’re planning to give a presentation on it at the end of this week.
  • Talked to @Christopher Ray Ertel (S1’19) and @Shae Matijs Erisson (S1’19), who might be interested in forming a team for a CTF in the next weeks!? :tada:


I’m going to take it easy today. Ideas include:

  • Learn more about APL, after being introduced to it by @phoebe beatrice jenkins (m4’18)’s during NGW! It’s a fascinating, concise language with many weird symbols, like the worried face operator: ⍨
  • Document how works, and how future batches can make changes to it!


I’m better today, my headache is almost gone! :fireworks:


  • Talked with @Glen Chiacchieri (m4’19) for almost two hours. We touched on a lot of topics, and I had some of my assumptions challenged (about psychoactive substances, about the goal of meditation, about the role I could play in other people’s lifes). I took away a lot from that conversation. Thanks, Glen!
  • Worked through the APL tutorials on – I still think the language is hilarious! Some of my favorite operators are the domino ⌹ (which inverts a matrix), the fire hydrant ⍎ (which executes a string as APL commands), and the worried face operator ⍨ is actually called commute and modifies the function before it to swap its operands. “But blinry”, I hear you ask, “how do you type all these weird symbols?” Well, some people use APL keyboards (Dyalog is selling a modern one, but on and similar environments you can also prefix ASCII characters with a backtick to generate APL symbols – the domino is ``+`, for example. screenshot-2019-05-23_124056.png
  • Here’s my first attempt on a FizzBuzz implementation in APL. It generates the numbers from 1 to 100, maps them to pairs of the number and the replacement string, and displays either that one, or the number, if the string is empty:

      {(0=⍴⊃⍵[2]):⍵[1]⋄⊃⍵[2]}¨{⍵,,/(0=3 5|⍵)/'Fizz' 'Buzz'}¨⍳100
  • Dealing with pairs like that felt really clumsy. Here’s my second attempt – for each number, it creates an index into an array consisting of the replacement strings and the number itself, and select the correct one:

      {'FizzBuzz' 'Buzz' 'Fizz' ⍵[(0=15 5 3|⍵)⍳1]}¨⍳100


  • Create some minimal documentation for the Map of RC.
  • Community software intro & feelings check-in!
  • Give a talk about nonverbal algorithm assembly instructions.
  • Visit the student showcase at NYU’s Game Center in the evening.
  • I’ve brought Icehouse Pyramids for game night, anyone up for some Zendo? @Yoni Elhanani (SP2’19)


Hey folks! :rainy: :rainbow:


  • Gave a talk about IDEA, and had @Ian Ross (SP2’19) and @Christopher Ray Ertel (S1’19) betatest the BLÖCKCHÄIN one. In particular, we don’t have a good analogy of hashing yet – currently, it’s something like a meat grinder producing Rubik’s cubes! :laughing: Better ideas would be super welcome (please don’t share publicly yet):


  • The showcase at the NYU Game Center was fantastic, see this topic! I want to go to one of their usual Thursday events soon!


  • Implemented automatic pointer detection and better orbital mechanics for MouseToy. One of the important thing remaining is automatic restructuring of the device tree when you have, for example, three external mice attached. Currently, you need to configure them yourself to be independend from each other.
  • Met @Alicia Thilani Singham Goodwin (F1’17) in her office hours. I wasn’t sure what to work on next, and felt a bit lost. There are so many interesting things to learn, and I found it hard to prioritize. Preparing for this meeting already helped a lot – I made a list of things I want to do, and divided them into several categories:
    • Things that seem mysterious/scary, but maybe not fun:
      • Low level stuff:
        • How does Linux start up? What’s an init ramdisk?
        • How is the Linux kernel structured? What exactly does it do?
        • Still a bit more about dynamic linking and the tools around that.
      • Machine learning! Tensorflow! GANs, transformers, style transfer networks?! GPT-2! BERT?!
      • Network stuff: How to configure interfaces? How does IPv6 work? How to properly use Wireshark?
    • Things that seem interesting to me right now:
      • RISC assembly
      • More security stuff/CTFs
      • Haskell/LISP
      • other languages, like Elm, Typescript
    • Things I could benefit from in the future:
      • Devops: How to deploy an application? How to back up its database?
      • Learning frameworks! Flask, React, Vue, …
      • Building pretty web interfaces
      • WebRTC
    • Things I would enjoy, but already feel kind of comfortable with:
      • Making generative art, learn more about algorithms involved and frameworks like Processing
      • Making games, learning Unity/Godot?
      • Learning live coding environments
    • Things others would benefit from:
      • Make interactive articles about stuff I know well
      • Improve the map
      • Make a hub of community projects
      • Make the wiki more accessible/clean it up

    Alicia encouraged me to go for the scary/mysterious things, which is also the rule of thumb I had in mind. So I think I’ll spend the next week or two getting my hands dirty with deep learning. Another tip she had was to use the resources of RC while I’m here – be it the wonderful people with their diverse interests, or the HEAP cluster. I’d love to keep doing visual and interactive stuff after RC, and I’d love to find more people to collaborate with on those, so maybe I’ll also incorporate a bit of that into the second half of my batch.

  • Brainstormed about a Toki Pona text adventure with @Brandon Hopkins (SP2’19) and @Nick Aversano (SP2’19)… not sure how to approach it best. Visuals would be super helpful, but a lot of work. We could try to translate an existing point & click adventure? Are there games like this under free licenses? Toki Pona is a constructed language with a very minimalist grammar and about 130 words. Maybe I’ll bring it to the next language exchange. :smiley:


  • I’d like to play with GPT-2! Exciting to see that the medium-sized model has been released by now! I think there are methods for fine-tuning the model with additional training data. While walking to RC this morning, I thought about which kind of text to throw at it – maybe RC directory profiles? “This Recurser does not exist”? :wink: Or my own tweets? I already have a personal Twitter bot that imitates me, @yrnilb, which produces surprisingly interesting results, given that it only uses Markov chains!
  • Give a talk about my stem cell donation.


Moin! (That’s a generic, casual greeting in northern Germany. An appropriate response would be: Moin!)


  • Tried and failed setting up Tensorflow on the HEAP cluster. Seemed to have some incompabilities between the local CUDA version and the Tensorflow version. Consulted with @Vidhi S Shah (SP1’19), thanks!
  • Did the first round of non-technical talks with @Jaryn Colbert (S1’19) (and without @Kiwako Sakamoto (SP1’19) and @Corin Faife (SP1’19) :sob:)!
  • Gave a talk about the time I donated stem cells four years ago. If you can, please order your own registration kit here! You might be able to save someone’s life!


  • Worked on adding more details to the Map of RC with @Winston Smith (S1’19)! The subdomain currently doesn’t seem to work (investigating!), but here’s how it currently looks like: screenshot-2019-05-30_134151.png
  • Collaborative Indie Game night was fun, we played an obscure… experience? … called KIDS, Lovers in a Dangerous Spacetime, and The Messenger (the soundtrack is so good)!
  • Finished setting up Tensorflow on the HEAP machine mercer. Took me about five attempts to get it right, but what worked for me was installing Conda locally, and then running these commands (which also sets up gpt-2-simple):

      conda create -n tf tensorflow-gpu cudatoolkit=9.0
      conda activate tf
      ~/anaconda3/envs/tf/bin/pip install gpt-2-simple
  • As a quick test of the finetuning step, I fed the complete text of The Name of the Wind to OpenAI’s pretrained 345M model. I was absolutely surprised by how fast that produced good results! During training, a sample is printed each 100 steps, so I could watch as model learned. After the first 100 steps, it wrote a dark story about death and dying:

My father was not dead. He had stopped breathing. There was a look of pain on his face, but he did not know what was wrong.

I took the dagger and set it against his chest. He lay there, and I let him die. I took the dagger and put it in the water.

Two men came at my father. I went to them and they came to me. I had them all tied to the tree. I had them all tied up. I had them all killed.

After 200 steps, it had already learned about the names of characters and places in the book. After 1000 steps, I didn’t really see improvement anymore. Generated text range from realistic conversations, to mythical background stories, to action-laden fights.

Here’s two characters from the book discussing the composition of a song about in-world places and objects, smoothly transitioning between dialog and poetry. This blew my mind:

“Nahlrout,” I mused. “How is it similar to that?”

She looked at me. “How really? Surprised the hell out of me.” She laughed. “How do you propose we compose the chorus?”

“I could compile a crescendo,” I snapped. “I know an excellent rhyme or meter that would make the most sense.”

She rolled her eyes. “I could, perhaps.”

“In any case, it will serve you right. The second movement of the chorus is:

“On the road to Tinuë

Through Tinuë

I stopped at an inn to get refreshment

And decided to walk to the Eolian

To see if my nahlrout had worn off.”


  • Polish MouseToy with @Tim Vieregge (SP2’19) and give a presentation about it tonight!
  • Visit NYC Resistor in the evening!


Hey lovely people! :green_heart:


  • Converted my fake HTTP status code generator into a Twitter bot: @httpcodesbot screenshot-2019-05-30_034936.png
  • Also, @Nathan Jonathan Goldbaum (S1’19) introduced me to and and, which are all super cute. :dog: :cat: :goat:
  • Polished MouseToy some more with @Tim Vieregge (SP2’19). Tim found out how to change the appearance of cursors, so we could implement a game of tag! Was super fun giving a presentation/demo about it in the evening! If you’re interested in trying it yourself, the source code is here:


  • Check whether the Recursor API gives you access to people’s profile descriptions. Finetune a GPT-2 model to them and see what happens!
  • Make some animations in p5 with @Winston Smith (S1’19)!
waspsandnades waspsandnades 2019-06-01T12:31:00-04:00 blinry

An animation Winston and I made at the Recurse Center. Out of appreciation of the fabulous @beesandbombs, we internally called this project wasps and (gre)nades. :P

I learned a lot about easing functions and about how to plan and structure this kind of multi-step animation! Also, publishing this as a GIF on Twitter was a pain in the ass, we got the best result when exporting all frames individually, opening them as layers in GIMP, and then exporting them as a GIF. Even though, in the resulting tweet, every looks a bit blurry.

As for actually making the animation happen: we don’t store any state, but have formulas in place that give us the transformations we want. You can peek at the p5.js source code here, if you want.

Fun fact: we actually had another movement pattern in mind, but a bug produced this, so we decided to keep it!

legit legit 2019-05-01T17:07:00-04:00 blinry

Ever since I gave my first talk about esoteric programming languages, I wanted to create my own one. Well, some years later, at the Recurse Center, I wanted to learn how to build compilers with LLVM, so that seemed like a good opportunity to try that! Presenting:

Programs written in legit are defined entirely by the graph of commits in a Git repository. The content of the repository is ignored.

legit is designed so that all relevant information is visible when running git log --graph --oneline. For example, here is “hello world”:

Thanks to rohieb for the original idea! Influences for the design of this language include Folders, Befunge, Brainfuck, and Elymas.

A fun consequence of programs defined by a Git history is that you can’t properly track versions, because they already are Git repositories. All you can do is force-push a new version to GitHub.

You can find implementations of legit, as well as some example programs, on GitHub: The entry in the Esolang wiki is at

Here’s how the language works:


In each legit program, two data structures are available: A stack, and a brainfuck-like endless tape, with a head moving on it. Both hold signed integers.

Control flow

Execution starts at the commit pointed to by the master branch. Commit messages can contain a series of instructions, seperated with spaces, which are executed one by one. Only the first line is considered, so lines after that can be used for comments.

  • If a commit has only one parent, execution will continue there after executing all instructions in the current commit.
  • If a commit has multiple parents (numbered 0, 1, 2, …), the top stack element will be popped. If that element is n, to go n-th parent, or to the last one, if n is outside of the available range.


For all instructions, popping from the empty stack will return a value of 0.

Control flow:

  • [<tag>]: jump to the specified Git tag. For example, [loop] will jump to the tag loop.
  • quit: stop the program.


  • get: read a char from standard input and place its ASCII value on the stack. On EOF, push a 0.
  • put: pop top stack value and write it to standard output as a char. The value is always truncated to an unsigned byte.
  • <Number>: push the specified integer on the stack. For example, 42 will push the value 42.
  • "<Letters>": unescape string, then push the individual ASCII characters on the stack. For example, "Hi\n" will push the numbers 72, 105, and 10.

Stack operations:

  • dup: duplicate top stack value
  • pop: pop top stack value and discard it
  • add: pop two topmost stack values, add them, push result on the stack
  • sub: pop two topmost stack values, subtract top one from bottom one, push result on the stack
  • cmp: pop two topmost stack values, pushes 1 if bottommost one is larger, 0 otherwise

Tape operations:

  • read: place value of current tape cell on the stack
  • write: pop top stack value and write it to the current tape cell
  • left: pop top stack value, move tape head left for that many places
  • right: pop top stack value, move tape head right for that many places


I’ll be honest with you: I got tired of writing Git commands by hand to create legit programs. One consequence of the execution going top-down is that you have to write your programs backwards, and each time I’d make a typo, I’d have to start all over, because the commits above that would be invalidated. So… I started to write shell scripts, which would then generate my legit programs. You can generate the examples like this:

make -C examples

Alternatively, you can also clone them directly from GitHub:

hello, a simple hello world program:

rot13, a ROT13 implementation:

brainfuck, a fully-functioning Brainfuck interpreter, conveniently proving that legit is Turing complete!


The repository provides both an interpreter (better suited for development and debugging purposes) and a compiler (which produces highly efficient binaries).

For both, you’ll need Ruby, and the “rugged” Gem:

gem install rugged

Running the interpreter

To execute a program, run

ruby interpreter.rb examples/hello/

Running the compiler

The compiler compiles a legit program to LLVM IR. You can then use LLVM tools to build binaries for all plaforms where you have a C standard library available (legit will be linked with exit, getchar and putchar).

First, run the compiler to create a .ll file:

ruby compiler.rb examples/hello/

And then, run a tool like clang to optimize it and produce a binary:

clang -O3 hello.ll -o hello

As an alternative to the second step, you can use the provided Makefile and simply run make hello.

The final challenge

So, after I had written that Brainfuck interpreter, I thought would be the final milestone for my language. But then, Kate-Laurel sat down next to me and asked: “Could you write a quine?”

So this is the challenge I now give to you, dear reader: Write a legit program that prints the Git commands required to create itself! Good luck.


Turns out at least two people were up to the challenge, and actually wrote a quine! I can’t believe it!

One is by remuladgryta, you can find a script to generate the legit program here! Daniel Temkin published a neat article about legit and remuladgryta’s quine on!

Another one is by LegionMammal978, you can find the legit program here!

The Recurse Center, month 1 rc-month-1 2019-05-01T00:09:00-04:00 blinry I’m currently in New York City for three months, to attend the Recurse Center, a self-directed, community-driven educational retreat for programmers.

It’s one of the best experiences of my life! <3 One of the many helpful traditions and techniques is to do check-ins, where you talk about what you did, and what you plan to do. I’ve found doing daily check-ins in RC’s internal chat system immensely helpful.

So, to share a bit of what what I’m doing at RC, I thought I would just dump all of it here. It’s kind of raw, I didn’t replace the Slack-style emoji syntax with actual emoji, for example – partly because not all of them are offical emojis. :P Enjoy!


Hey all! I thought I’d try doing these check-ins everyone is raving about!


  • First day at RC! The space seems amazing and full of possibilities! I enjoyed the meet-and-greet a lot, and would love to do that again sometime. Signed up for #Coffee Chats :)
  • Was quite overwhelmed by everything going on. Need to remember to take it slowly, intense days like drain my internal batteries quickly. Still jet-lagged. :sleeping:
  • I’d like to understand how programs compile down to bytes in an executable! To help with that, I built a tiny command line tool based on the nasm assembler, which interactively translates Intel-style assembly instructions to bytes: screenshot-2019-04-02_103003.png
  • Skimmed Intel’s x86-64 manual to learn how that translation works. Volume 2, chapter 2 is a good starting point. Started writing a miniature assembler, minias, which can compile a tiny subset of x86 operations to bytes – for now, syscall and some very specific immediate-value mov instructions: screenshot-2019-04-02_104733.png


  • Looking forward to the pair programming workshop!
  • Wrap the generated byte instructions in an ELF file, to be able to actually execute them. :sparkles:
  • Add more operations to minias, maybe cmp and jumps?


Moin! (In northern Germany, people use that as a casual greeting. A fitting reply would be: “Moin.” :D)


  • Paired with @Stephen Kell (m3’19) on a Game of Life implementation in Ruby, which I enjoyed a lot! I have a tiny amount of pair programming experience from when I participated in game jams, and I’d love to do that more here! Seems to take a bit of courage to initiate pairing, though. :O
  • Put together a 64-bit ELF binary header, and add a segment table entry which just loads the complete file into memory, and start execution at the beginning of the instructions. After a bit of fiddling, minias can now create little programs which… quit and return an exit code! :octopus: screenshot-2019-04-03_105009.png
  • Added more instructions to minias: cmp and ret were straightforward, but adding labels and jump instructions required me to extend the stucture of the code quite a bit. After that, I basically got call for free!


  • I have basic control flow, so the next thing I need is a way to work with data. ELF files have .data and .bbs sections to allocate space for static and dynamic data, I think. I’d like to find out how they work and extend minias to put them in the ELF binary. At that point, I should be able to compile a simple “hello world” program.
  • Learn about opsec with @Michael Zaneri (SP1’19)!


Good morning! How are y’all feeling today?


  • Implemented a simple db instruction, which you can use to put raw bytes into the binary.
  • Learned how the section header table is structured, and taught minias to understand section properly, so I can now split my programs into sections like “.text” (for code) and “.rodata” (for read-only data).
  • An ELF file also needs a “.shrtrtab” section which contains the names of all the sections. Implemented that. And for some reason, the first entry of the section table needs to be a NULL entry. I still have no idea why.
  • I can assemble a simple “hello world” now! \o/ Even though I’m still cheating a bit, and put the address of the text data directly into the instruction: screenshot-2019-04-04_104849.png


  • Fix a mistake in the Wikipedia article about the ELF format I stumbled over while implementing sections yesterday! :book:
  • To avoid the above “cheat”, the next step is to understand symbol relocation: The position of the “hello world” string in the binary is not known when assembling, that’s the job of the linker. So I’d like to learn how that works today.


Have a wonderful Friday, y’all!


  • Fixed the Wikipedia article, see above.
  • Debugging session on @Stephen Kell (m3’19)’s C++ code instrumentation tool cccppp.
  • Feelings check-in, presentations and game night. Had some wonderful conversations with people and maybe fell in love a little bit with this community. :green_heart:


  • I’ll take today off from working on minias. Going to explore the space a bit, see what other people are doing, maybe make some contributions to community tools like @Jason Owen (SP2’19)’s
  • Pair with @Nick Aversano (SP2’19) on his WebGL game engine.
  • Give a presentation on hand-writing an ELF binary. :writing:
  • Looking forward to the mob programming session tonight!


Hey :) Hope you had a relaxing weekend, and could recover from last week somewhat. I certainly did, took a long walk over Brooklyn Bridge and through the Financial District, and whew, this city sure is pretty!


  • Paired with @Nick Aversano (SP2’19) to implement sprite rotation in his game engine using the WebGL helper library TWGL (rhymes with “wiggle” :laughing:). Learned the JavaScript syntax for object destructuring and spread properties!
  • Prepared and gave a 5-minute presentation on how a very minimalist ELF “hello world” executable is structured. Got some positive feedback after that, which is super encouraging! :green_heart: Thinking of doing a longer session, where I can explain every single of the 167 bytes that make up the resulting binary.


  • I think I have a sliiight grasp by now of how symbol relocation is supposed to work. I’ll try to implement it for some really simple cases today. I’ve got a string table and a symbol table, and I still need a relocation table. The result will be one of those mysterious “relocatable object files” (.o) I’ve seen before, but never was quite sure what they were. I should then be able to use the standard GNU linker ld to do the actual relocation and generate a binary!


Hey all!


  • Implemented simple symbol relocation in minias! It only knows how to do a very specific relocation (when using mov with a label), but I can now assemble a “Hello world” without using cheats, which will create an object file which I then can link using GNU’s ld! This feels like a huge #victory! :fireworks: screenshot-2019-04-09_121844.png
  • Helped a charming group of people levelling up their Git skills! For practising GitHub’s pull request workflow, we started a simple recipe collection :P
  • Was convinced by @Tenor Tenor (m3’19) to use Vim’s buffers directly instead of tabs, like I’ve done for the last 14 years :P Installed the “vim-buftabline” plugin to make the transition less painful.
  • Paired with @Tim Vieregge (SP2’19) on writing a boot sector in assembly!!! Turns out if the first 512 bytes on a disk end with 0x55aa, the BIOS will just load them into memory and start executing the instructions?! This is so interesting! Here’s us booting into a “Hello world” from @Patrick McCarver (SP1’19)’s USB stick! (It was supposed to say “Hello RC” :P) IMG_20190408_180101.jpg We also wrote a bootsector which dumps its own contents to the screen! screenshot-2019-04-09_123454.png


  • Pair with @Colin Rothfels (SP1’19) on minias improvements in Rust!
  • Continue working through the OS implementation series (I’m using this one:
  • Maybe prepare a non-technical talk for tonight?


Hey, how’s your day going? :bunny:


  • Implemented proper bytestring handling in minias with @Colin Rothfels (SP1’19), so it can now output Unicode characters and emoji! :D
  • Started implementing a “_start” symbol, for the linker to know where the entry point should be. Encountered a weird bug where ld would not be able to see this symbol. Did a debugging session on this with @Jeanine Peters (SP2’19), and it turned out that the reason was the one place in my code that had a “FIXME” comment… ELF sections have this “info” field, which does different things for different section types, but for symbol tables, it is supposed to be “the index of the last local symbol, plus one”. I didn’t set this properly, and as “_start” has to be global, ld probably didn’t look at it at the correct position.
  • Read through the nasm documentation and through the x86 Wikibook, to get a feeling of what instructions I haven’t seen so far. I think most of them are very obscure and I will never need them. :D
  • Fixed a typo in Zulip!


  • At this point, I feel like I’ll get diminished returns from continuing implementing an assembler by from scratch. Before coming to RC, I thought it might be fun to also implement my own linker at this point, but I feel like I probably have a vague feeling of what it would do. Might be more fruitful to use existing tools to learn how dynamic linking works! When working with C, this has been the greatest mystery of all for me. :wizard_hat:
  • Find out how UEFI systems deal with boot sectors. @Tim Vieregge (SP2’19)’s notebook had a dedicated “legacy mode” for booting from those, but my T460s didn’t seem to have that.




  • Learned about the System V AMD64 ABI, a convention of how functions work on a low level – it defines how to pass arguments to functions via registers and the stack, for example. Used that knowledge to call a C function from assembly, and to call an assembly fom C, and link those pieces together.
  • Static linking seems straightforward, dynamic linking on the other hand seems like a huge jump in complexity. I looked at how to call a function from assembly and dynamically linking that (the magic line was ld printf.o -o printf -lc --dynamic-linker /usr/lib/, but it still feels very mysterious and I don’t know how it’s implemented.
  • Regarding boot procedure on UEFI systems, that seems to be reallllly complicated and I realllllly don’t want to try to do that by hand. :shock: On the upside, I found out that my notebook has a “legacy boot mode”, too! :D
  • Had an extended coffee chat with @Joe Mou (SP1’19) about organizing notes. I’m using a very simple Vim plugin called vimboy, which I built about 8 years ago, and which allows you to keep a personal wiki in plaintext. It’s one of those tools I use daily and couldn’t do without.


  • Salad! Coffee chat! Feelings! Talks! No fixed plans besides that for today, let’s see what comes up!
  • I don’t have a good idea yet of how I could understand dynamic linking better. Implementing tools has been helpful for understanding ELF files, maybe I should continue that, after all, and generate a simple dynamically linked binary from scratch.


Hey everyone, I hope your Friday will be really neat!


  • We used the Abstract Salad Factory pattern to successfully implement some delicious concrete salads! Let’s do this again!
  • Learned how to use gdb! I have to admit that I solely relied on print-debugging before, beause when I encountered bugs, it always seemed easier to just do that, instead of learning how to use a proper debugger. So it seems like a valuable time investment to learn that before you need it. And it’s pretty neat! Some things I learned:
    • Press Ctrl-X Ctrl-A (or use the -tui command line flag) to switch to a neat graphical mode where you can always see the source code, and have markers for the current line and for your breakpoints! If you remember one thing, make it this one.
    • Additionally, Ctrl-X 2 will show the disassembly of the current program, and pressing that again will show the CPU’s registers!!
    • condition 3 i == 10 will add a condition to breakpoint #3, and only halt execution when the condition is true.
    • You can use print for assigning to variables while the program is running! Example: print i = 10
    • gdb can also debug Rust programs! :sparkles: Use the wrapper rust-gdb (which comes with Rust) to have proper object printing. Use break rust_panic to halt execution when you run into a panic, to be able to backtrace.
    • (YouTuber voice) What are your favorite gdb tricks? Let me know in the comments below!
  • Gave a presentation about a project really close to my heart: Timelens!
  • Built a little React app with @Isaac Pearl (SP1’19) , which uses the Web Audio API to play back audio files you drag & drop on it – but backwards! Seemed to us like you could give wicked music performances with that tool!


  • On Fridays, I try not to have appointments, obligations, or any fixed plans, really. Let’s experiment!
  • I started thinking about what a really good interactive environment for learning and teaching x86 assembly might look like. Might think about that some more.


Hey everyone, hope you had a relaxing weekend. I did a lot of touristy things in Manhattan, like walking along the High Line, visiting Times Square and the New York Public Library’s Schwarzman building. I also wrote a short, interactive horror story! :D


  • @Tim Vieregge (SP2’19) and I looked at each other’s .vimrc! blush Some takeaways:
    • The vim-surround plugin is super useful for dealing with pairs of parens, brackets, and so on.
    • Also, why have I never used vim-commentary? It’s great!
    • Mapping ; to fzf’s :Buffers seems like a neat idea.
  • Tried these plugins and tidied up my Vim config files a bit.
  • Polished the Timelens userscript for YouTube. It visualizes a video’s color deveopment, making navigation more efficient, precise, and active. I’d love some feedback on this! youtube-screenshot.png


  • Now that I know my way around assembly language a bit, it might be fun to look at LLVM, and how it abstracts away from that. Maybe write some programs in LLVM’s intermediate representation?
  • Debugging, continued: look at how to debug JavaScript in the browser! That also seems like a super useful skill.


Hej! :)


  • Worked with @Zoe Larissa Statman-Weil (SP1’19) on refactoring and fixing bugs in her Mapbox-powered JavaScript application.
  • @Jeanine Peters (SP2’19) and I finished the leetcode problem on Sudoku puzzles we had been working on!
  • Skimmed the complete documentation on the LLVM IR, which is actually not that long! I feel like the parts which you actually need for building a frontend for simple languages could fit on a few pages.
  • Wrote a hello world and a ROT13 implementation in LLVM IR! This is how that looks like. The language is strongly typed, and definitely not meant to be written by humans! :D You have to include references to your types everywhere! Even though, it feels a bit more convenient than raw x86-64 assembly language, because you can actually type out your functions, and properly call them.
  • And then I thought, huh, let’s do a benchmark of the ROT13 binary which is created when you put this IR through all the built-in optimization passes on the one hand, and my raw implementation in x86-64 on the other. Well, turns out that the LLVM version is 60 times faster?!? When looking at what the binaries are doing with straceI found out that apparently, LLVM knows how to bundle my getchar and putchar calls together to blocksizes of 4096 bytes each, and operates on that! Mind blown, I didn’t expect that level of optimization! screenshot-2019-04-16_115518.png


  • As LLVM IR is not meant to be written by humans, what would be good ways to generate it? I think it comes with a code generation library in C++, but I’d rather use another language, to be honest! ^_^
  • Attend the event planning open meeting and the Localhost talks!


Good morning RC!


  • Looked at code generation bindings for LLVM. Rust has a crate which gives direct, unsafe access to LLVM’s official C API, and several unmaintained ones, which provide more idiomatic bindings. Both options do not really spark joy. There seem to be okayish bindings for Python and Haskell, even though I think they use older LLVM versions.
  • It would be nice to have a very tiny language to implement a compiler for. So why not make my own? I love esoteric programming languages anyway, and I always wanted to make one. The Esolang Wiki is a brilliant source of information around that topic, and there is a nice zine in RC’s library called “New Languages”, which I absolutely recommend to read!
  • Brainstormed some ideas for esoteric languages. It turned out that some of these already have been realized:
    • A language consisting entirely of emoji.
    • Write short English snippets describing what you want to do, the compiler will post the description on StackOverflow, and then insert the answer receiving the most upvotes.
    • A language based on knot theory, which can be realized on a piece of yarn.
    • In Russia, “Hello world” prints YOU!
    • A language which only uses expressions from Daft Punk’s song “Technologic”.
    • A language where programs are represented by positions on a Go board.
    • Horror Vacui as a programming language: The number of seconds which pass before you type the first character determines what the program does.
  • And then an RC-external friend hat a brilliant idea: A language where the program is described by the graph formed by commits in a Git repository. Have been thinking about that ever since. Writing programs in that language could be a good exercise in using history-rewriting Git commands. The graph could describe the control flow? Branching points are if/else or switch statements? Tags could serve as jump labels? But how to do jumps? And do merge commits have a special meaning? Still have to think about how to do computation. If you wanna talk about this, hit me up! :)


  • Try to write example programs in GitLang (working title), see how that feels like.
  • Lots of events going on today: a talk about RSA, a discussion on learning structures, a math workshop about Project Euler, a hackathon planning meeting!
  • Go home early! :wink:


Hey everyone! :cherry_blossom:


  • Lots of events! @Anna Walsh (SP1’19) and @Nicole Baram (SP2’19)’s refresher about RSA felt really helpful, and @Yoni Elhanani (SP2’19) kind of makes me want to do Project Euler problems! :)
  • Brainstormed a bit on the Git language. @Jeanine Peters (SP2’19) suggested to call it legit, and I really like that! I think the language could be stack based, like Befunge or FORTH, and have operations like “get” and “put”, “add” and “sub”, “swap” and “dup”, “quit” and “jump”. Need to be careful to make it Turing-complete, however – I might need two stacks, or a way to provide random access to the single stack.
  • Started writing a legit ROT13 implementation (on paper). Feels like a language which is easy to learn, but hard to master.
  • Went home early! :grinning_face_with_smiling_eyes:


  • Realize the ROT13 implementation in an actual Git repo.
  • Think about the minimal feature set to make it Turing complete.
  • Maybe start writing a quick-and-dirty interpreter for that language, to find problems in the design?
  • Give a demo about the Wikidata Card Game Generator!


Hey, what’s up? :)


  • Wrote a quick first draft of a language specification for legit.
  • Started writing a ROT13 implementation. This is how it looks like: screenshot-2019-04-19_153306.png
  • Note that the program has a typo: “Z” instead of “z” in 6deaa0c. I have no idea of how to reword that without creating all merge commits which come after that manually again. Creating a program in legit is… um, a challenge? Let’s just say, TIL about git commit --allow-emtpy, git write-tree and git commit-tree.
  • Debugged some cronjobs with @Alan Chu (SP2’19), and learned about TypeScript and the inner workings of @chat-bot!
  • Feelings check-in made me cry a bit. Thanks for your vulnerability! :cry:
  • Demoed the Wikidata Card Game Generator I made with my friend Bine a few months ago.


  • No plans, as usual on Fridays! :) Might be fun to look at how to use c3nav for indoor mapping.


Hey, y’all! Hope you’ll have a great week! I went to the Brooklyn Botanical Garden yesterday – highly recommended, the cherry blossom is at its peak currently, and the conservatory showcases many bonsai trees, some of which are over 500 years old! :O


  • Looked at c3nav, the software used for mapping large CCC events like the Chaos Communication Congress. I thought it might be fun to have an electronic map of RC! But. There’s no documentation at all on how to set it up or how to use it, and the maintainer seems unwilling to provide documentation or help. I contacted her, and it seems she doesn’t want to allocate time to that. Maybe drawing a static map would be an alternative.
  • Implemented an interpreter for legit in Ruby! That’s a language I’m deeply in love with since many years, and it’s my go-to language if I quickly need to type out something. It was an amazing feeling when my example ROT13 program successfully ran for the first time! Exept for some DSLs, legit is the first language I ever created! :fireworks:
  • Started working on a compiler, which will translate legit programs to LLVM IR.
  • Wrote a “hello world” program, and introduced a new type of instruction: a string literal will push all contained characters on the stack. As the characters are pushed on the stack in reversed order, the program will first write them all on the tape, then print them in the correct order: screenshot-2019-04-22_122207.png


  • Discuss the design of the language with a few people. Check whether anything is very counter-intuitive.
  • Add the remaining missing legit instructions to the compiler. Refactor the code a bit.
  • Design a logo for legit, improve documentation, prepare public release.
  • The “holy grail” would of course be a brainfuck interpreter! :D (Which would also proof that legit is Turing complete.) Maybe write out how that might work on paper.


Hi everyone! :sunny:


  • Had a legit discussion with @Joe Mou (SP1’19) and @Nick Aversano (SP2’19). We discussed different approaches to do jumps and calls, and I think it helped the language design a lot!
  • Worked on the proposal for a GLASS OF WATER emoji, soon to be submitted to the Unicode Consortium, with @Kate-Laurel Agnew (SP2’19), @Ratan (Rai) Sur (SP1’19) and @Tim Vieregge (SP2’19). The process is much easier than I imagined! Emojination has all the links and resources on how to do that yourself!
  • Got fed up creating legit programs manually, so I wrote some bash scripts which do it for me.
  • Implemented the tape mechanics for the legit compiler, as well as new jump instructions, and adapted the examples.
  • Made some quick logo designs for legit. Which one do you prefer? The second already feels very obscure, but maybe that’s appropriate. screenshot-2019-04-23_122005.png


  • Continue to think about how to implement a legit Brainfuck interpreter! This is not gonna be trivial. :grinning:
  • Give a presentation about Ludum Dare this evening!




  • Wrote some Git tools from scratch in @Joe Mou (SP1’19)’s workshop! Super interesting and demystifying! I’m looking forward to continue with that!
  • Started writing the legit Brainfuck interpreter. Doing the loop instructions is tricky, the six other ones work by now! Thanks for helping me debug, @Nick Aversano (SP2’19)! Nick pointed out that I’m using a bash script to generate a legit program, which is then compiled by a Ruby script to LLVM IR, to be converted into a binary, which can then interpret Brainfuck, and that’s more layers than I expected. :sweat_smile:
  • Gave a talk about how the game jam Ludum Dare works! :joystick: Slides and links here:
  • @Jason Owen (SP2’19) showed me the current status of his RC project directory. I have a number of features in mind which I think would be great, and we filled the issue tracker with those! :D


  • Try to finish the Brainfuck interpreter!
  • Lots of interesting events: a Git mob learning session, the personal website jam, an improv session, and Latin puzzles! :blush:


Good… morning! :D


  • Fixed all the bugs in my Brainfuck interpreter written in legit – especially the loop instructions took a lot of debugging.
  • Fixed one or two bugs in the legit compiler. It can run the same programs as the legit interpreter (both written in Ruby) now, but harnessing the LLVM toolchain makes it faster by at least two magnitudes (2 seconds vs “0 seconds”): screenshot-2019-04-25_114350.png
  • Went to the personal website jam for the first time, and implemented little icons for external links and my favorite projects on my homepage: screenshot-2019-04-25_114632.png
  • @Agustin Ramos Anzorena (SP1’19) and @Travis Horton (SP1’19) hosted some improv games, which was something I always wanted to try. Warmup was super fun, but I think I need more practice to feel comfortable participating in scenes. Would love to try that again!


  • I’ve been thinking about how to share what I’m doing at RC publicly. I’m considering creating a blog post for each week, which consists basically of these check-ins?
  • Pair with @Jaryn Colbert (SP1’19) to make improvements to! :camera:
  • Give a talk about legit! Polish the README, prepare a public release. Maybe create a page on the Esolangs wiki?


Hey everyone!


  • @Jaryn Colbert (SP1’19) onboarded me to, and we implemented a new feature: Only show people who have photos!
  • Gave a talk about legit, forgot to mention the name. :shruggies: @Kate-Laurel Agnew (SP2’19) brought up the challenge to write a quine! :scared:
  • Enjoyed the Company Meet & Greet! It was super informal, and many of the people were Recursers themselves. Interesting to see the variety of companies RC works with.


  • RC Hackathon! :sparkles:


Hi :3


  • For the Stupid and Useful Things Hackathon, @Jared Pereira (SP2’19) and me made a map of the floors and rooms of RC. It’s meant to be printed and laminated, so that people can add details. Here’s a quick-and-dirty zoomable version using Leaflet: (Soon to be at, if the stars align right? EDIT: The stars aligned!)

Weekend and Monday:

  • Participated in the 44th iteration of the game jam Ludum Dare, where you make a game around a given theme in three days! The theme was “Your life is currency”, and @Tim Vieregge (SP2’19), @Byung Joo Shin (W2’19), @Alan Chu (SP2’19) and me made Capitalist Piggies, where you play as a piggybank that wants to escape from evil banker piggies! @Agustin Ramos Anzorena (SP1’19) joined us on Monday to create some pretty visual assets! We used the LÖVE game engine, and it was super fun, and super exhausting! :D


  • I’m gonna take at least a day off. :sunny: Four days of focused hacking are a lot for me, and I need to recharge my internal batteries a bit. See y’all soon!
Capitalist Piggies capitalist-piggies 2019-04-29T00:00:00+00:00 blinry A game for Ludum Dare 44, made with byshiny, pleekman, thechutrain, and Tim at the Recurse Center.

It’s a game about fast reactions, planning, and cute piggies! You play as a piggy bank that wants to escape a real bank, guarded by cute, but rather dangerous banker piggies.

You can download the game from the Ludum Dare website.

Title screen

In-game screens


The theme for this game jam was “your life is currency”, and we quickly settled on the idea of linking the life of little piggy banks to their coins. Instead of a fast-paced action game where you can shoot enemies with your coins, we decided to go for a more puzzly game mechanic, where you need to lure your enemies into traps.


Joshua McLean did a quick (very distracted) playthrough:

For this game, we didn’t take the time to rate other people’s games, so we didn’t get enough ratings ourselves to get a placement.

Running Out Of Space running-out-of-space 2019-04-14T18:44:00-04:00 blinry I got the idea for this story when brainstorming for Ludum Dare 42, but my teammates didn’t like it. We made Writespace instead, and I’m happy that we did. But in April 2019, I took the time to make an actual piece of interactive fiction around my original idea. Made with Twine.

Play it in your browser!

Snack Overflow snack-overflow 2019-03-25T00:00:00+00:00 blinry A quick project at the Malkränzchen, our weekly creative meeting in my home hackerspace, Stratum 0:

Feel free to deploy it on your favorite cupboard! For convenience, here’s a high-resolution PNG image!

While working on this, I also made a bunch of other variants, maybe you’ll like them better than I do? :)

Wikidata Card Game Generator wikidata-cardgame 2019-02-24T00:00:00+00:00 blinry At this year’s iteration of the Wikidata workshops in Ulm, bleeptrack and I built a Wikidata Card Game Generator! It uses Wikidata, the free and open knowledge base, to generate fact cards on arbitrary topics, like metro systems, planets, or hackerspaces!

People seem to enjoy it! Check it out here:

Our secret plan is that people will complain that a lot of information is missing on the cards, and will then add it to Wikidata to fix that! :D

Like Wikidata, the project is available under the terms of CC0. The source code is available on GitHub. If you wanna help improve it, have a look at the the issues! And let us know if you find interesting decks!

Nuts and Bolts nuts-and-bolts 2019-02-02T00:00:00+00:00 blinry A game for One Hour Game Jam #197, with the theme “misleading title”. Done while I was in Brussels for FOSDEM.

My first real game done on the “fantasy console” PICO-8. I was impressed by how quickly you can prototype on that platform! I’m especially proud how juicy this game is, including lots of particle effects and screen shake!

You can play the game in your browser!

The Floor is Lava the-floor-is-lava 2019-01-26T00:00:00+00:00 blinry ]]> Operation Mindfuck Vol. 2 operation-mindfuck-2 2018-12-29T23:00:00+01:00 blinry At the 35th Chaos Communication Congress, Bine and me did another “Operation Mindfuck” talk about art, computers and curiosities. You can find last year’s edition here.

Here are the slides we used: (Open them in fullscreen)

Arden's Artisan Artefacts artisan-artefacts 2018-12-04T00:00:00+00:00 blinry ]]> Inkdiary 2018 inkdiary-2018 2018-10-31T00:00:00+00:00 blinry In October 2018, I felt difficult feelings, applied to the Recurse Center, looked into the sky, and travelled through Scotland!

And here’s a Twitter thread with the individual drawings:

Tiny Snek tiny-snek 2018-09-17T00:00:00+00:00 blinry I made this in Blender after watching Andrew Price’s brilliant tutorial series (he’s working on an updated version for Blender 2.8). If you’re interested in the source file, here it is.

A tiny, green snake amidst a low-poly rock world

habitctl habitctl 2018-09-16T19:33:00+02:00 blinry

habitctl is a minimalist command line tool you can use to track and examine your habits. It was born when I grew frustrated with tracking my habits in plain text files using hand-drawn ASCII tables. habitctl tries to get the job done and then get out of your way.

German Sign Language for Anki anki-dgs 2018-09-16T13:06:00+02:00 blinry This is a set of flashcards for the popular open-source spaced repetition software Anki, which will teach you signs of the German Sign Language. It contains over 4000 signs and their meanings!

The basis for these flashcards is SignDict, an open dictionary for sign language, developed by Bodo Tasche. Its video content originates from different sources.

Here is an example card, as it looks like in Anki’s Android app:


You can download the current release from AnkiWeb. Then, in Anki, use File -> Import and select the .apkg file. On Android, you can simply open the file to import it.

Note: Using this Anki deck requires an Internet connection, as the videos are streamed on-demand. Also, the video player does not seem to work on every platform: It is known to work in Anki’s Android app, but not in the Linux desktop version.


If you find a mistake, or have other ideas on how to improve the deck, please don’t hesitate to open a new issue!

This deck is built using the CrowdAnki add-on.


All videos are released under Creative Commons licenses. To see the license of a specific video, use the “Details” button!

Timelens und die Zukunft der Videonavigation timelens-talk 2018-09-08T16:00:00+02:00 blinry At MRMCD 2018, I gave a (German) talk about Timelens, an Open Source project which creates visual timelines from video files, enabling more efficient, precise navigation.

There’s a recording of the talk on

(If you prefer, there’s also a copy of the recording on YouTube.)

And here are the slides:

Timelens und die Zukunft der Videonavigation

Writespace writespace 2018-08-14T00:00:00+00:00 blinry Writespace is a puzzle game with simple mechanics, but interesting implications. It was made in 72 hours for Ludum Dare 42, together with Kiki and larkinia, and Lena and rohieb jumped in last-minute to help with the graphics!

As for the story: You’re exploring a haunted house and find a strange parchment scroll. When you touch it, something terrible happens: You’re turned into a typewriter! Use your surroundings and find the magic words to lift the curse! Oh, and you can’t type spaces, of course.

You can download the game from the Ludum Dare website.

Title screen

In-game screens


Last time, our level format was SVG – now we just used text files. Personally, I had the most fun exploring the implications of our own rules. There were quite a few “aha moments”, and we tried to put those into the game for the players to experience, as well.


This game got quite a bit of coverage. There were some short articles written about our game. Both contain recordings (without commentary):

Randomise User recorded a short playthrough:

And EliteKessu also did a full playthrough with hilarious meta commentary through the game’s user interface:


This is an aesthetic bomb. I absolutely love the visuals you chose, and the theme is implemented beautifully. Extra points for the sound design, the gentle typewriter clicks and dings did it for me! –Shess

Brilliant game. I spent the last 40 minutes playing this game and enjoying myself with puzzles and the beautiful aesthetics. Love the seemly simple mechanics can actually generate4 so many interesting puzzle especially the later ones involving finding out clever ways of getting around tight spaces and dead ends. –jackyjjc

Wow, this game blew my mind, supernice, this is incredible 5/5 –oskarOlausson


Writespace won second place, out of over 2000 jam entries!

SpaceAPI logo spaceapi-logo 2018-07-23T21:53:00+02:00 blinry The SpaceAPI provides information about hackerspaces, like addresses, contact information, or door opening status. One team member maintaining this project approached me and asked if I could design a logo for them. Well, sure! :)

Regular version

This is the normal version, which can be used in website headers, on stickers, and other merchandise:

SpaceAPI logo

There’s also a SVG of this, which can be scaled up for large print sizes, as well as a clean, plain SVG, which does not include the fancy texture, suitable for 3D printing, milling, plotting, and so on. There are also variants for dark backgrounds of the default and the plain version.

Avatar version

This is a reduced version, which looks pretty in a square and a circle, and can be used as all kinds of avatars.

SpaceAPI avatar

This also has a SVG version as well as a plain SVG version. And also for this avatar, there are variants for dark backgrounds of the default and the plain version.


And finally, there’s a multi-resolution favicon.

Master's Thesis: Split Packing split-packing 2016-06-01T00:00:00+00:00 blinry This page links to a number of scientific texts, which all were a result of my 2016 Master’s Thesis: The thesis itself (which is the most complete version), a paper presented at SODA ‘17, a paper presented at WADS 2017, and a journal article which appeared in the Discrete & Computational Geometry journal.

Master’s Thesis

The full name of my master’s thesis is Split Packing: An Algorithm for Packing Circles with up to Critical Density. It covers a topic from the field of Computational Geometry: Packing circles into various containers, like squares and triangles.

In the thesis, I invented an algorithm which can pack circles and other objects into these containers, if their combined area does not exceed certain bounds. The special property of the algorithm is that these bounds are tight: For any larger area bound, there are circle instances which can not be packed.

The thesis contains a large number of figures, I’d like to invite you to take a look! :-)

Thesis Presentation

For the presentation I created a nonverbal description of the central algorithm in the style of IKEA assembly instructions. (Later, in 2017, I started a whole series of these, the IDEA project.)


Also, while working on this thesis, I wrote an interactive visualization tool called Circus, which I used as a personal thinking and explaining tool. You can try it out by clicking on the image below, usage instructions are located in the lower left. The tool is written in CoffeeScript and uses the HTML5 canvas for drawing, the source code is on GitHub.

Screenshot of the Circus visualization tool

SODA paper

A solo-authored paper version of the thesis, condensed to 10 pages, and lovingly typeset. I presented this paper at the 28th Annual ACM-SIAM Symposium on Discrete Algorithms (SODA 2017) in Barcelona. It only covers packing circles into square containers.

WADS paper

This paper covers packing circles into triangular containers. I presented it at the 15th Algorithms and Data Structures Symposium (WADS 2017) in St. John’s, Canada.

DCG article

This article combines the two paper versions. You can read the preprint at, or a view-only version of the published article.

Watschelhaus watschelhaus 2018-07-14T22:34:00+02:00 blinry A walking Verschwörhaus

The Verschwörhaus in Ulm had a big and secret 2-year birthday party this weekend! The original logo actually depicts the front of the building the Verschwörhaus is situated in, but for me, it always had legs! <3

Here’s the original Aseprite animation.

Liam included this animation his projection mapping:

Nerd Metal Shirt nerd-metal-shirt 2018-06-22T15:08:00+02:00 blinry Want one?

You can get this shirt at GetDigital. It’s a collaboration with my good friend Bleeptrack, who designed the front side!

You can also get it as a hoodie and in a cut which emphasizes the waist.


In September 2017, Bleeptrack and me had the idea for a festival shirt with nerdy band names on it. We brainstormed a bit, and asked around on Twitter for ideas:

When we got a lot of feedback, we wanted to set up a website where people could vote for their favorite band names, and could contribute new ones. We discovered the open source project All Our Ideas, which seemed perfect! We set up a poll, which received over 10000 votes and over 260 total ideas in a few days. Whew! The results were really helpful for us to select band names for the shirt, and to put them in a good order.

When designing the band logos, I made sure to only use fonts with free licenses. Bine drew a front side, and we iterated both sides a bit - thanks to our beta testers!

Initially, we wanted to set up our own on-demand printing shop at Spreadshirt, but we discovered that they would not allow parodies at all. So we contacted the nerdy online shop GetDigital, who were immediately enthusiastic about our idea. It took a while before the shirt actually went into print, though, because of internal personnel problems, Christmas time, and our complicated, big designs, which meant they had to look for a new contractor to do the actual printing.

But since June 2018, it is finally possible to buy the shirt! We can’t wait to make more like this. Actually, Bleeptrack has created a ton of other awesome shirt designs, check them out!

Timelens timelens 2018-06-05T15:00:00+00:00 blinry ]]> Packing list packing-list 2018-05-25T20:14:00+02:00 blinry I’m keeping two packing lists, one for short-term and one for long-term traveling. Both are well-tested and time-proven, and have grown over many years. The first list tries to be complete, the second one tries to be minimalist.

I’m very glad to have them. It gives me a lot of confidence, being able to leave my apartment, knowing that I haven’t forgotten anything important.

Short-term packing list

For travels of up to one or two weeks. Most of the time, this list assumes I won’t be doing laundry, and will be mostly stationary. It does not include the things I usually wear on my body (wallet, jeans, hair ties, …).


  • cut fingernails
  • cut beard

Assorted things

  • small backpack
  • money for all countries I’m passing through (incl. airports)
  • passport
  • chewing gum
  • books
  • guidebooks
  • water bottle
  • tickets
  • (digital) map
  • pencil
  • fountain pen + ink cartridges
  • empty paper
  • notebook
  • games


  • power adapters for all countries I’m passing through (incl. airports)
  • power strip
  • Kindle
  • Mini USB cable
  • external hard drive
  • hard drive’s USB cable
  • HDMI cable
  • HDMI-to-VGA adapter


  • towel
  • shampoo
  • Kleenex
  • condoms
  • painkillers
  • nail clipper
  • sunscreen
  • insect repellent
  • antihistamine
  • earplugs
  • plaster


  • long underpants
  • underpants
  • socks
  • T-shirts
  • pullover
  • headgear
  • rain jacket
  • swimming trunks
  • slippers


  • Ethernet cable
  • sticker box
  • DECT handset & base
  • juggling balls
  • caffeine pills/powder
  • soldering equipment
  • throwie ingredients
  • googly eyes

In the morning

  • laptop
  • laptop’s charging cable
  • smartphone
  • USB-C cable
  • USB charger
  • headphones
  • toothbrush
  • toothpaste
  • hair brush
  • deodorant
  • food

Long-term packing list

For indefinite traveling/backpacking. This list tries to be as minimalist and lightweight as possible. Weight measurements are in grams.


Weight Object
1440 Osprey Farpoint 40
1346 laptop
760 ml of water
628 4 T-shirts (157 g each)
388 small backpack
360 notebook
326 outdoor trousers
291 laptop’s charging cable
205 Kindle
189 electric razor
185 toiletries bag
150 deodorant
150 paper
149 water bottle
136 100 ml sunscreen
131 100 ml shampoo
127 packing cubes
106 toothpaste
100 travel towel
92 swimming trunks
67 1 pair of Merino underpants
68 USB charger
61 painkillers
56 headgear
55 razor charging cable
50 2 packs of Kleenex
48 passport
47 fluffy gloves
44 nail clipper
40 1 pair of Merino socks
31 laundry bag
30 USB cable (type C)
26 USB cable (micro)
26 hair brush
21 fountain pen + 2 ink cartridges
20 toothbrush
20 power adapter
16 pencil
13 headphones
7 1 ziplock bag (1 L)
0 ear plugs
0 plaster
0 interdental brush
0 hair tie
0 small USB stick
8025 total

On the body:

Weight Object
671 rain jacket
600 jeans
303 fleece jacket
218 wallet, incl. keys
162 smartphone
157 1 T-shirt
120 belt
67 1 pair of Merino underpants
40 1 pair of Merino socks
2338 total
Visual timelines visual-timelines 2018-05-20T00:00:00+00:00 blinry


Given a page of written content, its structure is pretty apparent. You can easily scan the page and read the parts which seem interesting to you. (Unless it’s written by Leonardo da Vinci, duh. But you get the idea.)

Codex Leicester, Leonardo da Vinci, Public Domain

For a video, this is different. You can’t see the structure, because you can only look a single frame at a time.

For example, try to find the scene where the bomb explodes in the following video:

Did you find it? Was it easy?

I think it feels a little like stabbing in the dark. The slider at the bottom just seems terribly inefficient to me.

The solution

I propose adding color information to the slider, to show the structure of the video.

Again, try to find the explosion - but this time, click around in the bar below the video!

(You find pause and resume the video by clicking it.)

Here’s another example. Can you find the scene with the elevator?

I call user interface elements like these visual timelines. Let me show you why they are awesome and how they work!

Why are visual timelines cool?

There are several cool things which happen when you have a visual timeline to navigate a video.

For example, you can suddenly see the intro and the credits of videos:

… and even if there’s a “secret scene” after the credits!

In a recorded talk, you can see when the slides change:

In a talk, you can also differentiate sections and see where the Q&A begins:

And sometimes, you can get a feeling for the arc of suspense of a movie, just by looking at the color development:

How are these images created?

  1. Take frames from the video at regular intervals…
  2. scale them to a width of 1 pixel, averaging the colors…
  3. and append all of them to one single image.

The result gives you an impression of the color development over time, and you can also differentiate between up and down.

There are many other styles of visual timelines which could be interesting. For example, here’s one visualizing the audio track of the video, using a spectrogram:


This work is in the spirit of Bret Victor’s essay Up and Down the Ladder of Abstraction. Visual timelines are an example of an abstraction over time.

I take much inspiration from the Explorable Explanations community.

My Story

In early 2011, I came across the moviebarcode tumblr. The people behind it take feature films, and create similar images depicting their color development. I had fun doing quizzes with some friends – we would show each other three of these images, as well as the movie titles in a random order, and the others had to assign the images to the titles. To my amazement, we managed to recognize Gandhi (1982), soley by the black intermission in the middle of the movie.

And that’s when I thought “huh, wouldn’t it be awesome to use these for navigation”? Now, supported by the Prototype Fund, I’m able to work on this vision properly!

Gebaerdenbot gebaerdenbot 2018-05-11T00:00:00+00:00 blinry @gebaerdenbot is a Twitter bot which tweets a few signs of the German Sign Language per day. It is powered by SignDict.

Twitter Bot Workshop twitter-bot-workshop 2018-05-11T01:07:00+02:00 blinry A workshop for the Gulaschprogrammiernacht 2018 about building Twitter bots with generative grammars via Tracery.

Here are the interactive slides – you probably want to open them in fullscreen.

Splendid Adventures on a Sunday Afternoon splendid-adventures 2018-04-24T00:00:00+00:00 blinry The theme of Ludum Dare 41 was “Combine two incompatible genres”. I absolutely loved this theme, and we had a lot of fun brainstorming! Together with larkinia, Mai, rohieb, and Winnie, we set out to make a crossover between a platformer, a text adventure, and a children’s book. Graphics, music, and code was created by us in 72 hours.

You play the web version on the Ludum Dare website.

Title screen

In-game screens


We used SVG as a level format. This was an awesome idea, because it gives you a lot of expressiveness, and a convenient editing environment with layers, locking, unlimited data attributes. The browser also does the rendering for us, and everything scales nicely.

It was also a horrible idea, because elements can be arbitrarily nested, with transformations stacked on top of each other, and path objects don’t have a coordinate at all. We ended up using getBoundingClientRect() to fetch object positions from the browser. Then, we remember the original object positions, wrap each of them in an SVG group with a specific translation, and update that translation from the physics engine. Took us a day to get it right, but I’m happy how it turned out! :)


Jupi covered the game in her ongoing mission to play ALL THE indie games:

Joshua did a long playthrough with fun commentary!

Randomise User also tried the game, after the ratings were out! “You decide… to DIE!”

And Coconut Mouse played it without commentary:


What a way to do the theme! I would have never thought on doing this! Kudos to you guys! Beautiful pictures, the atmosphere and the multiple routes really make it feel like a complete game. I now really want to see more of these types of games in the future! –SaberOfSong

So for the entire game, I played with a childlike smile on my face. –legavroche

Really nice, very soothing. I was hooked and tried all the pathes. I had a very good time, thank you :). –Kevar


To our astonishment, we made the 2nd place in the Overall category, and 3rd place in Fun and Mood! I still can’t believe it. 2nd place is damn close to 1st place! :O

Rickroll sticker rickroll-sticker 2018-04-17T00:21:00+02:00 blinry The first bars of "Never Gonna Give You Up"

This sticker depicts the first bars of “Never Gonna Give You Up”. It’s super fun to rickroll musical people this way! :3

Here’s the LilyPond source file, and here’s a PDF ready for printing.

Passierschein A38 passierschein-a38 2018-03-19T22:52:00+01:00 blinry Auf dieser Seite stellen wir Ihnen das Antragsformular für den Passierschein A38 (nach Rundschreiben B64) als PDF zur Verfügung.

Passierschein A38

Sollten Sie für andere Zwecke einmal Veränderungen an dem Formular vornehmen wollen, steht die Quelldatei im SVG-Format bereit.

Freies Labor logo freies-labor-logo 2018-03-11T19:25:00+01:00 blinry A hackerspace in a neighboring city, the Freies Labor in Hildesheim, contacted me and asked if I could design them a new logo.

Well, absolutely! :) After brainstorming with some of the hackerspace’s members, we ended up with an idea involving Lissajous curves, a family of curves created by sending two sine waves on the x- and y-axis of an oscilloscope. The concrete logo depicts a Lissajous curve with a frequency ratio of 2:3.

Here’s the basic form of the logo, for use on dark and light backgrounds:

Freies Labor logo: dark version

Freies Labor logo: light version


The creator, blinry, allows free use of the logo for everything and everyone, as long as the usage is related to the hackerspace Freies Labor in Hildesheim.


The font is Gidolinya, a modern DIN by Andreas Larsen, dual licensed under the MIT License and the SIL Open Font License 1.1. I added some weight to the individual glyphs.

The logo would also go well with Gidole by the same author.


There is an extra-fancy version for special occasions:

Freies Labor logo: glowing version

A header for the blog:

Freies Labor logo: header version

A square avatar for use in social networks, which snuggly fits inside a circle, and a square version for the wiki:

And finally, there’s a multi-resolution favicon.

Intro to 3D shader programming with GLSL and ray marching ray-marching 2018-02-18T03:05:00+01:00 blinry I gave this talk (in German) at my home hackerspace Stratum 0. It’s a gentle introduction to creating 3D graphics using fragment shaders written in the OpenGL Shading Language, which allow an unusual approach to creating graphics: Geometry is modelled as a distance function, which describes the distance to the nearest surface, and we can use a technique called ray marching to render the scene.

You can find the GLSL source code of the demonstrated shaders on GitHub.

To run them, you can use glslviewer (on your command line) or this online editor (in your browser).

Shadertoy contains a plethora of cool examples, and The Book of Shaders is a brilliant interactive step-by-step guide to fragment shaders.

IDEA idea 2018-02-15T15:00:00+00:00 blinry ]]> Small Recipes small-recipes 2018-01-22T00:00:00+00:00 blinry Beschreibung

Usually, I create Markov chain-based bots like Potterbot, or my alter ego yrnilb. But learning about Tracery, I wanted to do one based on a formal grammar.

The first result is @small_recipes, a random recipe generator! :)

Results are suitable for beginners …

… and advanced cooks alike:

Space bar space-bar 2018-01-08T23:57:00+01:00 blinry Any bets on which tiny star I’ll lose first? :P

Space bar on a keyboard, with some tiny stars and planets glued on it

If you have access to a plotter and want to create your own, you can use my SVG file as a basis. The measurements of the space key were taken on a T460s.

Operation Mindfuck operation-mindfuck 2017-12-29T19:43:00+01:00 blinry A talk by Bine and me, presented at the 34th Chaos Communication Congress, featuring a wide array of nerd sniping topics, about art, computers and curiosities:

And here are the slides we used: (Open them in fullscreen)

Pixel Art Workshop pixel-art-workshop 2016-10-08T00:00:00+00:00 blinry This is a workshop I’m regularly giving at Chaos events. The first iteration took place at Hackover 2016.

Here’s a recording of the “theoretical part” from the 34th Chaos Communication Congress:


The 8x8 pixel characters are by Johan Vinet.

You can also download the source .ase file for the presentation, which abuses Aseprite’s animation feature to do slides.

Spring Clean – DO NOT CROSS spring-clean 2017-12-05T00:00:00+00:00 blinry A game for Ludum Dare 40 I made with Kiki. Original score by Winnie, character graphics by Mai! The theme was “The more you have, the worse it is”.

Spring cleaning time! But be careful to protect your increasing number of cats from your roomba by drawing lots and lots of barrier tapes!

You can download the game (or play the web version) at the Ludum Dare website.

Title screen

In-game screens

We also had a sister project, Kittychaos, created under the same roof, and partially sharing assets!


This was a rather small-scope project. We managed to implement it in two days, and had the complete third day for testing and bugfixing. Very relaxing!


I love the idea. And its a nice riff on those games where you divide the floor and I think I like this better than those. It feels more strategic. –tsuk13

Overall cute-level is 10/10. Audio complements the visuals and pushes the cute-meter to 11/10. –Simon Rahnasto

Cool basic mechanics! At first simple, then cat synchronization and corralling. :P Well done! –Joror

I love the way the vacuum cleaner moves, it’s so stupid and inefficient and I love it. –pogo


Jupi did a playthrough, and decided she would rather vacuum the floor herself:


Results were pretty solid. We got a good Theme rating, and except for Graphics, our scores were all better than 200th place!

Ich, Ersatzteillager stammzell-spende 2017-11-16T22:39:00+01:00 blinry Ein Vortrag über meine Erfahrungen bei meiner Stammzellspende vor drei Jahren.


Ich, Ersatzteillager

$HOME, sweet $HOME home-sweet-home 2017-11-13T15:02:00+01:00 blinry I’d like to describe how I organize my home directory, because I have tried a few different things in the past, and found an approach which works for me exceptionally well. It has a relatively flat hierarchy, doesn’t require much categorization, and makes it unambiguously clear where files go.


For many years, I’ve kept my files in the following way: On the top level, I had directories which specified the file type of its contents, like videos, text, code, svg or templates. This is the default structure suggested by operating systems like Windows and macOS, which even create folders like Documents, Music or Pictures when creating new user accounts.

I was unhappy with this structure for a number of reasons. For starters, I couldn’t tell the status of my files. I had no overview of what I was working on, and which projects were finished. And I couldn’t tell which projects were decades old, and which were really recent. Also, there was no separation between random files I found on the Internet, and my own work.

Relatively fast, I settled on “project directories”, that is, I kept each project in its own directory. This was partly because I like to use Git to version control software and text, but also because it seemed to give better modularity and isolation - it made it unambigiously clear which files belonged together, and which project they belonged to. Project directories are always moved as a whole. Even small “projects”, like a letter or a single drawing, are put into their own project directories.

High-level structure

I have five base directories, which have different purposes, and I’ll go over each of them in detail in the following sections. To give you an overview, here is how files can be moved between them:

And here’s the structure of their contents:

  • work (projects I am working on right now)
    • project1
    • project2
  • permanent (projects that are always active)
    • wiki
    • homepage
    • mail
  • archive (completed and inactive projects get moved here)
    • 2017
      • code
        • project1
        • project2
      • art
      • texts
      • uni
      • photos
    • 2016 (same structure as above)
  • library
    • music
    • books
    • papers
  • tmp (temporary files)


This is where most files start their life. Downloads go here, and if it’s worth keeping them, they get moved to library later. Sometimes, I also start experimental projects here, before they get moved to work. The idea is that this folder can be wiped regularly, without losing anything of value.

If this seems to simplistic to you, Leah has a much more advanced setup for managing her “mess”.


Each currently active project is a subdirectory of work.

I used to call this directory projects, but changed the name later so that it doesn’t start with the same letter as permanent, to make tab completion faster. :D

When I’m bored, I simply look around in work, choose one of the projects inside, and start working on that. When I see a project that I haven’t worked on for a few days of weeks, or when a project is finished, I move it into archive.


This directory contains projects that are always active. Currently, these are the following:


Completed or inactive projects get moved here. This is the most structured directory in the system; its hierarchy has two layers:

On the top level, everything is ordered by year of last modification. This makes it easy to tell what’s really old and what’s recent. This also allows me to move older years to external drives, but until now, this hasn’t been necessary.

And inside each of these year directories, I sort the projects by type, like code, art, texts or photos.


This directory has a strict rule: It must not contain anything I created. It’s a loose collection of files I like to have around for entertainment or information purposes. This directory is structured like default home directories: It has subfolders, classifying files by their type. Examples: books, music, papers, wallpapers, pics, sounds.


Here’s a one-table overview of my system:

name structure created by status
tmp (chaotic) everyone temporary
work project-name/ me active
permanent project-name/ me permanent
archive year/type/project-name/ me done or inactive
library type/(subtype/) others reference

To find old projects, I have a script called archive, which lists project directories with matching names:

find ~/archive -maxdepth 4 -type d -iname "*$1*"


I’m pretty happy with this system, and I’ve been using it for about 5 years now. One thing I’ve considered changing is to remove the year-type classification inside the archive directory. Having a flat structure would make it even easier to retrieve old projects. The downside is that photo projects can no longer clearly be differentiated, and that there could be name collisions – what is now archive/2016/photos/japan would need to become archive/japan-photos-2016 or something. For all other projects, it would probably work better.

Inkdiary 2017 inkdiary-2017 2017-10-31T00:00:00+00:00 blinry Inspired by Bine’s Schnipsel project, I started making little ink drawings about every day of October!

Here’s a collage of all the drawings! For me, it holds a lot of emotional value, because so many things happened that month! I fell in love, saw a bunch of great movies, and drove a car after a long time!

And here’s a Twitter thread with the individual drawings:

Watching Movies Backwards watching-movies-backwards 2017-10-30T15:47:00+01:00 blinry Ever wondered what a movie would look like when played backwards?

  • Titanic: A boat comes out of the ocean to save a bunch of drowning people.
  • Lord of the Rings: Two hobbits steal a ring from Mordor and emigrate to The Shire, while some of their friends travel around reviving orcs.
  • Star Wars: A moon-sized spaceship suddenly appears in space, and Luke extracts a bomb from it, enabling it to constructs new planets.
  • Saw: An old man kindly gives people new organs and replaces their missing body parts.

I wanted to try this. Well, actually playing movies backwards would mangle the audio and look ridiculous, but there’s another way: Watching movies Memento-style!

The idea

The movie Memento revolves around a man who can’t make new long-term memories, so he only remembers what happened in the last five minutes. He’s constantly taking notes and pictures, and even gets himself tattooed, to remind himself of what’s important.

The filmmakers use a clever narrative technique to transfer his experience to the viewer: The individual scenes of the story aren’t shown chronologically, but in reverse order: The viewer gets to see the last five minutes of the story first, then the five before that, and so on. This means that, at any point in the movie, the viewer also has no idea what happened before, making it easy to put themselves in the protagonist’s position.

These backwards-running scenes are additionally interleaved with shorter, forward-running ones taking place at the story’s very beginning. They introduce some of the characters in a spread-out fashion, and can easily be differentiated, because they are shown in black-and-white.

Here’s a timeline of the whole movie, displaying the “screen time axis” horizontally and the “plot time axis” vertically:

Timeline of Memento

I’m quite fond of Memento, and one day, I wondered what would happen if you applied this narrative technique to other movies. I tried it. Here’s what happened.


The first movie I watched “Memento-style” was Transcendence. I knew that it didn’t have very good ratings, and I thought it could be more interesting to watch it backwards. Also, I was on an eight-hour bus drive through Canada, and had nothing else to do. I just did it manually, skipping back by ten minutes whenever I encountered something I had already seen: Five minutes for block I had just seen, five minutes to go to the beginning of the block before that.

Watching Transcendence backwards turned out to be a pretty fun experience, because of its climactic story arc: It ends with an AI taking over the world, and the rest of the movie explains how it became more and more technologically advanced, and before that, how and why the original person uploaded his mind into a machine. For most of the movie, the relations to some of the characters weren’t really clear to me, and became apparent only when they were introduced at the beginning. But overall I had a great time, and learned that watching movies in this fashion makes an engaging, fun experience.

And recently, I could convince some friends to watch a movie backwards together. We chose Cypher – two of us already knew the plot, two of us didn’t. The movie ends with a pretty big twist, so for the rest of the film, we already knew what would happen, and could laugh at the ignorance of the characters. But still, we had quite a few “Ah, that’s where he got that item!” and “Oh, so that’s why he did all that!” moments. I’m not sure whether it was more fun for those who already knew the movie, or for us who had to figure it out. ;-)

How to watch movies Memento-style

My initial idea was using FFmpeg to actually cut a movie file into pieces and reassemble them, but that approach turned out to be slow, tiresome, and inflexible. So, at the moment, there are two things you can do:

First, as explained, you can just open the movie in your favorite video player, skip the the beginning of the closing credits, and then jump back five minutes. Each time you reach a part of the movie you’ve already seen, jump back ten minutes. Repeat until you’ve seen all of the movie. (In VLC, for example, you can make this easier by using the keyboard shortcut Ctrl + Alt + Left, which jumps 5 minutes backwards!)

And second, you can apply some automation. My favorite movie player is mpv, which is easily scriptable with Lua, so I wrote this script which does all the work for you. You just put it in ~/.mpv/scripts/ (on Unixoids) or in %APPDATA%\mpv\scripts\ (on Windows), open your movie, and press M to turn on “Memento mode”. Playback will skip to the beginning of the last 5-minute block automatically, and it will then play all of these blocks, in backward order. I found that it’s worthwhile to have an overlap of about 10 seconds between the blocks, so you can better recognize where the transitions are. You can change the length of the blocks and their overlap by changing the value of the step and overlap variables.

Closing thoughts

Watching movies backwards seems like a good way to make boring or bad movies more interesting, to challenge yourself, and to have a fun time.

It might be interesting to try playing a movie really backwards, after all. This way, people would also actually act backwards, which might add some humoristic value. To understand what characters are saying, one could either simply add subtitles, or actually cut out the respective parts of the audio track and play them forwards. One could use the timing of the subtitles to find these pieces containing speech. In any case, doing this would require re-encoding the movie file, because video formats are specifically designed to be played forwards.

One could experiment with different block lengths. Five minutes seemed to work pretty well – it’s long enough so that you don’t get too many jumps, and it’s short enough so that the story is still perceived as “backwards”. The average scene lengths in modern movies seems to be around 2-3 minutes, so one could also try that.

Finally, as I explained above, Memento’s structure is somewhat more complicated because of the additional forwards-running black-and-white scenes. It seems worthwhile to add these in, so that you get to see the introduction of the world, of the characters and their relations at an earlier point of the movie.

Here are some more movies which could be interesting when watched mementoized. If you’d like to try it, it would probably be best to pick one you know absolutely nothing about: Mrs. Doubtfire, Duplicity, The Fountain, Duel, Alien. Enjoy!

gitlab-patcher Logo gitlab-patcher-logo 2017-10-11T00:00:00+00:00 blinry A logo for gitlab-patcher, a command line tool for managing complex sets of software patches. It’s a Tanuki! With band-aids! <3 It’s based heavily on the original GitLab logo created by Ty Wilkins.

A Tanuki with band-aids

It was selected by the GitLab Infrastructure team from my three suggestions:

Three Tanuki logo variants

Fairy Dust fairy-dust 2017-01-02T01:10:00+02:00 blinry Fairy Dust

Hackerspaces: the final frontier. These are the voyages of the rocket Fairy Dust. Its one-year mission: to explore strange new technology, to seek out new life forms and new convention centers, to boldly go where no congress has gone before.

The visual style of this animation is a reference to Nyan Cat, but the subject is one of the Chaos Computer Club’s logos, the rocket Fairy Dust.

In case you’d like to create your own Nyan Cat-style animation, you can use my Aseprite file as a basis.

I posted this animation on twitter, and when I suggested that someone could create a soundtrack for the animation, an amazing piece of Internet collaboration happened: My friend Winnie extracted samples from Peter Marquardt’s video Electromagnetic Sounds of a Chaos Communication Congress and put together a music loop. He called the result Fairy Dub:

He also made a improved version 2.0, Fairy Dubst:


In late 2017, I made a sticker version, with slightly modified colors and a different aspect ratio. It is designed to be printed at size 3.5 x 10.5 cm, and already includes 1 mm bleed on all sides. If you want to modify it, here’s the Aseprite source file.

Sticker version

Dare to Ludum Dare dare-to-ludum-dare 2017-10-08T12:00:00+02:00 blinry At Hackover 2017, I gave a talk about my experiences with Game Jams, especially with Ludum Dare:

Dare to Ludum Dare

Here’s a (German) recording of the talk, given at my home hackerspace, Stratum 0:


CSS Art Workshop css-art-workshop 2017-10-07T13:00:00+02:00 blinry A workshop I gave at Hackover 2017 about making minimalistic CSS Art. Participants learned how to make complex pictures from a single, empty <div>.

Here are the interactive slides – you probably want to open them in fullscreen. Note that the “solutions” to the various topics are subslides, which you can reach with the down key. Press Escape to see an overview.

And here are two codepens I provided as a starting framework:

McEscher mc-escher 2017-10-02T22:39:00+02:00 blinry An impossible burger

Would you like some Möbius bacon on that?

Fix My Avatar fix-my-avatar 2017-09-28T00:00:00+00:00 blinry In June 2017, Twitter decided to change the format of its users’ avatars from a square to a circle. This led to many avatars which contained text or rectangular logos being cut-off.

Because I’m annoyed by such things, I wrote a Twitter bot which can fix these problems: @fixmyavatar. It analyzes the avatar’s background color, and then scales down the motive until it fits into a circle, plus some small padding.

To use it, just write something nice to the account, like this:

@fixmyaccount Hi, please fix my avatar!

It will reply with a fixed avatar, which you can then save and re-upload to your profile.

To help fixing other accounts, send their names to the bot, like this:

@fixmyaccount Please fix the avatar of @account_name_here

As the Twitter API limits the number of tweets per hour to 100, you might need a little patience! :)

Shenzhen Portal Logo shenzhen-portal-logo 2017-09-07T00:00:00+00:00 blinry A logo for Stratum 0’s storage system for electronic components, the Shenzhen Portal.

A chinese postman, delivering a giant LED, running through a dimensional Portal

Elymas Logo elymas-logo 2017-09-07T00:00:00+00:00 blinry A logo for Drahflow’s stack-based programming language Elymas, which is unholy and full of magic.

A dark wizard hand hovering over a globe filled with brackets

MRMCD17 CTF: "Sanity Check" sanity-check 2017-09-03T20:03:00+02:00 blinry At MRMCD17, Bine, Maxi and I participated in our first Capture The Flag event ever. I wanted to do a quick writeup of how we solved the Sanity Check challenge from the “Misc” category.

The description of this challenge read as follows:

Participants were supposed to enter a flag in the text box at the bottom to solve the challenge. Note that it has a 5-star difficulty rating, but we were determined to solve it!

Thus began our descent into madness.

Thanks to the hint text, we now knew the general format of a flag, but how were we supposed to get the specific one required for this challenge? We were really surprised that, unlike other challenges, this one didn’t link to any file or webpage. There was no obvious attack vector, or any other apparent source of helpful information.

First thing we did was to look at the source code of the page, but didn’t find anything hidden in there. We attemted to take the description text literally and entered mrmcd{text}, but to no avail. Maybe there was some kind of hidden message in the hint text itself? The first letters of all words? Tihafllsialltotitbtc. The characters in the first column? TmsMb. Every fifth letter? Tiallomaoiihsbecbe. Nothing seemed to make any sense, we tried these as keys nevertheless. Nope. Scytale cipher? Caesar box code? ROT13? Nopenopenope.

The strings inside the example flags caught our attention, and we spent a day or so to do anything useful with them. To us, they looked like abbreviated hashes, so we rented some computation time from Amazon’s AWS, and set up a hash cracker using rainbow tables. To our disappointment, after letting it run overnight it didn’t come up with anything useful. We interpreted the strings as x86 assembly instructions, as ASCII, as IPv6 addresses, and as bit strings forming a QR code when arranged correctly. Nothing.

Maybe the title Sanity Check was supposed to be a hint? Were we actually required to prove our mental health to the CTF organizers? Google Maps listed at least different six psychotherapists nearby – but which one should we go to? Was this actually supposed to be an on-site challenge? We tried calling them, but none of them understood what we were asking about. Two of the psychotherapists pointed out that the Central Tegmental Field (short: “CTF”) is a specific area of the human brainstem, but all our attempts to build a flag out of that information was in vain. When we called the last number, insisting that one of them had to an accomplice of the organizers, and were actually offered an appointment for the next afternoon, we knew we were on the wrong track.

We sneaked in the CTF operation room and attempted some social engineering. We started by thanking the team for putting together all those fun challenges (we had solved about a dozen others of them at this point). Next, we causally mentioned that we had noticed some other teams having problems with the Sanity Check challenge, and offered to discuss how to improve this type of challenge next time. Instead of answering, they all laughed at us, and we didn’t have a choice but to laugh as well. We tried again, pointing out they had made a typo in the string inside the flag. Yeah, the second word was spelled wrong, what was it again…? But they seemed very determined not to let anything slip. We left, trying very hard to conceal our disappointment.

So… to be honest, I started this writeup under a false pretense. I promised to describe how we solved this challenge, but to this day, we haven’t found a way to do it. If someone else (like one of the top three teams, entropia, alech, or cypp) would like to do a proper writeup of how they found the flag, we would be extremely interested to read it! But, judging from how difficult it must be to derive the flag text, we assume none of them will have the time and energy to describe all the required tools, and the elaborate process required to crack all stages of this devilish challenge. Congrats to all teams who beat it. This one was definitely above our heads.

Richterfenster richterfenster 2017-08-20T00:00:00+00:00 blinry Entry in the pixel art compo of Evoke 2017. While the original window in the Cologne Cathedral has 72 colors, this one was only allowed to use a given 8-color palette.

Ten Little Letters ten-little-letters 2017-07-29T00:00:00+00:00 blinry This game was a very small-scope entry for Ludum Dare 39, created during a sick day in Montreál. In contrast to my past participations, this was a solo entry, so I chose the “hard” ruleset, where you have to create the whole game from scratch, including sounds and music.

In the comments, the game was praised for its “original concept”, and the “clean, simple execution”. Many found it quite hard (including myself), but see for yourself! :)

You can download the game from the Ludum Dare website!

Title screen

In-game screens


The theme for Ludum Dare 39 was “Running out of Power”. I spent a few hours drafting a game in the style of Japanese number games, where you would need to connect potato batteries to lamps on a grid, but I didn’t find a combination of gameplay elements which would make this really challenging. Another concept had the title You are the Blackout, where you would kill lights in a skyscraper, making the people inside panic and flee to certain locations. This led me to the idea of a platformer which would play completely in the dark, and you would have to orient yourself only via sound effects. I knew I had to reduce the scope to be able to finish this in a day, so the final game is a very reduced version of this: You click around in the dark, trying to guess which letter is there.

To be honest, this is kind of a recycled idea which I already thought of in preparation to managore’s bit jam. The challenge there was to create a game in 1-bit color, on a 1px x 1px display, without any other form of feedback. I didn’t realize it back then, and I think this version with audio and graphical output is probably much more satisfying to play.


Jupi covered the game and discovered that letters are hard:


I’m rather proud of the innovation rating. All other categories are in the upper third, except for “Theme”:

What happened when we offered Free Hugs to people free-hugs 2017-07-16T19:02:00+02:00 blinry How do people react when you hold up a sign labelled “Free Hugs” in public?

A friend and I wanted to find out. We had both heard of Juan Mann, who started his Free Hugs Campaign in 2004. Also, we had already encountered other people doing this, and we discovered that we both had wanted to try it ourselves ever since.

Two cardboard signs

So we wrote two cardboard signs, one in English (“Free hugs”), one in German (“Gratis Umarmungen”). As we walked toward the city center of Brunswick, I started looking at the people passing by and tried to guess whether or not they would accept a hug. To be honest, I was pretty nervous, because the whole thing was so unpredictable. Doing this this was definitely part of my ongoing efforts to leave my comfort zone every now and then.

We selected a busy crossroad in a pedestrian zone, stood at one corner of it, and raised our signs.

Nervously, we waited. Would anyone actually come up to us, or would we simply be ignored?

Our initial anxiety disappeared quickly. It turned out to be quite fun to watch people’s reactions: Some kept a straight face, some looked surprised or narrowed their eyebrows, but the overwhelming majority smiled and talked about us when they realized what we were doing.

Then, after about five minutes, the first two people came running into our arms, tourists from an English-speaking country. In retrospect, these were some of the most heartfelt hugs of the day. “How long can I hug you?” one of them asked. My friend chuckled. “As long as you want!” They hugged each of us, then hugged each other.

After this, we couldn’t stop smiling.

Most of the time, we wouldn’t offer our hugs very aggressively, and let the people come to us instead. We watched many groups hesitating whether or not to approach us. Often, one member would try to convince the others to come with them. Soon, when we spotted this behaviour, we tried to invite them in by opening our arms and waving and nodding. Some groups literally changed direction four or five times (toward us, away from us, toward us), before finally deciding on whether they would do it.

Some woman pointed at her companion. “He wants a hug, he’s just too shy!” He smirked. “Yeah, you know, my social phobia…” “Oh, we’re totally introverts, too!” we replied. “Well, obviously you don’t have to do this. But maybe you’ll come back here again later today?” He didn’t.

A teenage girl walked by, gaping at us, looking so offended that I couldn’t help but burst into laughter. Sorry!

Some older women gave us very tender and long hugs. “This feels good,” nodded one of them.

After hugging, a man with an Italian accent walked away, then quickly turned around again: “Oh, you don’t want any money, right?”

Some dude, walking up to me: “Okay, I’ll hug you. But only ‘cause it’s you!” He came back a few minutes later for a selfie.

Many people asked for our motives. “Why are you doing this?” “Did you lose a bet?” “So, who made you stand here?” My default answer was “We just think the world could use more hugs!” I don’t think everyone understood.

A woman with a group of small kids: “Sooo… explain what are you doing?” “We can hug you if you want!” “And then?!” “That’s all there’s to it!” She came back a few minutes later and all apparently had instructed all four kids to hug us. Cute!

My friend told me beforehand she was a little afraid of creeps. Fortunately, the whole thing was a mostly creep- and asshole-free experience. Even though, there was one rather awkward guy who came to hug (just) her, without any facial expression, and then left, all without speaking a word.

A middle-aged couple came for hugs. “We saw people doing this some time ago in another city! We didn’t use the chance back then, but now we had to!”

A rugged-looking man with bad teeth watched from a small distance. “Do you want a hug?” I asked. “Nah, I’m fine, I get 10 per day! I’m just glad there are still good people out there!”

Guessing which people would come for a hug turned out to be rather difficult. We noticed that most couples wouldn’t, and most kids and elderly people wouldn’t, either.

The waitress of the café across the street came over: “I’ve been watching you the whole time, and I wanted a hug myself!”

A boy of about 7 years sneaked up on us. “Do you want a hug?” He beamed with joy. “Yeah!!” I wondered where his parents were, but then he also walked back to the café, his parents smiling at us from there.

A 12-people bachelor party group came roaming about, and we wiggled our signs, hoping to score a group hug. But they were focused on selling stuff to raise money for the wedding. None of them wanted a hug, one of them even asked for money. I pointed at the word free: “Sorry, this is not how this works.”

One of the most surprising reactions came from a young man: “Can I hold the sign for a few minutes?” A group of his friend watched him from a distance. He seemed a little nervous and withdrawn, and I tried to brief him with some best practises: “Offer the sign up to people coming from that direction, so they have time to decide whether they want to do this. Try to look at them, and smile!” He did none of these things, it didn’t really work out, and he left after a few minutes. I encouraged him to try it again sometime, and I thanked him for the idea of bringing some spares signs in case people wanted to join in.

We mostly stayed stationary, except when the infamous Preacher of Brunswick turned up (“Let! Jesus! Into your heart!”). We really didn’t want to be associated with him, so we temporarily changed our location. Walking around with our signs (very slowly) also worked great, and I would like to try more of that in the future.

When the shops closed, and the amount of people passing by decreased, we decided to break camp. About two hours had passed in a flash. Some people had asked for our experiences – how long we’d been here, how much response we were getting. Truth be told, we got a lot more reaction than I had expected. I’d estimate we hugged about 50-60 people. Hugs definitely came in clusters, I guess because it’s easier for people to come up to us after they’ve already seen others to do the same. Overall, the feedback has been incredibly positive!

Some minutes after we put away our signs, my brain was still in hugging mode, and I was surprised that nobody came up to us. So, yeah, I would love to do this again. Soon.

Lessons learned

Should you ever want to offer Free Hugs yourself (and I think you definitely should try!), here are some hints and pointers to improve your experience:

  • A mixed-gender two-person group seemed to work pretty well. It’s not as creepy as a single guy, not as intimidating as a larger crowd, and people can chose whom to hug. (Although most people hugged both of us!)

  • It’s a good idea to write multi-lingual signs, where applicable. We noticed people who couldn’t read our English one (“Könnten Sie mir die Bedeutung des Wortes Hugs verraten?”), and there were also people who didn’t speak German and laughed about the ridiculous length of the word “Umarmungen”.
  • Bring more signs than you need, in case people want to join in.
  • Our signs were made from thick white cardboard, a little larger than A4. This worked well, but I’d probably make larger ones next time. Write on both sides of the signs, so people behind you can read it when you hold it up.

But really, there’s not much you can do wrong. Go! The world does need more hugs, now more than ever.

No Way Out no-way-out 2017-06-27T00:00:00+00:00 blinry This is a song of beginnings. Most importantly, it’s the first full real song I’ve ever created. It’s also the first chiptune I made, and the first track I produced using SunVox! I surely learned a lot while making it!

But it sounds rather dark, so I gave it a depressing name! :P

You can listen to it on SoundCloud or download it as MP3 or FLAC. The SunVox project file is available here.

Thanks to Bobo_PK for reviewing the track, and giving helpful feedback! Cover art by Bleeptrack.

Low poly snail low-poly-snail 2017-06-27T00:00:00+00:00 blinry A low poly snail in low poly grass

Inspired by @nori_wrap’s low poly art.

Wikidata Guessr wikidata-guessr 2017-06-25T00:00:00+00:00 blinry At the Wikidata-Wahldaten-Workshop in 2017, I made this guessing game. It works a bit like Geoguessr, but it’s powered by open data from Wikidata:

You get a picture, and need to guess where on the Earth the depicted object is! To generate the quiz, I sample from all Wikidata objects that have both a coordinate loction, as well as an image.

Play it here!

Make your own quiz!

The best thing is that you can make your own quizzes! In the dropdown in the bottom left, there’s already some ideas, like “only guess the location of parliament buildings”. But here’s how to make your own type of quiz:

  1. Go to
  2. Enter a type of object into the search box in the top right, in singular, for example “bridge”.
  3. Click the dropdown popup that has the correct description.
  4. Copy the Q-number in the title of the page. For “bridge”, it’s Q12280.
  5. Add the Q-number to the base URL of the game, like this:
  6. Enjoy your new quiz!
Potterbot potterbot 2017-06-18T00:00:00+00:00 blinry @potterbot is a Twitter bot using so-called Markov chains to generate random new lines. I fed it the complete text corpus of all seven Harry Potter books. When I set it up, I was mostly thinking of generating funny lines, but a surprising thing has happened:

A friend of mine has started replying to the prompts generated by Potterbot, to continue the scenes. You can find a good example here. I find it hilarious, and it’s a good example of creativity produced by human-computer interaction!

Font quiz for Anki anki-fonts 2017-06-06T15:14:00+02:00 blinry This is a set of flashcards for the popular open-source spaced repetition software Anki, which will teach you to identify the most popular typefaces. It showcases over 45 fonts, each with a short history and a list of defining characteristics.

Here is an example card:

The basis for these flashcards is the now-defunct FontSpotting deck developed by Dustin de Souza and Jessica Witt. Their content is used with their kind permission.


To get started, simply download the current release from the AnkiWeb page. Then, in Anki, use File -> Import and select the .apkg file. This works in the desktop client as well as on smartphones.


This deck is maintained on GitHub, using the CrowdAnki add-on. If you find a mistake, or have other ideas on how to improve the deck, please don’t hesitate to open a new issue!

Esoteric Programming Languages esolangs 2015-02-01T00:00:00+00:00 blinry This was a fun overview paper written in my university seminar “Programming languages through the ages”. I was very lucky to receive the awesome topic Esoteric Programming Languages! :-) In the paper and the accompanying talk, I give an overview of the languages Brainfuck, INTERCAL, Befunge, Malbolge, and Shakespeare.

Paper Talk

You can also have a look at the LaTeX source of the paper.

In 2017, I gave an extended version of the talk at the 17. Gulaschprogrammiernacht (in German):

(If you prefer, there’s also a copy of the recording on YouTube.)

Ampersand jam ampersand-jam 2017-05-06T22:33:00+02:00 blinry Development path of the three designs

TQ & Pecca made me aware of the Saint J&an event hosted by the open source foundry Velvetyne. It was both a workshop held in Paris, as well as a location-independent design event, where participants could create & submit their “contemporary ampersand” designs.

You can click on the images below to download a clean SVG of each design.


Inspired by the treble clef used in modern music notation. This one definitely took the longest & I found it rather hard to get all the curves right. A huge help was Inkscape’s “pattern along path” effect, which allowed me to vary the thickness the stroke, while being able to modify its positioning at the same time. Oh, & Spiro splines, of course. I couldn’t have done any of this without Spiro splines.


Clef voting Clef voting 2


The idea here was to create an extremely bottom-heavy shape. Already early on, I had to think of the Body Positive Movement & some variations literally depicted a huge belly. The final design stayed rather abstract, but the name still transports the idea! :)


Buddha voting Buddha voting 2


Inspired by the awareness ribbons. This was a fast one, because two thirds of the design were already given. Few design choices had to be made.


Ribbon voting

A Bloody Small World bloody 2017-04-25T00:00:00+00:00 blinry This is our contribution Ludum Dare 38. This time, I was part of a four-person team together with Pecca, Winnie, and Moritz. We built a little, hectic racing game!

Only an event like Ludum Dare gets me into a flow-like state which allows me to work on something without interruptions for 16 hours straight…

You can download the game from the Ludum Dare website!

Title of "A Bloody Small World"

Screenshots of "A Bloody Small World"


The Button Masher Bros did a hillarious playthrough, you should definitely watch it:

Also, Jupi covered it in her ongoing mission to play ALL THE indie games:


Such a great game! The design is very well done, from the blood flow encouraging you in the right direction to the visuals, everything is well thought out. The music was nice and fitted well with the rest of the game. The intestines were quite livery, but I’m guessing it’s the LD time constraints showing there :P –bobsleigh

Hot damn, that’s very cool! The sounds is cute, the art is good, and the whole idea behind it makes for a great educational game. –Ellian

Wow this game is really great and i enjoyed it a lot! The game feels very polished with the cute art style, sound effects and music complimenting each other really nicely. The game mechanics are pretty fun, I enjoyed the ‘flow’ mechanic and thought it was an interesting game element that sometimes worked against you and other times worked with you. The humor and dialogue was well done and a nice touch. I also thought the challenge progression was well done, as you get used to the mechanics and the map it would up to challenge. Really great job! –Colm Eccles


The ratings were generally rather good. But especially the “Fun” category could have been better… we learned our lesson.

#woollyweek woolly-week 2017-04-20T17:06:00+02:00 blinry TL;DR: We invite you to join us for a Mastodon-exclusive week! Starting this Monday, 2017-04-24 at 0:00 UTC, log out of all your Twitter clients, and don’t log back in for a week.

A Mastodon letting a Twitter bird fly away

You might have heard of the Mastodon social network, it’s an open-source, decentralized, community-built alternative to Twitter. You have 500 characters per post, no ads, and many instances explicitly ban discrimination and harassment. Its mascot is a woolly, mammoth-like animal, and instead of tweets you write toots! We think that’s cute. And by now, the network consists of more than 1000 independent active instances with over 400,000 registered accounts!

In our experience, a hard cut works best for trying out new platforms like this. Some of us have made exceptionally good experiences with such a Mastodon-exclusive week. On the one hand, you will get to know Mastodon inside-out during this week, and on the other, it might convince your Twitter friends to come with you! Maybe some of them even already have Mastodon accounts? You can find them using the Mastodon Bridge.

Here’s how you can prepare (right now!)

  1. Choose a Mastodon instance. Don’t worry, almost all of them are connected to each other, so you’ll be able to talk to all Mastodon users! But here are some recommendations:

    • is a nice general-purpose instance with reasonable rules.
    • is a nice place for LGBT+ activists, feminists, anarchists and stuff as well as their sympathizers. Registration opens every day from 18:00 UTC to 19:00 UTC.
    • was created to be a safe space with very strict rules and moderation. They work with a whitelist to control which instances they connect to.
    • is an instance for and by people close to the Chaos Computer Club.
    • If you’re feeling courageous, you can also take a look at the complete list of instances. Read the respective “About this instance” pages until you find an instance you like!
  2. Register an account there, and try out all the functions! Remember to add an avatar and a short bio to your profile. Here’s a good introductory article to get you started.
  3. We recommend to make an announcement on Twitter before the week starts. Link to your new Mastodon account (and maybe this page?), and use the hashtag #woollyweek (note the double-L! ^_^). Pin that tweet, and change your username to “(see pinned tweet)” or something like that, so your followers can find out what’s going on.
  4. Before Monday, 2017-04-24 at 0:00 UTC, say good-bye to your Twitter followers, log out of all your clients, and pledge not to log back in for a week.

Fun things to try in your first Mastodon week:

  • Post an #introduction! Include many hashtags so people with similar interests can find you!
  • Then, click on your own hashtags to find people with shared interests and follow them!
  • Many of us enjoy having more than one account. For example, is a Star Trek-themed instance, suitable for roleplaying. is a lipogrammatic instance where you are not allowed to use the letter “e”. On, on the other hand, you’re only allowed to use the letter “e”.
  • If you have any questions, you’re very welcome to contact @blinry or @TQ, who will be glad to help you with any problems you might encounter.

This is a list of Mastodon members who will participate in the #woollyweek. Want to join us? Ping @blinry to be added to the list! We’re looking forward to have you with us!

Let it go... let-it-go 2017-04-11T23:00:00+02:00 blinry A Mastodon mammoth letting a Twitter bird fly away

Drawn when I migrated from Twitter to the open-source alternative Mastodon for a week. See this thread on why I did that:

Fünf Tage mit dem Teufel teufel 2017-04-09T12:59:00+02:00 blinry Dies ist eine Übersetzung von Joe Edelmans Essay Five Days with the Devil. Wenn ihr könnt, lest das Original!

Was dich erwartet: Ein Gedankenexperiment. Wie menschliche Werte verlorengehen. Und: Eine neue Perspektive auf den momentanen politischen Aufruhr (Trump, Brexit, Terrorismus, und so weiter).


Am Montag bietet der Teufel dir Produktivität an. Er gibt dir eine magische To-Do-Liste: Sobald du dir etwas wünscht, erscheinen Aufgaben darauf, sofern diese überhaupt erfüllbar sind. Und sobald sie dort erscheinen – BÄM! – werden sie bereits erledigt sein. Du kannst nach wie vor das Gefühl der Errungenschaft und die Früchte des Erfolgs genießen, aber du hast nichts von dem Prozess. Sobald du dir beispielsweise wünscht, ein Buch zu schreiben, wird es bereits geschrieben sein. Sobald du dir ein schickes Abendessen wünscht, wirst du es gerade gegessen haben. Sobald du dir wünscht, mit einer Person, die du liebst, einen entspannten Tag zu verbringen, wird dieser Tag gerade geschehen sein. Er wird vorbei sein.

Ist dies der Himmel oder die Hölle? Gibt es irgendwelche Wünsche, für die eine solche To-Do-Liste hilfreich wäre? Wenn du denkst, dass dies ein schlechtes Angebot ist, was sagt das darüber aus, was du im Leben erreichen willst? Über den Antrieb, produktiv oder effizient zu sein?


Am Dienstag gibt dir der Teufel eine Möglichkeit, deine Beziehungen und deine Zusammenarbeit zu verbessern. Er wird – für immer – das Problem lösen, herauszufinden, welche Handels- und Vertragsbeziehungen in deinem privaten und deinem Arbeitsleben funktionieren werden. Du wirst sofort wissen, wer dich einstellen könnte, wie viel sie bezahlen würden, und was dort von dir erwartet wird. Genau so ist es in deinem Privatleben: Du wirst sofort wissen, wenn es ein gegenseitiges Verlangen gibt – danach, sich zu küssen, miteinander zu schlafen, auszugehen, oder sich über Literatur zu unterhalten. Der Teufel wird den Schmerz und die Verwirrung darüber entfernen, zu verhandeln, zu suchen, zu flirten, und so weiter. Aber er verlangt eine Sache: Deine Beziehungen mit diesen Menschen müssen auf das, was der Vertrag aussagt, beschränkt bleiben. Es wird kein offenes, gegenseitiges Entdecken geben, nur eine Abfolge von zuvor bekannten Tauschgeschäften.

Wie lange wäre ein solches Leben auszuhalten? Wie würde es sich anfühlen, auf der Erde zu leben, wenn alle Menschen das Angebot des Teufels annehmen würden? Hast du Freunde, die dieses Tauschgeschäft eingehen würden, und welche, die das nicht tun würden? Wo liegt der Unterschied?


Am Mittwoch bietet der Teufel dir an, deine Wahrnehmung und deine Fähigkeit zur Schlussfolgerung zu verbessern. Wie Sherlock Holmes wirst du besser darin sein, Dinge zu bemerken: Die Zusammensetzung deiner Umwelt, Hinweise auf den emotionalen Zustand von anderen, die Wahrheit über deine politische und wirtschaftliche Situation, und so weiter. Der einzige Preis, den der Teufel einfordert, ist eine entsprechende Verringerung deiner Fähigkeit zur Wertschätzung. Du wirst mehr darüber wissen, was geschieht, aber weniger darüber, warum das für dich wichtig ist. Du wirst Schwierigkeiten darin haben, zu erkennen, warum du dich um Dinge scheren solltest. Was auch immer dir momentan wichtig ist – sei es wegen seiner Schönheit, seinem Nutzen oder seiner Passion – es wird dir weniger wert sein.

Würdest du das Angebot des Teufels annehmen? Welche Form der Wertschätzung würdest du am meisten vermissen? Wie würde sich dein Leben ändern? Stell dir vor, du müsstest wählen, nicht nur für dich selbst, sondern für die gesamte Menschheit: Würdest du dich entscheiden, alle scharfsinniger, aber weniger wertschätzend zu machen? Inwiefern wäre eine solche Gesellschaft anders? Ist Wahrnehmung ohne Wertschätzung überhaupt möglich?


Am Donnerstag bietet der Teufel allumfassende Empathie und Einsicht an. Was auch immer du fühlst, Leute werden es sehen, und sie werden sofort alle wichtigen Details dessen, was dir passiert ist, verstehen, und sich um dich kümmern. Du wirst nicht mehr deine Geschichte erzählen müssen, um Sympathie und Verständnis zu bekommen, weil du sie sofort bekommen wirst. Diesmal ist der Preis, dass die Leute nur über deine Gefühle, deine Geschichte und deine Erfahrungen Bescheid wissen werden. Alles andere wird ihnen verborgen bleiben: Deine Pläne und Träume, womit du dich identifizierst, inwiefern du wachsen oder anders leben willst. Du wirst jedermanns Empathie haben, aber keine Zusammenarbeit, keine Mentorschaft, keine Gemeinsamkeit im Wachsen und Lernen.

Würdest du das Angebot annehmen? Falls ja, würden dir Leute auf lange Sicht mehr oder weniger geben? Welche Art des gemeinsamen Wachsens oder der Zusammenarbeit würdest du am meisten vermissen? Was tun Menschen wirklich füreinander?


Am Freitag macht sich der Teufel daran, deinen Erfolg zu erhöhen. Er wird dich doppelt so erfolgreich darin machen, so zu leben, wie du willst. Wenn du Sport machen willst, wirst du das tun. Wenn du die Situation von unglücklicheren Leuten verbessern möchtest, wirst du darin doppelt so effektiv sein wie sonst. Wovon auch immer du träumst, oder was du dir in den Kopf setzt, es ist wahrscheinlicher, dass das umgesetzt wird. Allerdings muss ein Preis gezahlt werden. Für den Rest deines Lebens werden alle von deinem Erfolg wissen, aber niemand von deinen Motivationen. Deine Motive – alle Motive – müssen für immer geheim bleiben.

Was verlierst du bei diesem Tauschgeschäft? Warum ist es wichtig, die Motive der anderen zu verstehen? Was gewinnen wir bei diesem Prozess? Ist ein Leben weniger lebenswert, wenn niemand unsere wahren Motive kennt? Ist es wahrscheinlicher oder unwahrscheinlicher, dass wir die richtigen Dinge tun, wenn wir nicht über unsere wahren Motive reden dürfen?

In jeder der voranstehenden Geschichten hat der Teufel einen wichtigen Teil davon, wie Menschen mit ihren Werten interagieren, untergraben:

  • Am Montag hat er durch das Anbieten der To-Do-Liste alle Werte auf logistische Ziele reduziert.
  • Am Dienstag hat er Flirten und Entdeckung durch eine verbesserte Koordination ersetzt, und dadurch Zusammenarbeit als eine Aushandlung von Zielen umdefiniert, anstelle einer gegenseitigen Erkundung von Werten.
  • Am Mittwoch hat er mit dem Angebot einer besseren Wahrnehmung unsere Fähigkeit dazu gestohlen, in unserer Umwelt Werte zu entdecken. Er hat uns überzeugt, dass nur Fakten real sind.
  • Am Donnerstag hat er mit dem Angebot von Empathie und Verständnis unsere Kompetenz entfernt, einander zu beschützen, was auf dem Erkennen von Werten basiert.
  • Am Freitag hat er uns durch das Verbot, Motive mitzuteilen, von gewissen sozialen Prozessen abgeschnitten: Von der Beratung über Werte, von der gemeinsamen Entdeckung von Werten. Es sind genau diese sozialen Prozesse, die unsere Entscheidungen bedeutungsvoll machen.

Diese Tauschgeschäfte sind nicht spekulativ. Sie sind keine Märchen.

Dies sind die Tauschgeschäfte, die unsere Gesellschaft gemacht hat. Sie sind tatsächlich passiert.

Menschen sind Kreaturen, die einander ständig fragen, was wichtig ist – bei einem Ehepartner, bei einem Wein, bei einer Programmiersprache.

Unsere Werte haben ein soziales Leben. Genauso wie wir auf die Gefühle anderer reagieren, arbeiten wir auch zusammen: Wir erkunden, erweitern und beschützen unsere Werte. Es gibt eine verborgene Struktur dahinter, wie wir das, was uns wichtig ist, weiterentwickeln, aktualisieren und verfolgen. Wir wachsen sozial über Werte zusammen, und wir arbeiten zusammen, um sie in Entscheidungen und in Projekten umzusetzen.


Leute fühlen sich so, als lebten sie in einer Gesellschaft, die ihre Werte nicht reflektiert. Auf der linken Seite beinhalten diese Werte Gerechtigkeit, Gleichheit und das Leben mit der Natur. Auf der rechten Seite beinhalten sie würdevolle Arbeit, stabile Familien und religiöse Gemeinschaft.

Wir haben eine einfache Erklärung, warum die Gesellschaft unsere Werte nicht respektiert: Die andere Seite gewinnt!

Aber vielleicht sind es nicht linke Werte oder rechte Werte, die gewinnen. Vielleicht sind es nicht liberale Werte oder muslimische Werte oder amerikanische Werte. Vielleicht ist das, was passiert, dass alle Werte verlieren.

Was, wenn das Sozialleben der Werte versagt? Was, wenn unsere Werte nicht dazu führen, dass wir zusammenwachsen, und sie nicht so ausgedrückt werden wie früher? Was könnten wir tun, um das zu reparieren?

Avoiding Slippery Slopes slippery-slopes 2017-04-06T11:36:00+02:00 blinry Avoiding Slippery Slopes as an O'Reilly book

A “Get Well Soon” card for Rohieb in the style of a fake O’Reilly book. It’s all a giant in-joke, I can’t even begin to explain.

Pacifion pacifion 2017-03-28T22:00:00+02:00 blinry Scorpion with a pacifier instead of a stinger

Der Weg zur Weisheit weisheit 2017-03-15T23:32:00+01:00 blinry Dies ist eine Übersetzung von Joe Edelmans Essay When Wisdom Comes, das mich sehr berührt und geprägt hat. Wenn ihr könnt, lest das Original!

Herzlichen Dank an rixx, Pecca und Wolfgang für’s Korrekturlesen! <3

Gefühle werden oft missverstanden. Sogar von Psychologen, Philosophen und Neurowissenschaftlern und sicherlich von Designern und Aktivisten.

Ich werde zunächst beschreiben, wie Gefühle in uns wirken. Daraus ergeben sich Definitionen von Integrität und Weisheit. Ich werde die Frage stellen, ob sich die Weisheit im Niedergang befindet, und Antworten finden, die mit Organisationen und Bürokratien zu tun haben. Und schließlich werde ich betrachten, wie man anderen im Blick auf ihre Gefühle und Werte helfen kann.

Wie Gefühle in uns wirken

Dies ist die Grundidee:

Jedes Gefühl ruft uns etwas in Erinnerung, das uns wichtig ist.

Zum Beispiel:

  • Wut verrät uns, dass etwas, das uns wichtig ist, blockiert ist
  • Angst, dass etwas, das uns wichtig ist, bedroht ist
  • Scham, dass wir etwas, das uns wichtig ist, nicht gerecht geworden sind
  • Verwirrung, dass uns die Vorstellung von etwas fehlt, das uns wichtig ist
  • und so weiter

Wir lernen durch unsere Gefühle, was uns wichtig ist. Sie verraten uns unsere Werte.

Gefühle helfen uns außerdem, unseren Umgang mit unseren Werten zu überprüfen. Positive Gefühle erinnern uns daran, zu begrüßen oder wahrzunehmen, was uns wichtig ist. Negative Gefühle hingegen tun mehr: Ein negatives Gefühl signalisiert einen Konflikt zwischen unseren Werten, über den wir nachdenken sollten:

  • Vielleicht haben wir nach Wert B gestrebt, dabei aber Wert A vergessen. Ich habe früher zum Beispiel versucht, effektiv zu sein, dabei aber vergessen, dass es mir auch wichtig war, freundlich zu sein. Das könnte zu Betretenheit führen.
  • Oder wir vernachlässigen vielleicht Wert B, weil wir es für unmöglich halten, beide zu verfolgen. Ich könnte es zum Beispiel für unmöglich halten, gleichzeitig meinem Interesse nach kreativer Arbeit nachzugehen, während ich meine Familie finanziell unterstütze, aber beides ist mir wichtig. Das führt vielleicht zu Frustration oder Sehnsucht.

Es gibt viele weitere Arten von Konflikten. Zum Glück haben wir aber Gefühle, die uns mitteilen, dass wir uns mit diesen Konflikten auseinandersetzen müssen, anstatt sie einfach zu übergehen. Die Gefühle erinnern uns daran, uns selbst Fragen zu stellen wie:

  • Kann ich freundlich und effektiv sein?
  • Halte ich wirklich viel davon, effektiv zu sein, oder ist es vielleicht immer wichtiger für mich, freundlich zu sein?
  • Ist es wirklich unmöglich, kreativer Arbeit nachzugehen und gleichzeitig meine Familie finanziell zu unterstützen?
  • Was würde tatsächlich passieren, wenn ich aufhören würde, meine Familie finanziell zu unterstützen?

Oft wollen wir uns diese Art von Fragen nicht stellen. Aber die Gefühle kommen weiter in uns auf, bis wir es tun. Bis wir uns die Zeit nehmen, all diese Konflikte so gut es geht zu lösen, gibt es eine Diskrepanz zwischen dem, was wir leben, und dem, was uns wichtig ist. Diese Diskrepanz führt dazu, dass wir nicht stolz darauf sein können, wer wir sind. Um uns selbst und unsere Entscheidungen akzeptieren zu können, müssen wir uns mit den Konflikten auseinandersetzen.

Besitzt du Integrität?

Oft scheitern wir daran, die Botschaften unserer Gefühle zu empfangen. Dafür kann es drei Gründe geben:

  • Verdrängung. Wenn eine Person sich ihrer Gefühle nicht bewusst ist oder es sich nicht erlaubt, sie zu spüren, werden die Gefühle verdrängt. Verdrängte Gefühle können völlig verschwinden. Man wird abgestumpft, depressiv oder ängstlich.
  • Dampf ablassen. Andere Leute spüren ihre Gefühle, nehmen sie aber nicht ernst als Botschafter dessen, was wichtig ist. Die Gefühle kommen immer wieder zurück und die Person wird melodramatisch.
  • Vermeidung. Eine dritte Gruppe schafft den ganzen Weg bis hin zur Erkenntnis, was ihnen wichtig ist, setzt sich aber nicht mit den aufgedeckten Konflikten auseinander und löst sie auch nicht. Diese Leute werden dauerhaft hilflos, konfliktbehaftet, verwirrt und realitätsfern sein.

Du kannst diese Probleme vermeiden, indem du die Situationen in deinem Leben ganz zu Ende fühlst, angefangen bei den Emotionen, und endend mit einer Vereinbarung von Werten:

FühlenWertschätzenSich auseinandersetzenVereinbaren

Eine Person, die alle ihre Situationen zu Ende gefühlt hat, besitzt Integrität. Sie ist geerdet. Integrität bedeutet, dass sie weiß, was ihr wichtig ist, und dass sie sich mit allen Konflikten auseinandergesetzt hat.

Zu Integrität zu kommen ist am einfachsten, wenn sich deine Situation langsam ändert: Dann hast du viel Zeit, um deine Gefühle wahrzunehmen, um herauszufinden, was dir wichtig ist, und um dich mit möglichen Konflikten auseinanderzusetzen.

Und wie ist es mit Weisheit?

Je dynamischer dein Leben ist – je größer die Vielfalt an Leuten und herausfordernden Situationen ist, mit denen du jeden Tag umgehst – desto schneller musst du im zu Ende fühlen sein. Die wichtigste Fähigkeit für Führungspersonen ist es, schnell darin zu sein, Dinge zu Ende zu fühlen. Eine solche Person ist lebenserfahren oder weise.

Es ist leicht zu erkennen, ob eine Person weise ist: Sie spricht klar und deutlich über ihre Gefühle und Werte und darüber, wie sie sich in verschiedenen Situationen mit ihren Werten auseinandergesetzt und diese miteinander vereinbart hat.

Sie ist außerdem kreativ. Eine weise Person lenkt ihr Leben und ihre soziale Aktivität in ungewöhnliche, kreative Richtungen. Sie hat Werte, die nur durch die Auseinandersetzung mit Konflikten entdeckt werden können.

Hier ist ein Beispiel:

Ein Diagramm von Gefühlen und Werten

  • Früher habe ich versucht, von Leuten gemocht zu werden. Aber irgendwann erkannte ich, dass dies mit meinem Wert, mich wohlzufühlen, im Konflikt stand. Ich merkte, dass ich angespannt und unecht war, um gemocht zu werden. Ich fühlte mich bestürzt und verlegen und das half mir, mich dafür zu entscheiden, nicht darauf aus zu sein, gemocht zu werden, sondern stattdessen zu versuchen, authentisch und mitfühlend zu sein.
  • Später kam mein neuer Wert, authentisch und mitfühlend zu sein, in Konflikt damit, effektiv zu sein. Ich merkte, dass ich lieblos war, wenn ich Gruppen dazu drängte, effektiv zu sein. Mich frustriert und verwirrt zu fühlen, ermutigte mich dazu, das aufzulösen. Ich entwickelte eine neue Sicht auf Effektivität, die darauf abzielt, Kompetenz in mir und anderen zu fördern.

In beiden Fällen behob der Übergang von alten zu neuen Werten einen Denkfehler:

  • Als ich es aufgab, gemocht zu werden, erweiterte sich meine Vorstellung von guten Beziehungen.
  • Als ich es aufgab, effektiv zu sein, korrigierte ich ähnliche falsche Vorstellungen von guten Teams.

Ich konnte die alten Werte deshalb aufgeben, weil ich geklärt hatte, was sie wirklich für mich bedeuteten. Die Bedeutsamkeit der alten Werte ging völlig in dem neuen, umfassenderen Wert auf.

Diese mächtigen neuen Werte und Perspektiven resultieren aus negativen Gefühlen. Ohne unsere Gefühle würden wir auf primitiven Werten wie gemocht werden und effektiv sein hängenbleiben.

Ist Weisheit im Niedergang?

Ich glaube, dass all dies – Gefühle, Werte, deren Vereinbarung – Teil der menschlichen Natur ist, genau wie Sprache oder Gebärden. Aber viele von uns haben das aus dem Blick verloren. Wenn Gefühle natürlich sind, warum ist das Wesen von Gefühlen dann so undurchschaubar?

  • Auf das Individuum bezogen, warum verwirren uns Gefühle und Werte?
  • Auf die Gesellschaft bezogen, warum ist diese Verwirrung so verbreitet?

Wie Individuen sich verwirren lassen

Unsere Fähigkeit, Dinge zu Ende zu fühlen, ist Angriffen ausgesetzt. Zum Einen arbeiten verbreitete kulturelle Mythen daran, uns hinsichtlich der Funktionsweise von Gefühlen und Integrität zu verwirren. Und zum Anderen lassen falsche Annahmen unsere Werte unvereinbar erscheinen.

Kulturelle Mythen. Es gibt verbreitete kulturelle Missverständisse zum Thema Gefühle:

  • Einer dieser Mythen ist die stoische Person – üblicherweise ein Mann – die irgendwie weiß, was ihr wichtig ist, und die ihre Werte vereinbart, ohne dabei jemals ihre Gefühle zu spüren. Der Mythos ist, dass sie einfach auf magische Art und Weise eine höchst effektive Person ist.

  • Ein anderer Mythos ist die hysterische Person – üblicherweise eine Frau – deren Gefühle nichts darüber aussagen, was ihr wichtig ist. Der Mythos ist, dass sie einfach ihren Mann stehen, unnachgiebig bleiben oder Gleichmut entwickeln muss.

Die dominierenden Ansätze der klinischen Psychologie unterstützen und fördern diese Mythen: Die stoische Sichtweise wird von kognitiver Verhaltenstherapie und Lebensberatung unterstützt, während die hysterische Sichtweise von verschiedenen Karthasis-Therapien bzw. künstlerischen Therapien, von Achtsamkeitstraining, von manchen Formen der Familientherapie und von Co-Counseling gefördert wird.

Falsche Annahmen. Kulturelle Mythen unterbrechen den Prozess, zu fühlen oder zu erkennen, was wichtig ist. Unsere Kultur ist außerdem voller falscher Annahmen, die Werte unvereinbar erscheinen lassen. Annahmen wie:

  • Wenn ich sage, was ich wirklich will, werde ich sozial ausgestoßen.
  • Ich bin ein schlechtes Elternteil, wenn ich irgendetwas für mich selbst will.
  • Es ist nicht möglich, als Künstler seinen Lebensunterhalt zu verdienen.
  • Solange ich ehrlich bin, muss ich nicht freundlich sein.
  • Ich kann nicht verführerisch sein, ohne manipulativ oder übergriffig zu werden.

Wenn du einer solchen falschen Annahme unterliegst, ist es dir nicht möglich, dich mit einem Wertkonflikt auseinanderzusetzen und ihn aufzulösen. Die falsche Annahme sagt dir, dass eine Auflösung unmöglich ist. Welches Gefühl auch immer den Prozess ausgelöst hat (zum Beispiel Scham darüber, nicht freundlich zu sein, Aufregung darüber, verführerisch zu sein, oder ein Verlangen nach kreativem Ausdruck), es verwandelt sich in Verzweiflung, bevor du die Chance hast, dich mit dem Konflikt auseinanderzusetzen.

Wenn du die falsche Annahme findest und sie hinterfragst, kannst du den Konflikt auflösen.

Warum die Gesellschaft auf Verwirrung ausgelegt ist

Wenn also diese kulturellen Mythen und falschen Annahmen auf individueller Ebene so schlecht für uns sind, warum sind sie so verbreitet? Hier ist meine Vermutung: Sie haben Menschen berechenbarer gemacht und sie in bessere Rädchen im sozialen Getriebe verwandelt.

Im Laufe der letzten 300 Jahre sind Organisationen, Bürokratien und Institutionen immer komplexer geworden. Um stabil zu bleiben, brauchten sie vorhersagbare Entscheidungen der Menschen in ihnen.

Eine Person ist einfacher zu kontrollieren, wenn sie nicht gut im zu Ende fühlen ist und wenn sie glaubt, dass ihre Werte unvereinbar sind. Sie wird ein besserer Konsument und (zumindest in einer Bürokratie) ein besserer Produzent.

Die erfolgreichsten Subkulturen wären also diejenigen mit kulturellen Mythen und falschen Annahmen. Und wenn Leute darauf getrimmt werden, effektiv zu sein, werden diese kulturellen Mythen und falschen Annahmen verstärkt.

Das würde ein Muster erzeugen, das wir heutzutage sehen: Je erfolgreicher eine Gruppe ist, desto verwirrter ist sie im Blick auf Gefühle und Weisheit.

Anderen helfen

Erwarte fürs erste also, von Leuten umgeben zu sein, die schlecht im zu Ende fühlen sind, die nicht lebenserfahren oder weise sind, und die tief in kulturellen Mythen und falschen Annahmen verstrickt sind. Das wird so bleiben, bis Organisationen und Institutionen anders funktionieren.

Aber du kannst den Menschen, die dir nahe stehen, helfen:

  • Wenn sie Probleme damit haben, ihre Gefühle wahrzunehmen, setz dich zu ihnen. Bitte sie, in sich hineinzufühlen, ihre Gefühle auszudrücken, und behandle diese als wertvoll.
  • Wenn jemand Gefühle ausdrückt, frage, worum es dabei geht. Finde heraus, was der Person wichtig ist. Lass sie wissen, dass du dies ernst nimmst. Du möchtest ihr dabei helfen, zu erkennen, was ihr wichtig ist.
  • Wenn sie denken, dass ihre Werte nicht vereinbar sind, versuche, sie nach ihren im Konflikt stehenden Werten zu fragen. Zeig ihnen, wie diese vereinbart werden könnten. Zeig dich zuversichtlich, dass ihre Gefühle zu Weisheit führen werden.

Viel Glück.

Gibt es eine Person, von deren Gefühlen und Werten du gern mehr hören würdest? Schick ihr diesen Text!

Wikimedia Sustainability Initiative logo wikimedia-si 2017-03-14T15:39:00+01:00 blinry A logo to support the efforts of moving the Wikimedia servers to green energy, based on an idea by Gnom.

Variant with “Wikimedia”:

Full, centered version on transparent background:

Square version on white background, use when the full version would leave too much whitespace in a square:

Sticker version with hairline for the cut:

Variant without “Wikimedia”:

Full, centered version on transparent background:

Square version on white background, use when the full version would leave too much whitespace in a square:

Sticker version with hairline for the cut:


You can find the evolution of this logo in the replies to this tweet:

Screw this. screw-this 2017-03-13T23:30:00+01:00 blinry

Disconnect disconnect 2017-03-07T22:00:00+01:00 blinry Fetus with an ethernet cable instead of an umbilical cord

This was in parts inspired by Gravity’s marvellous womb scene.

Voctocat logo voctocat 2017-03-01T16:43:00+01:00 blinry voctocat

A logo for, the video/audio archive of the Chaos Computer Club and for the CCC Video Operation Center (C3VOC).

It depicts a lucky cat, which has been the mascot of the C3VOC for quite a while: They place lucky cats in the scenes to be recorded for testing pur(r)poses, to make sure the video stream did not accidentally freeze.

The visual style is inspired by GitHub’s Octocat mark, and the name Voctocat is a word play on that and on the abbreviation “VOC”. Thanks to Pecca for suggesting a tail shape! :)

Here’s an optimized version, suitable for immediate reuse and repursposing:


If you’re interested in the logo’s development process, you can find some relevant information in the replies to this tweet:

The Hitchhiker's Guide to the Mandelbrot Set mandelbrot 2017-02-21T16:45:00+01:00 blinry This is a work-in-progress interactive explanation. I'd love feedback! You can reach me at @blinry or

Maybe you've seen an image of the Mandelbrot Set before. It's trippy, it's wonderous, it's beautiful. Here it is, have a look:

Click to zoom.

The Mandelbrot Set is a so-called fractal, which means it's self-similar. Zooming in, you can always find smaller copies of itself. Maybe you encountered some yourself when exploring the above image?

But what does this image mean? How is it constructed? It all begins with a sleeping bunny.

Part 1: What is the Mandelbrot Set?

The Mandelbrot Set is the result of repeated application of a very simple rule.

I'll attempt to explain to you how this works in a purely visual way, without any math. If, on the other hand, the math interests you, you can read up on this in the gray columns, but this is purely optional!

In our little world, there is a bunny, and a flag. You can place the flag everywhere you want. The bunny has its own free will. Psssst, it's still asleep! ... z z Z Z Z

The flag represents something which mathematicians call a complex number. It's just like a normal number, but is has a funny little extra number attached to it, which tells you how far it is above or below the number line. Mathematicians call it the imaginary component, and mark it with an i. For example, in the demo below, f = ?. Try placing the flag on -1.0+0.5i!

Drag the flag around. No surprises here.

The bunny always sleeps in the center of the lawn. But look, it woke up! It will now start to walk and hop around. The first thing it always does is to walk to the position of the flag. We call this movement Step 1.

The bunny's position is another complex number, which is initially b0 = 0. The walk movement is equivalent to adding f, so the next position will be b1 = f.

Pull the slider to Step 1, then drag the flag around.

Step 2 consists of two movements: First, the bunny will hop! It has a very particular way of hopping: It hops so that its angle to the right-direction doubles, and the distance to its sleeping position squares. Intuitively, if its distance to its sleeping position is less than 1, it will hop a little bit closer, and if the distance is larger than 1, it will hop a little bit farther away.

The hop movement is equivalent to squaring the current position. The square of a complex number can be calculated using the binomial formula and the fact that i2 = -1: (x + yi)2 = x2 + 2xyi + (yi)2 = x2 - y2 + 2xyi. The behaviour described on the left can be explained using the polar form of complex numbers.

Pull the slider to Step 1.5, then drag the flag around.

The second movement of Step 2 is another walk. The bunny will walk in the same direction and distance as it initially walked towards the flag:

After squaring b1, we add f again. This gives us b2 = b12+f.

And after that, the bunny just repeats these two movements: A hop, a walk, another hop, another walk. Let's look at how this looks for up to Step 4:

Let's get rid of the half-steps! From now on, we will treat the hopp-and-walk as a single movement.

Here's the same demo as before, but the the bunny directly goes full steps. The flag positions of this and the last demo are in sync, so you can compare the resulting path.

If we want to calculate the new position bi+1, and we know the old position bi, we can calculate bi+1 = bi2+f. This is the only formula needed to calculate the Mandelbrot Set!

And NOW it gets exciting! What if we let our bunny do many, many, steps? Like, 100 of them? Look:

Pull the slider to Step 100, then drag the flag around.
Can you find another spiral? A star? A triangle?

Whaaaat. Crazy patterns everywhere!

You can see that for some flag positions, the bunny escapes the dashed circle (into FREEEEDOM!), while for others, it stays inside. Let's do an experiment: In the next demo, if the bunny's path leads it to freedom, we will color the current flag position white. If the bunny stays inside the circle, we will color it black (because it's so sad!)

This is the definition of the Mandelbrot Set: It consists of all flag positions for which the bunny does not escape, if it does an infinite number of steps. Here, we can only approximate: If the bunny hasn't escaped after 100 steps, it's probably close to the Mandelbrot Set, and we will color the flag's position black.

Drag the flag around to scribble.

Why, helllll~o! You drew yourself a teeny tiny Mandelbrot set!

Let's add more color. So far, we only used white (for when the bunny escapes) and black (for when it doesn't). In the next demo, let's count how many steps it took the bunny to escape from the circle. If it took one step, we color the flag's position red. If it took two, we color it orange, and so on. You can see the colors we use below the step slider.

Drag the flag around to scribble.

And that's really all there is to it! Repeated application of a very simple rule, leading to incredibly complex detail.

Here's the last demo for now, which does all the drawing for you, and where you can zoom in. This one has a lot to explore.

Some things you can try:

  • What happens to the path at the centers of the outer "bulbs"?
  • Can you find out which period numbers are connected to each bulb? Do you see a relation to the "antennas" extending outward from that bulb?
  • Zoom in on one of the bulbs. What happens to the path at the centers of its sub-bulbs?
  • What is the period of the bulbs going "outward"? What happens if you follow a number of them?

Click to zoom. Middle-click to zoom out.

Planned content

More fractals, for example:

The Tricorn: bi+1 = (bi*)2+f

The Burning Ship: bi+1 = (|Re(bi)| + |Im(bi)|)2+f

What happens for other exponents than 2?

The Multibrot: bi+1 = bi6+f

And what the hell are Julia Sets? Follow me on Twitter to get updated when the full thing comes out: @blinry

Thanks for reading!

Emergency Card Template emergency-card 2017-02-16T12:04:00+01:00 blinry I originally created this emergency and organ donation card in 2012. Recently, I gave it an update to translate it to English and make it as international as possible otherwise. I figured it might be useful for other people, so I’m providing a template here. Click on the image to open the SVG, you can edit it using a vector graphics program like Inkscape.

Emergency Card Template

Note that this template uses the Arial font, to be instantly usable as widely as possible. Personally, I use TeX Gyre Heros, a Helvetica clone.

The gray bar on the back side is for your signature. Let me know if you have any other suggestions!

Nifflers don't only love shiny things! niffler 2017-02-13T21:00:00+01:00 blinry A niffler with a baby niffler in its pocket

Earth Balloon earth-balloon 2017-01-24T23:09:00+01:00 blinry Earth Balloon

Holy Coffee holy-coffee 2017-01-11T10:23:00+01:00 blinry Holy Coffee

Just dabbling around a bit with Krita

nordlichtbot nordlichtbot 2017-01-08T21:18:00+01:00 blinry @nordlichtbot is a Twitter bot which picks a random YouTube video every few hours, runs the nordlicht tool on it and tweets the result. It’s currently used as an experimentation platform for new features, as a lazy CI framework and as a gallery of computer generated art.

Here’s an example tweet:

nordlicht nordlicht 2013-07-14T00:00:00+00:00 blinry ]]> A QA engineer walks into a bar... qa-engineer 2017-01-04T00:30:00+02:00 blinry QA engineer comic

This is my first attempt to draw an analogue comic since a long time. The text is based on a tweet by Bill Sempf, and published here with his permission. For non-software people: QA means quality assurance.

The tweet sparked many more ideas on what the engineer could order, you can find an overview on Bill’s homepage.

Goodbye, CCH pixel-cch 2016-12-31T20:32:00+01:00 blinry Pixel Art of the CCH

For five years, the Congress Centrum in Hamburg, Germany has been the venue for the annual Chaos Communication Congress, a four-day conference for hackers, artists, and open-minded folk. The building was opened in 1973, and while it is a little antiquated by now, its charm was loved by many. In 2017, the building will be closed for renovation for a few years, the older parts as well as the depicted front entrance will be removed. This image is dedicated to the old CCH, to say thanks for everything and goodbye!

To the left is one of the CCC’s logos, the rocket Fairy Dust.

Like everything on this site, the image is released under a Creative Commons license. Here’s a “high-res” version (23800x11200 pixels, 200 dpi at 3 meters width), in case you want to print a poster of it or something.


For the 34th Chaos Communication Congress, I made an extended poster version in the “long DIN” format (aspect ratio 1:2.82):

There’s also a high-res version (23800x8409 pixels, 200 dpi at 3 meters width), the PDF I used for printing (which already includes 1 mm bleed on all sides, for a total size of 842 x 299 mm), and the Aseprite source file. I printed 2500 of these and brought them to the first C3 in Leipzig. :)


Here’s a landscape 16:9 version (3840x2160), for use as a desktop wallpaper:

And here are three different portrait 16:9 versions (1080x1920), for use as smartphone wallpapers:

Was ist das für 1 Room? 1room 2016-12-12T00:00:00+00:00 blinry This was my contribution to the game jam Ludum Dare 37, and my third participation in a row. The theme was “One Room”, and we worked in a three-person team. We also had to do this half-remotely, as I was still in Japan at the time, but that worked out pretty well! This turned out to be the most popular Ludum Dare game I ever did by far!

This time, we created a puzzle game about placing furniture in rooms. One beta tester described it as “Sokoban meets IKEA”! Many reviewers told us the puzzles are rather hard, and it seems consistently to take about an hour to complete. We invite you to give it a go! :)

Again, we used the LÖVE engine. You can download the game from the Ludum Dare website!

Title of "Was ist das für 1 Room?"

Screenshot of "Was ist das für 1 Room?"

Screenshot of "Was ist das für 1 Room?"


Working remotely was challenging for the team – we talked via Skype a lot, but struggled to sync our sleeping cycles because of the different time zones. Even though, we had a lot of fun!


rnlf recorded a nice playthrough. He got stuck on one of the more tricky levels, but told us he came back to it later and completed the game. :)


Wow, I löved everything about this game. I like (and make) optimization puzzles in general, but this one I liked a lot. Finally beat it after about an hour. The puzzles were challenging but not frustrating, and it was very satisfying every time I solved a level. –BoltKey

Arrrrrgh! Who the hell puts four book shelves and a Queen Size Bed in a single room with windows all around?! –Moritz


This game definitely got the best ratings of every Ludum Dare game I’ve done so far. We’re especially proud of the “Fun” rating, where we reached the 8th place!

Mem Advent Calendar advent 2011-12-01T00:00:00+00:00 blinry ]]> 20,000 Pixels Into the Sea 20000-pixels 2016-08-29T00:00:00+00:00 blinry My second participation in a game jam, Ludum Dare 36. This time, I was part of a two-person team, which was crazily fun! The theme was “Ancient Technology”, and we made a sailing game, which semi-realistic wind mechanics! You sail around, rescue people, and discover some secrets! If you ever wanted to learn how to sail against the wind, we invite you to give it a go!

We used the (awesome) 2D game engine LÖVE, which uses the Lua programming language. You can download the game from the Ludum Dare website!

Title of "20,000 Pixels Into The Sea"

Screenshot of "20,000 Pixels Into The Sea"


Fun fact: When we were implementing the sailing mechanics, we put hours into reading Wikipedia and other articles, because we were puzzled: Which forces led the boat to turn when you put the sail in the wind in a certain way? Then, we realized that boats have a rudder…


Alice kindly recorded a fun playthrough:


Wow! What a stellar entry! The sailing mechanics are interesting and very well made - I had so much fun navigating, and was constantly playing with how I tacked into the wind. Wonderful! –johnbjuice

This was a lot of fun to play! :) I like how you explained just enough about the mechanics for players to figure out the rest themselves. Getting the hang of how the sailing works just by experimenting a bit was really satisfying! –Waterman7


Ludum Dare 36 was special because it was community-organized (instead of Mike doing all the work), and there were no ratings. This led to very constructive and in-depth feedback, which I liked!

Sand Child sand-child 2015-11-09T20:21:00+02:00 blinry In late 2015, Twitter introduced the functionality to create polls. Jokingly, I wrote a “Choose Your Own Adventure”-style tweet and gave the readers two options on how the story should continue. When the series got more popular than I had imagined, I kept it running for over a month. Below, you can read all tweets which compose the story so far.

The motivation for this overview is that I’m starting a second season!

The story also inspired a piece of fan art by @lichtfeind:

Cover image by @lichtfeind

EU-Haiku eu-haiku 2016-04-29T18:25:00+02:00 blinry A Pan-European haiku, containing one word in an official language from all EU countries:

Viens du trei four cúig.
Un dva tre vier pet seis hét.
Üks tnejn τρεις dört pięć.

I didn’t manage to get in Luxembourgish, but they also use French and German. Finnish has no one-syllable numbers :-D, but they also use Swedish.

Here is the breakdown:

1 – viens (Latvian)
2 – du (Lithuanian)
3 – trei (Romanian)
4 – four (English)
5 – cúig (Irish)

1 – un (French)
2 – dva (Czech/Slovak)
3 – tre (Italian/Danish/Swedish/Norwegian)
4 – vier (German/Dutch)
5 – pet (Bulgarian/Croatian/Slovenian)
6 – seis (Portuguese/Spanish)
7 – hét (Hungarian)

1 – üks (Estonian)
2 – tnejn (Maltese)
3 – τρεις (Greek)
4 – dört (Turkish)
5 – pięć (Polish)

If you want to try for yourself, there’s this handy list.

You're a Floor Lamp Now floor-lamp 2016-04-17T00:00:00+00:00 blinry This is my contribution to Ludum Dare 35, the world’s largest game jam. You get a theme, and have 48 hours to create a game around this topic, from scratch, including artwork and sound effects. This was my first time ever I participated in such an event, and I don’t think it will be the last! :-)

This contest’s theme was “Shapeshift”. You’re a Floor Lamp Now is a strategic skill game with surprising mechanics. You can play it on the Ludum Dare website.

Title of "You're a Floor Lamp Now"

Screenshot of "You're a Floor Lamp Now"


I wanted to do a web-based game, so I chose the JavaScript game engine CreateJS. It worked quite well, and I certainly learned a lot!

I had a lot of fun recording sounds for this game – everything you hear was created by recording sounds in the apartment, or by making funny noises with my mouth.


I’m happy with my first day as a floor lamp. It’s good to be of service to mousekind. – Hectigo

One of the most memorable and unique games I’ve seen in Compo so far, good job overall. Hilarious concept with great theme interpretation. Graphics are eye-candy, audio is simple but funny and fits the game well and the mood is just awesome. I enjoyed it a lot and appreciated the amount of polish you put in it. – Pietro Ferrantelli


Reviewers praised the game as very original, and many enjoyed the sound effects ;) I was really proud of the “Humor” rating!

almightree almightree 2012-08-18T00:00:00+00:00 blinry clear

  • almightree
    • What is it?
      • A Javascript plugin for jQuery >= 1.8.0
      • It makes large nested lists (like this one) easier to navigate
        • Yep, it powers this page!
      • Free Software (GPLv2+)
    • Features
      • Folding/Unfolding
        • Click on a node to fold or unfold it, if it has children
        • By default, only the first two layers are visible, the rest is folded
      • Real-time search
        • Type in the search bar at the top to filter the tree
        • The search term and the URL’s hash are kept in sync. Observe: #features
          • Consequence: A sane URL will bring up relevant material for a long time
            • Even when new content is added or the structure changes
        • Search is always case-insensitive
        • Special characters
          • /: separates terms, which are searched for one after the other
            • For example, if you want all occurences of “node” in this “Features” section, use #features/node
          • -: any non-alphanumeric stuff
        • Also supports regular expressions!
          • For example, you can search for crossword patterns: #c…s…d
          • Or, words with at least 12 characters? #[a-z]{12,}
      • Intelligent choice of the headline
        • The lowest node with more than one visible child will be displayed as the headline
        • It’s parents will be displayed as a breadcrumb navigation (example)
      • Zooming
        • Click the bullet point in front of a node to search for it’s content
          • In most cases, that means “focusing” on its content (a feature called “hoisting” in many outliners)
      • Undo/Redo
        • Searches performed by clicking (zooms, crumb navigation) are undoable by clicking your brower’s “back” button
    • Setup
      • Complete minimal example
      • Step 1: Take a nested HTML list, and tag it with a unique id, for example #almightree
        • Of course, you can (and should ;-) generate the lists using Markdown
      • Step 2: Download almightree and extract it somewhere
      • Step 3: Insert the following lines into your HTML:
        • <script src=""></script>
          • … if you haven’t included jQuery already
        • <script src="path/to/jquery.almightree.js"></script>
          • … to include the almightree plugin
        • <script>$(function(){ $("#almightree").almightree({search: "#almightree-search"}); });</script>
          • … to activate the plugin on the <ul> with the id #almightree
          • The search option makes the <input> with the specified id interactive
        • <link rel="stylesheet" href="path/to/almightree.css">
          • This is a default set of style rules
          • If you want to make changes, do it in an additional CSS file to keep the default CSS upgradable
      • Step 4: Report bugs and make feature requests! <3
    • History
LilyPond vs earworms lilypond-vs-earworms 2015-05-19T00:00:00+00:00 blinry If an earworm gets too bad, I sometimes try to get rid of it by typesetting the melody in LilyPond, a high-quality music engraving program. Can you find out what all of these are? Solutions below.

These are the themes from “Path of The Wind” (from My Neighbor Totoro), the Sax Guy loop, and the Star Trek: The Next Generation intro.

sike mama sike-mama 2015-10-26T15:30:00+01:00 blinry This is a translation of Andy Weir’s beautiful short story The Egg to a constructed language called Toki Pona, which has a vocabulary of only 120 words and a very simple grammar. Miv was so kind to patiently go over a preliminary version of this text and to fix all of my silly mistakes. Thanks!

Andy kindly allowed me to display the Toki Pona version side-by-side to the English original. For convenience, I also included a Toki Pona-only version below.

The Egg sike mama
You were on your way home tenpo pi tawa tomo sina la
when you died. sina moli.
It was a car accident. tan moli li pakala pi tomo tawa.
Nothing particularly remarkable, ona li suli ala.
but fatal nonetheless. taso sina moli.
You left behind a wife and two children. sina jo e meli e jan lili tu.
It was a painless death. sina pilin ala e pakala.
The EMTs tried their best to save you, jan sona sijelo li pali mute.
but to no avail. taso ona li weka ala e moli.
Your body was so utterly shattered moli ni li pona tawa sina tan ni:
you were better off, trust me. sijelo sina li pakala mute mute.
And that’s when you met me. tenpo ni la sina kama tawa mi.
“What… what happened?” You asked. “Where am I?” sina toki pi wile sona e ni: “seme… seme li kama? mi lon seme?”
“You died,” I said, matter-of-factly. mi toki lon e ni: “sina moli.”
No point in mincing words. mi wile toki e ijo lon.
“There was a… a truck “mi lukin e… e tomo tawa suli.
and it was skidding…” ona li tawa nasa…”
“Yup,” I said. mi toki e ni: “lon.”
“I… I died?” “mi… mi moli anu seme?”
“Yup. But don’t feel bad about it. mi toki e ni: “moli. taso o pilin ike ala tawa ni.
Everyone dies,” I said. jan ali li moli.”
You looked around. sina lukin sike.
There was nothingness. ma ala li lon ni.
Just you and me. sina taso en mi taso li lon.
“What is this place?” You asked. sina toki pi wile sona e ni: “ma ni li seme?
“Is this the afterlife?” ona li ma pi jan moli anu seme?”
“More or less,” I said. mi toki e ni: “ni li sama lon.”
“Are you god?” You asked. sina toki pi wile sona e ni: “sina jan sewi anu seme?”
“Yup,” I replied. “I’m God.” mi toki e ni: “lon. mi jan sewi.”
“My kids… my wife,” you said. sina toki e ni: “jan lili mi… meli mi…”
“What about them?” “seme pi ona mute li suli?”
“Will they be all right?” “ona mute li pilin pona anu seme?”
“That’s what I like to see,” I said. mi toki e ni: “ni li pona tawa mi.
“You just died tenpo pini lili la sina moli.
and your main concern is for your family. taso sina pilin pi kulupu mama sina.
That’s good stuff right there.” sina jan pona.”
You looked at me with fascination. sina lukin pi pilin wawa e mi.
To you, I didn’t look like God. mi lukin ala sama jan sewi tawa sina.
I just looked like some man. mi lukin sama jan ijo.
Or possibly a woman.  
Some vague authority figure, maybe. ken la mi lukin sama jan lawa.
More of a grammar school teacher mi lukin sama jan pi pana sona.
than the almighty. mi lukin ala sama jan pi wawa ali.
“Don’t worry,” I said. mi toki e ni: “o pilin ike ala.
“They’ll be fine. tenpo kama la ona mute li pilin pona.
Your kids will remember you jan lili sina li pilin e ni:
as perfect in every way. sina pona mute.
They didn’t have time ona li jo ala e tenpo tawa ni:
to grow contempt for you. ona li pilin ike tawa sina.
Your wife will cry on the outside, meli sina li pana e telo oko.
but will be secretly relieved. insa taso la ona li pilin pona.
To be fair, mi pilin e ni:
your marriage was falling apart. wan pi sina en ona li kama tu.
If it’s any consolation, ken la sina pilin pona tawa ni:
she’ll feel very guilty ona li pilin ike tawa ni:
for feeling relieved.” ona li pilin pona tawa weka sina.”
“Oh,” you said. sina toki e ni: “a.
“So what happens now? tenpo ni la seme li kama?
Do I go to heaven or hell or something?” mi tawa ma moli pona anu ma moli ike anu seme?”
“Neither,” I said. mi toki e ni: “ala.
“You’ll be reincarnated.” tenpo kama la mi sin e lon sina.”
“Ah,” you said. sina toki e ni: “a.
“So the Hindus were right,” jan pi nasin sewi Intu li sona pona.”
“All religions are right in their own way,” I said. mi toki e ni: “nasin sewi ali li sona pona.
“Walk with me.” o tawa poka mi.”
You followed along sina tawa poka mi.
as we strode through the void. mi tu li tawa lon ma ala.
“Where are we going?” “mi tu li tawa ma seme?”
“Nowhere in particular,” I said. mi toki e ni: “mi tu li tawa ma ijo.
“It’s just nice to walk while we talk.” taso mi tu li toki la tawa li pona tawa mi.”
“So what’s the point, then?” You asked. sina toki pi wile sona e ni: “sina pali e ni tan seme?
“When I get reborn, sina sin e lon mi la
I’ll just be a blank slate, right? mi kama jan pi sona ala anu seme?
A baby. mi jan lili.
So all my experiences and everything I did in this life ali pi lon mi en pali ali mi
won’t matter.” li suli ala.”
“Not so!” I said. mi toki e ni: “ona li suli!
“You have within you all the knowledge and experiences sina jo e sona
of all your past lives. pi lon ali sina lon insa sina.
You just don’t remember them right now.” taso tenpo ni la sina sona ala e ona.”
I stopped walking and took you by the shoulders. mi pini e tawa mi li pilin e sewi pi monsi sina.
“Your soul is more magnificent, beautiful, “sina ken ala sona e ali ni:
and gigantic than you can possibly imagine. kon sina li pona mute, li suli mute.
A human mind can only contain a tiny fraction sona jan li ken jo e ijo lili lili wan taso
of what you are. pi kon suli sina.
It’s like sticking your finger in a glass of water ni li sama ni: sina pana e palisa luka sina tawa poki tan ni:
to see if it’s hot or cold. sina wile sona e ni: telo li lete anu seli?
You put a tiny part of yourself into the vessel, sina pana e ijo lili lili wan sina tawa poki.
and when you bring it back out, sina weka e ona tan poki la
you’ve gained all the experiences it had. ona li pana e sona ali pi poki ni tawa sina.
“You’ve been in a human for the last 48 years, tenpo suli la sina lon sijelo jan.
so you haven’t stretched out yet and felt sina pilin ala e ni:
the rest of your immense consciousness. kon sina li suli mute.
If we hung out here for long enough, mi tu li awen lon ni la
you’d start remembering everything. sina kama sona sin e ali.
But there’s no point taso ni li pona ala:
to doing that between each life.” tenpo ali la mi tu li awen.”
“How many times have I been reincarnated, then?” “tenpo pi mute seme la sina sin e lon mi?”
“Oh lots. Lots and lots. mi toki e ni: “a. tenpo mute. tenpo mute mute.
An in to lots of different lives.” I said. mi pana sijelo pi jan ante mute.
“This time around, tenpo ni pi kama lon la
you’ll be a Chinese peasant girl sina meli lili Sonko li pali e kili e soweli
in 540 AD.” li lon tenpo pini pini.”
“Wait, what?” You stammered. sina toki pilin e ni: “a, seme?
“You’re sending me back in time?” sina pana e mi tawa tenpo pini anu seme?”
“Well, I guess technically. “a, ni li sama lon.
Time, as you know it, sina sona e tenpo.
only exists in your universe. taso tenpo li lon ma suli sina taso.
Things are different where I come from.” ma mi la ijo li ante.”
“Where you come from?” You said. sina toki e ni: “ma sina?”
“Oh sure,” I explained mi toki pona: “a, lon.
“I come from somewhere. mi kama tan ma ijo.
Somewhere else. mi kama tan ma ante.
And there are others like me. jan sewi ante li lon ma ni.
I know you’ll want to know mi sona e ni: sina wile sona e ni:
what it’s like there, ma ni li seme lukin?
but honestly you wouldn’t understand.” taso mi toki e ni tawa sina la sina ken ala sona e ni.”
“Oh,” you said, a little let down. sina toki pi ike lili e ni: “a.
“But wait. taso o kute e mi.
If I get reincarnated to other places in time, mi tawa tenpo ante la
I could have interacted with myself at some point.” ni li ken: tenpo ijo la mi toki tawa mi.”
“Sure. Happens all the time. “lon. tenpo mute la ni li kama.
And with both lives only aware of their own lifespan sina tu li sona e lon sina wan taso la
you don’t even know it’s happening.” sina sona ala e ni: sina toki tawa sina.”
“So what’s the point of it all?” “seme li tan ali?”
“Seriously?” I asked. “Seriously? mi toki e ni: “a, sina toki pi wile sona e ni?
You’re asking me for the meaning of life? sina wile sona e ni: seme li tan ali?
Isn’t that a little stereotypical?” jan ali li wile sona e ni!”
“Well it’s a reasonable question,” you persisted. sina toki pi awen pona e ni: “mi wile sona e tan!”
I looked you in the eye. mi lukin e oko sina.
“The meaning of life, “tan ali,
the reason I made this whole universe, en tan pi ma suli ni,
is for you to mature.” li ni: sina kama sona.
“You mean mankind? “sina toki e ijo pi jan ali anu seme?
You want us to mature?” sina wile ala wile e ni: mi mute li kama sona?”
“No, just you. “wile ala. mi wile e ni: sina taso kama sona.
I made this whole universe for you. mi pali e ma suli ni tawa sina taso.
With each new life you grow and mature sina lon sin la sina kama suli
and become a larger and greater intellect.” li kama sona.”
“Just me? What about everyone else?” “mi taso? sina pali ala pali e ma suli tawa jan ante?”
“There is no one else,” I said. mi toki e ni: “jan ante li lon ala.
“In this universe, there’s just you and me.” sina taso en mi taso li lon ma suli ni”
You stared blankly at me. sina lukin pi wawa ala e mi.
“But all the people on earth…” “taso jan ali pi lon ma sike…”
“All you. Different incarnations of you.” “jan ali li sina. jan ali li sina ante.”
“Wait. I’m everyone!?” “o awen! mi jan ali!?”
“Now you’re getting it,” mi toki e ni: “lon. tenpo ni la sina sona.”
I said, with a congratulatory slap on the back. mi pilin e sewi pi monsi sina tan ni: mi pilin pona.
“I’m every human being who ever lived?” “tenpo pini la mi jan ali ala jan ali?”
“Or who will ever live, yes.” “jan ali. tenpo kama kin la sina jan ali.”
“I’m Abraham Lincoln?” “mi jan Epapan Linkon tan seme?”
“And you’re John Wilkes Booth, too,” I added. mi toki e ni: “sina jan Jon Wike Pu kin.”
“I’m Hitler?” You said, appalled. sina toki ike e ni: “mi jan Itala tan seme?”
“And you’re the millions he killed.” “jan Itala li moli e jan mute mute mute. sina jan mute ni kin.”
“I’m Jesus?” “mi jan Jesu tan seme?”
“And you’re everyone who followed him.” “jan mute li tawa poka ona. sina jan mute ni kin.”
You fell silent. sina pini e toki sina.
“Every time you victimized someone,” I said, mi toki e ni: “sina pakala e jan la
“you were victimizing yourself. sina pakala e sina.
Every act of kindness you’ve done, sina pali e pona tawa jan la
you’ve done to yourself. sina pali e pona tawa sina.
Every happy and sad moment ever experienced by any human jan ali li pilin pona anu pilin ike la
was, or will be, experienced by you.” sina pilin sama.”
You thought for a long time. tenpo suli la sina pilin e ni.
“Why?” You asked me. “Why do all this?” sina toki pi wile sona e ni: “sina pali e ni tan seme?”
“Because someday, you will become like me. “tan li ni: tenpo ijo la sina kama sama mi.
Because that’s what you are. sina ni:
You’re one of my kind. sina sama mi.
You’re my child.” sina jan lili mi.”
“Whoa,” you said, incredulous. sina toki pilin e ni: “a!
“You mean I’m a god?” mi jan sewi anu seme?”
“No. Not yet. “tenpo ni la sina jan sewi ala.
You’re a fetus. sina jan sewi pi open ala.
You’re still growing. sina suli kin e sina.
Once you’ve lived every human life throughout all time, tenpo ali la sina jo lon pi jan ali.
you will have grown enough to be born.” ni li kama la sina suli li open e lon sina.”
“So the whole universe,” you said, “it’s just…” sina toki e ni: “ma suli ali li …”
“An egg.” I answered. mi toki kin e ni: “sike mama taso.
“Now it’s time for you to move on to your next life.” tenpo ni la mi wile e ni: mi sin e lon sina.”
And I sent you on your way. mi pana e sina tawa nasin sina.

Toki Pona-only version

sike mama

tenpo pi tawa tomo sina la sina moli.

tan moli li pakala pi tomo tawa. ona li suli ala. taso sina moli. sina jo e meli e jan lili tu. sina pilin ala e pakala. jan sona sijelo li pali mute. taso ona li weka ala e moli. moli ni li pona tawa sina tan ni: sijelo sina li pakala mute mute.

tenpo ni la sina kama tawa mi.

sina toki pi wile sona e ni: “seme… seme li kama? mi lon seme?”

mi toki lon e ni: “sina moli.” mi wile toki e ijo lon.

“mi lukin e… e tomo tawa suli. ona li tawa nasa…”

mi toki e ni: “lon.”

“mi… mi moli anu seme?”

mi toki e ni: “moli. taso o pilin ike ala tawa ni. jan ali li moli.”

sina lukin sike. ma ala li lon ni. sina taso en mi taso li lon. sina toki pi wile sona e ni: “ma ni li seme? ona li ma pi jan moli anu seme?”

mi toki e ni: “ni li sama lon.”

sina toki pi wile sona e ni: “sina jan sewi anu seme?”

mi toki e ni: “lon. mi jan sewi.”

sina toki e ni: “jan lili mi… meli mi…”

“seme pi ona mute li suli?”

“ona mute li pilin pona anu seme?”

mi toki e ni: “ni li pona tawa mi. tenpo pini lili la sina moli. taso sina pilin pi kulupu mama sina. sina jan pona.”

sina lukin pi pilin wawa e mi. mi lukin ala sama jan sewi tawa sina. mi lukin sama jan ijo. ken la mi lukin sama jan lawa. mi lukin sama jan pi pana sona. mi lukin ala sama jan pi wawa ali.

mi toki e ni: “o pilin ike ala. tenpo kama la ona mute li pilin pona. jan lili sina li pilin e ni: sina pona mute. ona li jo ala e tenpo tawa ni: ona li pilin ike tawa sina. meli sina li pana e telo oko. insa taso la ona li pilin pona. mi pilin e ni: wan pi sina en ona li kama tu. ken la sina pilin pona tawa ni: ona li pilin ike tawa ni: ona li pilin pona tawa weka sina.”

sina toki e ni: “a. tenpo ni la seme li kama? mi tawa ma moli pona anu ma moli ike anu seme?”

mi toki e ni: “ala. tenpo kama la mi sin e lon sina.”

sina toki e ni: “a. jan pi nasin sewi Intu li sona pona.”

mi toki e ni: “nasin sewi ali li sona pona. o tawa poka mi.”

sina tawa poka mi. mi tu li tawa lon ma ala. “mi tu li tawa ma seme?”

mi toki e ni: “mi tu li tawa ma ijo. taso mi tu li toki la tawa li pona tawa mi.”

sina toki pi wile sona e ni: “sina pali e ni tan seme? sina sin e lon mi la mi kama jan pi sona ala anu seme? mi jan lili. ali pi lon mi en pali ali mi li suli ala.”

mi toki e ni: “ona li suli! sina jo e sona pi lon ali sina lon insa sina. taso tenpo ni la sina sona ala e ona.”

mi pini e tawa mi li pilin e sewi pi monsi sina. “sina ken ala sona e ali ni: kon sina li pona mute, li suli mute. sona jan li ken jo e ijo lili lili wan taso pi kon suli sina. ni li sama ni: sina pana e palisa luka sina tawa poki tan ni: sina wile sona e ni: telo li lete anu seli? sina pana e ijo lili lili wan sina tawa poki. sina weka e ona tan poki la ona li pana e sona ali pi poki ni tawa sina.

tenpo suli la sina lon sijelo jan. sina pilin ala e ni: kon sina li suli mute. mi tu li awen lon ni la sina kama sona sin e ali. taso ni li pona ala: tenpo ali la mi tu li awen.”

“tenpo pi mute seme la sina sin e lon mi?”

mi toki e ni: “a. tenpo mute. tenpo mute mute. mi pana sijelo pi jan ante mute. tenpo ni pi kama lon la sina meli lili Sonko li pali e kili e soweli li lon tenpo pini pini.”

sina toki pilin e ni: “a, seme? sina pana e mi tawa tenpo pini anu seme?”

“a, ni li sama lon. sina sona e tenpo. taso tenpo li lon ma suli sina taso. ma mi la ijo li ante.”

sina toki e ni: “ma sina?”

mi toki pona: “a, lon. mi kama tan ma ijo. mi kama tan ma ante. jan sewi ante li lon ma ni. mi sona e ni: sina wile sona e ni: ma ni li seme lukin? taso mi toki e ni tawa sina la sina ken ala sona e ni.”

sina toki pi ike lili e ni: “a. taso o kute e mi. mi tawa tenpo ante la ni li ken: tenpo ijo la mi toki tawa mi.”

“lon. tenpo mute la ni li kama. sina tu li sona e lon sina wan taso la sina sona ala e ni: sina toki tawa sina.”

“seme li tan ali?”

mi toki e ni: “a, sina toki pi wile sona e ni? sina wile sona e ni: seme li tan ali? jan ali li wile sona e ni!”

sina toki pi awen pona e ni: “mi wile sona e tan!”

mi lukin e oko sina. “tan ali, en tan pi ma suli ni, li ni: sina kama sona.

“sina toki e ijo pi jan ali anu seme? sina wile ala wile e ni: mi mute li kama sona?”

“wile ala. mi wile e ni: sina taso kama sona. mi pali e ma suli ni tawa sina taso. sina lon sin la sina kama suli li kama sona.”

“mi taso? sina pali ala pali e ma suli tawa jan ante?”

mi toki e ni: “jan ante li lon ala. sina taso en mi taso li lon ma suli ni”

sina lukin pi wawa ala e mi. “taso jan ali pi lon ma sike…”

“jan ali li sina. jan ali li sina ante.”

“o awen! mi jan ali!?”

mi toki e ni: “lon. tenpo ni la sina sona.” mi pilin e sewi pi monsi sina tan ni: mi pilin pona.

“tenpo pini la mi jan ali ala jan ali?”

“jan ali. tenpo kama kin la sina jan ali.”

“mi jan Epapan Linkon tan seme?”

mi toki e ni: “sina jan Jon Wike Pu kin.”

sina toki ike e ni: “mi jan Itala tan seme?”

“jan Itala li moli e jan mute mute mute. sina jan mute ni kin.”

“mi jan Jesu tan seme?”

“jan mute li tawa poka ona. sina jan mute ni kin.”

sina pini e toki sina.

mi toki e ni: “sina pakala e jan la sina pakala e sina. sina pali e pona tawa jan la sina pali e pona tawa sina. jan ali li pilin pona anu pilin ike la sina pilin sama.”

tenpo suli la sina pilin e ni.

sina toki pi wile sona e ni: “sina pali e ni tan seme?”

“tan li ni: tenpo ijo la sina kama sama mi. sina ni: sina sama mi. sina jan lili mi.”

sina toki pilin e ni: “a! mi jan sewi anu seme?”

“tenpo ni la sina jan sewi ala. sina jan sewi pi open ala. sina suli kin e sina. tenpo ali la sina jo lon pi jan ali. ni li kama la sina suli li open e lon sina.”

sina toki e ni: “ma suli ali li …”

mi toki kin e ni: “sike mama taso. tenpo ni la mi wile e ni: mi sin e lon sina.”

mi pana e sina tawa nasin sina.

Stilles Wasser im Blindtest wassertest 2015-10-12T20:03:00+02:00 blinry Blindtests sind toll! Ich habe in der Vergangenheit schon Blindtests von Vollmilchschokoladen, Colasorten und Koffeinbrausen gemacht. Vor einigen Wochen stieß ich dann auf diesen Tweet von dome, in dem es um die Verkostung von stillem Wasser ging. Ich beschloss, einen ähnlichen Test durchzuführen, denn ich hatte in Restaurants schon öfter unangenehm salziges Wasser serviert bekommen, und war dementsprechend neugierig darauf, wie groß die geschmacklichen Unterschiede sein würden.

Nach der Durchführung wurden Rufe nach Open Data laut, diese Dokumentation ist die direkte Folge.

Noch ein Hinweis: Klar, stilles Wasser in Flaschen ist teuer, produziert Plastikabfall und unterliegt in Deutschland weniger strengen Kontrollen als Leitungswasser. Wenn nichts dagegenspricht, bleibt bei Leitungswasser! Und nun viel Spaß beim Lesen!

Fast alle Flaschen Wasser, die am Test teilnahmen


Welches stille Wasser ist das leckerste?


Der Preis von Wasser scheint grundsätzlich invers mit der Geschmacksneutralität zu korrelieren. Anders formuliert: Wenn man Wasser mag, das nach nichts schmeckt, kann man mit den Hausmarken der großen Supermärkte (welche momentan 13 Cent pro Liter kosten) nichts falsch machen.


  1. Die lokalen Supermärkte nach sämtlichen Marken stillen Wassers abgrasen, die sich finden lassen. In diesem Fall umfasste die Auswahl (tatsächlich, und unbeabsichtigterweise) 42 Sorten, plus das örtliche Trinkwasser.

    Einkaufswagen mit etlichen Flaschen Wasser

  2. Jede Wassersorte in einen eigenen Plastikbecher einschenken, auf dessen Unterseite der Name der Sorte steht.

    Abfüllen des Wassers in Plastikbecher

  3. Becher mischen, dann zu Buchführungszwecken seitlich auf jeden Becher eine fortlaufende Indexnummer schreiben.
  4. Prost! Für jede Wassersorte soviele sensorische Eindrücke wie gewünscht notieren (gustatorische, olfaktorische, …). Dabei auch die Indexnummer festhalten, und eine Gesamtnote vergeben. Hinweis: Bei 43 Bechern á 200 ml ergibt sich eine Gesamtmenge von 8,6 Litern Wasser, die, sollte man sie auf einmal zu sich nehmen, definitiv lebensbedrohlich sein kann. Teamwork wird daher empfohlen. In diesem Fall oblag die Durchführung des Tests zwei Personen, Person A und Person B. Person A verwendete ein Schulnotensystem von 0 bis 15 Punkten, während Person B auf einer Skala von -3 (doppelplusschlecht) bis 3 (doppelplusgut) bewertete.

    43 Plastikbecher mit Laptop

  5. Optional: Das obere Quartil der Sorten nochmals durchgehen und auf einer höher angesetzten Skala zu differezieren versuchen.
  6. Die Auflösung. In der Bewertungstabelle die Indexnummern den Wassersorten zuordnen. Folgenreiche Schlüsse ziehen und die bisherigen Lebensentscheidungen kritisch hinterfragen.


Folgende Liste ist nach einer gemittelten Gesamtbewertung sortiert, die sich als Durchschnitt aus den Bewertungen von Person A und Person B berechnet. Zur Erinnerung: Person A verwendete eine Skala von 0 bis 15, Person B eine Skala von -3 bis 3, die Gesamtbewertung ist in Prozent zwischen 0 und 100 angegeben. In sämtlichen Skalen sind höhere Werte besser.

Sämtliche Ergebnisse sind außerdem auch im CSV-Format verfügbar.

  • Christinen Carat (von Real, 0.54 EUR/L): 97%

    • A: Ganz leicht trocken, sonst nix. (14)
    • B: Nix! (3)
  • Surf (von Norma, 0.13 EUR/L): 95%

    • A: Sehr schön neutral, nicht trocken, richtig gut! (13.5)
    • B: Schmeckt nach nix, frisch (3)
  • Nestle Pure Life (von Real, 0.33 EUR/L): 93%

    • A: Sehr schön neutral (13)
    • B: Bisschen kratzig, ansonsten lecker und neutral (3)
  • Elitess Marinius-Quelle (von Penny, 0.13 EUR/L): 87%

    • A: Alte Pizza, erfrischend-neutral, nicht ganz geschmacklos, mysteriös (11)
    • B: Süß, weich, rund, gut (3)
  • Quellbrunn Claudius-Quelle (von Aldi, 0.13 EUR/L): 85%

    • A: Gar nichts, ganz bisschen trocken (13)
    • B: Frisch und weich, ganz bisschen süß (2)
  • Fiji (von Edeka, 3.38 EUR/L): 83%

    (Hinweis: Dieses Getränk hat einen so starken Geschmack, dass es eigentlich nicht als “stilles Wasser” bezeichnet werden kann. Die Bewertungen sind eher außerhalb der Reihe zu verstehen.)

    • A: Wie Alkohol, aber ohne scharf im Hals zu sein. Igitt. Richtig süß. Nicht für jeden Tag. Lustig. (15)
    • B: Plastik? Gummi? Starker Eigengeschmack, eingeweichtes Gummibärchen (1)
  • babylove (von dm, 1.67 EUR/L): 83%

    • A: Bisschen Geschmack. Eigentlich ganz lecker (10)
    • B: Rein und neutral und weich (3)
  • ja! (von Sky, 0.13 EUR/L): 83%

    • A: Bisschen metallisch (10)
    • B: Wirklich NIX! Erfrischend und weich! Wie ein Quellfluss durch eine grüße Wiese! (3)
  • Apollinaris Vio (von Penny, 0.33 EUR/L): 83%

    • A: Schön neutral, “aber jo weiß ich auch nicht” (10)
    • B: Nix. Nix ist gut. (3)
  • Vitalbrunnen Naturalis (von Netto, 0.13 EUR/L): 82%

    • A: Gar nix (12)
    • B: Ganz leicht metallisch, sonst sehr neutral (2)
  • Gut und Günstig (von Edeka, 0.13 EUR/L): 80%

    • A: Erfrischend. Neutral. Nix. (9)
    • B: Etwas säuerlich, aber sonst nix (3)
  • Vilsa (von Real, 0.46 EUR/L): 78%

    • A: Sauer, trocken, insgesamt neutral und frisch (11)
    • B: Etwas sauer, sonst gut (2)
  • Saskia (von Lidl, 0.13 EUR/L): 75%

    • A: Neutral, bisschen süßlich, gut! (10)
    • B: Bisschen süßlich, nicht besonders erfrischend (2)
  • Unser Norden (von Sky, 0.39 EUR/L): 75%

    • A: Nix. (10)
    • B: Ganz leicht sauer, sonst lecker und weich (2)
  • Urstromtaler Naturell (von Netto, 0.33 EUR/L): 75%

    • A: Charakterlos (10)
    • B: Ziemlich langweilig, neutral (2)
  • Black Forest (von Real, 0.59 EUR/L): 73%

    • A: Erfrischend, neutral (12)
    • B: Sehr süß! Weich (1)
  • Vittel (von Penny, 0.39 EUR/L): 73%

    • A: Sehr sauer (7)
    • B: Ziemlich ziemlich neutral, ganz leicht angenehm säuerlich (3)
  • Sawell (von Netto, 0.25 EUR/L): 73%

    • A: Bisschen süß, bisschen trocken (7)
    • B: Erfrischend, lecker? Gaaanz bisschen süß? (3)
  • Tip (von Real, 0.13 EUR/L): 72%

    • A: Erfrischend, bisschen sauer (9)
    • B: Frisch, leicht metallig aber gar nicht schlecht. Weich. (2)
  • Bismarck (von Real, 0.65 EUR/L): 70%

    • A: Vielleicht süßlicher Geschmack, nicht so erfrischend (11)
    • B: Vorgeschmack süß, Nachgeschmack etwas sauer, interessant? (1)
  • Volvic (von Real, 0.59 EUR/L): 65%

    • A: Pieksig auf der Zunge, unangenehm, schon neutral (7)
    • B: Süß und abgekocht, nichts auf Dauer, aber so ganz erträglich (2)
  • Adelholzener (von Real, 0.65 EUR/L): 62%

    • A: Schwach metallisch, nicht erfrischend (6)
    • B: Süß und recht neutral. Leiiicht oszillierend in alle Richtungen. Spannend. (2)
  • Harzer Bergbrunnen extra still (von Real Getränkemarkt, 0.26 EUR/L): 57%

    • A: Geschmacksneutral, säuerlich (7)
    • B: Etwas scharf, erfrischend, etwas sauer, sonst ohne Eigenschaften (1)
  • Magnus (von Edeka, 0.56 EUR/L): 57%

    • A: Hart, Kalk. Wie das Schwimmbad bei Oma. (7)
    • B: Etwas staubig, kratzt im Hals, sauer Nachgeschmack, sonst angenehm neutral (1)
  • Frische Brise Reinbecker Klosterquelle (von Sky, 0.25 EUR/L): 48%

    • A: Bisschen metallisch (7)
    • B: Leicht abgestanden, metallisch (0)
  • Leitungswasser (aus Schleswig-Holstein, 0.00165 EUR/L): 42%

    • A: Erst neutral, Nachgeschmack RICHTIG EKELIG (0)
    • B: Ein Hauch süß, Baby-Wasser (2)
  • Contrex (von Penny, 0.49 EUR/L): 37%

    • A: Sauer und Stumpf. Könnte nicht viel von trinken. (6)
    • B: Sauer, staubig, schlecht. (-1)
  • Aqua Nordic (von Edeka, 0.33 EUR/L): 37%

    • A: Salzig, metallisch (6)
    • B: Langweilig, neutral, “hart”, Nachgeschmack ist metallisch (-1)
  • evian (von Real, 0.59 EUR/L): 33%

    • A: Bisschen metallisch und trocken, sonst kein Charakter (5)
    • B: Leicht metallisch, kratzig (-1)
  • Bleib Gesund (von Rossmann, 0.69 EUR/L): 33%

    • A: Bisschen trocken, nicht erfrischend, bisschen süßlich. Nicht gut als Wasser. (5)
    • B: Nicht erfrischend, etwas salzig, staubig (-1)
  • Vitrex (von Edeka, 0.33 EUR/L): 32%

    • A: Ih! Sauer, scharf, schmeckt mir nicht (2)
    • B: Staubig, etwas sauer, etwas metallisch (0)
  • Real Quality (von Real, 0.23 EUR/L): 28%

    • A: Sauer, trocken, abgestanden, nicht gut (6)
    • B: Bisschen sauer-metallisch, abgestanden (-2)
  • Aqua Mia (von REWE, 0.33 EUR/L): 28%

    • A: Richtig staubig (1)
    • B: Abgestanden, etwas süß. (0)
  • Quellbrunn Werretaler-Quelle (von Aldi, 0.22 EUR/L): 27%

    • A: Irgendwie süß, schwebt auf der Zunge. Nicht erfrischend genug. (8)
    • B: Ekelig metallisch, bah. Bisschen süß. (-3)
  • Harzer Bergbrunnen still (von Real Getränkemarkt, 0.48 EUR/L): 27%

    • A: Sauer halt (3)
    • B: Stark sauer! Aber nicht uninteressant! (-1)
  • Carolinen natur-elle (von Real, 0.46 EUR/L): 22%

    • A: Total salzig (4)
    • B: Rostnagel, Nachgeschmack ekelig (-2)
  • Extaler Mineralquell (von Real, 0.34 EUR/L): 22%

    • A: Sehr neutral, ganz bisschen säuerlich, bisschen trocken, pritzelt (4)
    • B: Leicht sauer, stark metallisch (-2)
  • Hella (von Real, 0.51 EUR/L): 22%

    • A: Staubig muffig, aber nicht doll (4)
    • B: Stark metallisch, langweilig? (-2)
  • Vöslauer (von dm, 0.65 EUR/L): 18%

    • A: Nicht viel von, metallisch (3)
    • B: Unangenehm metallisch (-2)
  • Christinen Naturelle (von dm, 1.10 EUR/L): 15%

    • A: Saures abgestandenes Mineralwasser. Kohlensäure-Geschmack. (2)
    • B: Sauer mineralwasserig. Bäh. (-2)
  • Gerolsteiner (von Edeka, 0.59 EUR/L): 12%

    • A: Richtig sauer (1)
    • B: Etwas metallisch, etwas sauer (-2)
  • Carolinen (von Real, 0.60 EUR/L): 3%

    • A: Oh! Süüüüß!! Ne, das mag ich nicht in großer Menge. Trocken. (1)
    • B: Ganz starker Eigengeschmack, salzig und metallisch (-3)
  • Staatl. Fachingen (von Real Getränkemarkt, 0.96 EUR/L): (unbewertet)

    (Hinweis: Dieses Getränk war beim Probieren eindeutig kohlensäurehaltig und wurde deshalb nicht bewertet. Obwohl das Etikett es als “still” auszeichnet, enthält es laut Homepage 1.5 g Kohlensäure pro Liter.)


Offenbar war das Geschmacksideal beider Testpersonen möglichst geschmacksneutrales Wasser. Saure und metallische Geschmacksnoten wurden deutlich abgelehnt, aber auch Sorten mit süßen Unternoten landeten eher im oberen Mittelfeld.

Auffällig ist, dass sämtliche Hausmarken der großen Supermärkte, die momentan für 13 Cent/L gehandelt werden (Gut und Günstig von Edeka, Elitess von Penny, Quellbrunn von Aldi, ja! von REWE, Saskia von Lidl, Tip von Real, Surf von Norma, Vitalbrunnen von Netto) alle mit Gesamtnoten von mindestens 72% abschlossen.

Auch im Allgemeinen ist im Verhältnis von Preis und Gesamtnote ein Abwärtstrend zu erkennen, wenn man eine Trendlinie über die Daten legt (die preislichen Ausreißer Fiji und babylove werden in diesem Diagramm nicht berücksichtigt):

Preis vs Gesamtnote

Es gab außerdem wenige Sorten, die von den Testpersonen grundsätzlich anders bewertet wurden. Ausnahmen umfassen das Leitungswasser, das von Person A mit 0 und von Person B mit 2 Punkten bewertet wurde, sowie das Quellbrunn Werretaler-Quelle, das von Person A mit 8 und von Person B mit -3 Punkten bewertet wurde:

Note A vs Note B


Zuletzt noch einige Anmerkungen, welche die Testdurchführung betreffen, und die bei der Nachahmung dieses Versuches hilfreich sein sollen.

Plastikbecher sind dünnwandig [citation needed]. Bei dieser Durchführung wurde nicht bedacht, dass man potentiell in der Lage sein würde, die auf dem Boden stehende Sortenbezeichnung beim Trinken (spiegelbildlich) zu lesen. Es wird eine weitere Indirektionsstufe in Schritt 2 empfohlen: Eine Tabelle der Sorten aufstellen, diese zufällig sortieren, ihnen jeweils eine Nummer zuordnen, und diese dann vor dem Befüllen auf den Boden schreiben. Bei dieser Durchführung wurde dieser Defekt durch die Technik “nicht Hingucken” ausgeglichen.

Die Geschmacksbeurteilung wurde bei dieser Durchführung unstrukturiert in einem Freitextfeld durchgeführt, da uns zu Beginn des Tests keine Kriterienliste vorlag, mithilfe derer die Bewertung strukturiert hätte werden können. Nach Abschluss des Tests empfehlen wir, folgende geschmackliche Aspekte getrennt festzuhalten, um eine differenziertere Beurteilung zu erlauben:

  • Säure
  • Süße
  • Salzgehalt
  • Metallgehalt
  • Härte
  • Sonstige Geschmacksnoten

Ganz sicher fand bei dieser Durchführung durch die gemeinsame, gleichzeitige Verkostung eine gegenseitige Beeinflussung der Testpersonen statt. Dies wurde hier bewusst in Kauf genommen. Wem exakte, unabhängige Ergebnisse wichtiger sind als die Gestaltung des Tests als soziales Event, dem sei statt einer parallelen Verkostung eine serielle empfohlen.


Wir wären sehr daran interessiert, wie reproduzierbar unsere Ergebnisse sind. Insofern ergeht der Aufruf an alle Leser, diesen Blindtest – gegebenenfalls in kleinerem Stil, mit bekannten oder leicht zugänglichen Wassersorten – zu wiederholen!

Bei der bisherigen Auswertung haben wir uns auf die rein subjektiven Geschmacksbewertungen beschränkt. Eine weitergehende Inbezugsetzung der Geschmacksurteile und der Mineralstoffkonzentrationen in den Wassersorten wäre interessant und ist in Planung.

Schließlich an dieser Stelle nochmals herzlichen Dank an die nicht namentlich gennante Testperson für tatkräftigen und moralischen Beistand und die professionelle wissenschaftliche Betreuung.

Exact Minkowski Sums of Polygons With Holes exact-ms-of-pwhs 2015-02-22T00:00:00+00:00 blinry This is the first “real” scientific paper which I coauthored. It’s about the design and implementation of an algorithm which computes the so called Minkowski sum of two polygons.

I like to explain the topic like this: Imagine you have two stamps of arbitrary shape. First, you stamp one of them on paper, and then, you mark a point on the second one and stamp all over the other one, so that the point is inside of the first stamp. We’re interested in the shape of the result, and in this paper, we’re investigating an algorithm which computes this exactly and fast. It’s the first exact implementation that is able to compute the Minkowski sum of polygons with holes. We also show that, if the polygons contain holes, you can always “fill up” all holes in one of them without chaning the result, and use that property to speed up the algorithm even more in some cases.

You can find a preprint of the paper on (linked below). I also presented the paper at EuroCG 2015 and ESA 2015:

Preprint at Talk at ESA 2015

The resulting implementation has become part of the open source Computational Geometry Algorithms Library, starting from version 4.7.

Zitat-Sammlung zitate 2015-09-11T19:33:00+02:00 blinry Ein paar über viele Jahre gesammelte Zitate. Die englischen findest du hier.

Für den, der hinschaut
Sehen die Berge
Jeden Tag anders aus

Nicht durch Zorn, sondern durch Lachen tötet man.

Der Mensch sollte sich immer als ein Experiment der Natur betrachten.
Friedrich Hebbel

Wenn du etwas liebst, lass es frei. Kommt es zurück, gehört es dir - für immer.

Ich habe keine Lösung, aber ich bewundere das Problem.

Wer wissen will, wie das Wetter ist, sollte aus dem Fenster sehen. Wer wissen will, wie morgen das Wetter ist, sollte morgen aus dem Fenster sehen.
Max Goldt

Wer fragt, ist ein Narr für fünf Minuten. Wer nicht fragt, bleibt ein Narr für immer.
aus China

Planung ersetzt Zufall durch Irrtum
Einstein zugeschrieben

Man kann einen Menschen mit guten Saucen ebenso unter die Erde bringen wie mit Strychnin, nur dauert es länger.
Christiaan Barnard

Ein Bauch sieht von oben am dicksten aus.
Sebastian Morr

Ein reicher Mann ist oft nur ein armer Mann mit sehr viel Geld.
Aristoteles Onassis

Mit der Zeit wird aus Gras Milch.
aus China

Jeder ist nützlich, und sei es nur als schlechtes Beispiel.

Quote collection quotes 2015-09-11T19:33:00+02:00 blinry Some quotes, collected over the course of many years. You can find some german ones here.

Time flies like a river.
Fruit flies like a banana.

Time is a great teacher, but unfortunately it kills all its pupils…
Louis Hector Berlioz

If the bee disappears from the surface of the earth, man would have no more than four years to live. No more bees, no more pollination, no more plants, no more man.
attributed to Albert Einstein

A clever person solves a problem. A wise person avoids it.
Albert Einstein

Give a man a fish, and you feed him for a day. Teach a man to fish, and you feed him for a lifetime.

Build a man a fire, and he’ll be warm for a day. Set a man on fire, and he’ll be warm for the rest of his life.
Terry Pratchett

The AI does not hate you, nor does it love you, but you are made out of atoms which it can use for something else.
Eliezer Yudkowski

Friends come and go, but enemies accumulate.
Thomas Jones

It seems that perfection is attained not when there is nothing more to add, but when there is nothing left to remove.
Antoine de Saint Exupéry

Choose a job you love, and you will never have to work a day in your life.

With sufficient thrust, pigs fly just fine.
RFC 1925

I will not apologize for art!
Caaaaaaarl from “Lamas with hats”

I am a creationist. I believe man created God.

Give me six hours to chop down a tree and I will spend the first four sharpening the axe.
Abraham Lincoln

Give a man a gun and he can rob a bank. Give a man a bank and he can rob the world.

If you torture the data long enough, it will confess
Ronald Coase

Forget the money, because if you say that getting the money is the most important thing, you will spend your life completely wasting your time. You’ll be doing things you don’t like doing in order to go on living there just to do things you don’t like doing. Which is stupid. Better to have a short life that is full of what you like doing than a long life spent in a miserable way.
Alan Watts

Remember, if you succeed in everything you try in life, you’re living below your full potential and you should take up more difficult or daring things.
Eliezer Yudkowsky

Every time you spend money, you’re casting a vote for the kind of world you want.
Anna Lappe

As long as I feel that I can stand up and leave here, anytime I please… I can stay.
Mimi from “Real Humans”

If you love a flower, don’t pick it up. Because if you pick it up, it dies and it ceases to be what you love. So if you love a flower, let it be. Love is not about possession. Love is about appreciation.

If you wish to make an apple pie from scratch, you must first invent the universe.
Carl Sagan

Believing this statement will make you happier.
Ryan Lortie

Every word in this sentence is a gross misspelling of the word “tomato.”
Douglas Hofstadter

Every picture of you is when you were younger.
Mitch Hedburg

A clean house is a sign of a wasted life

For years, I was one of the extremely shy women. I don’t think I ever asked a questions after a talk during my PhD. Not asking a question for fear of looking stupid means giving my own ego a very high priority. A higher priority than a potential learning experience for myself, the audience and the speaker.

It really is true that you become an average of the people you spend the most time with.
Sam Altman

Everyone in life has a purpose, even if it’s to serve as a bad example.
Carroll Bryant

Life isn’t about waiting for the rain to pass, it’s about learning how to dance in the rain.
Vivian Greene

Design is removal of the irrelevant.

Dozentensprüche dozenten-sprueche 2011-07-17T00:00:00+00:00 blinry Gesammelte Dozentensprüche aus 5 Jahren Informatikstudium an der TU Braunschweig.


  • “Nech?”
  • “Das ist natürlich klar.”
  • “Vektoren in der Schule als Kohärenzklassen von Pfeilen darzustellen, sollte man unter Strafe stellen!”
  • “Ihre Nasenspitzen sind in R³!”
  • “Das Lambda sieht aus wie ne Giraffe”
  • “Wenn Sie in die Nähe der Sonne kommen, gilt die Euklidische Geometrie nicht mehr. Da müssen Sie aufpassen. Abgesehen davon, dass es sehr heiß wird.”
  • “Wir sind ein freies Land! Sie können auch durch die Klausur fallen, ohne, dass Sie eingesperrt werden.”
  • (Warnt vor überflüssigen Zeilenvertauschungen) “Das ist wie beim Fussball: Man rechnet und rechnet und kriegt nichts raus!”
  • (Zwei Studenten verlassen den Hörsaal) “Dies ist ein sittenfreies Land.”
  • (Ergänzt etwas im Skript) “Das fiel mir heute in der Badewanne ein. Ich wär fast abgesoffen.”
  • (Steht vor sechs vollgeschriebenen Tafeln) “Im Grunde habe ich bisher gar nichts gemacht.”
  • “In der Bronzezeit, als ich zur Schule gegangen bin…”
  • “Auch im großen Zoo von Hannover gibt es keine sqrt(2) zu betrachten.”
  • (Weist darauf hin, dass er die Definition der natürlichen Zahlen eigentlich nicht “Def 1.9” nennen dürfte, da die 9 noch nicht eingeführt ist.)
  • “Bei aller Diskussion, ob der Islam zu Deutschland gehört, wollen wir die römischen Zahlen wieder einführen?”
  • (Empfiehlt Fachliteratur) “Wenn Sie die anfassen, sollten Sie lieber Handschuhe anziehen, damit Sie sich nicht anstecken.”
  • “Newton war ein Arschloch. Aber ein Arschloch, dass wir nach wie vor lieben und verehren.” (Später) “Er hat an der Börse viel Geld verloren, als Mathematiker, darüber kann man eher lachen.”


  • (Thema: Widerstände) “Dicke” (zeigt auf sich) “geben Wärme schneller ab”
  • “Das kann ich umformeln”
  • “Die Theoremtabelle ist nicht die Rücktransformationstabelle. Die Theoremtabelle ist die Theoremtabelle!”
  • “Die Aufgabe ist beendet, jetzt gibts noch ein bisschen was zu lernen.”


  • (Schaut auf seinen Zettel) “Ich glaube, ‘(gamma, b)’ soll das heißen…”
  • “Wir sollen ja multimedial arbeiten, ich mach das jetzt mal” (holt rote Kreide)
  • “Wenn man verstanden hat, dass der Weihnachtsmann der Äquivalenzklasse aller Männer mit rotem Mantel und weißem Bart entspricht, kann man wieder gut an ihn glauben”
  • “An die Abstraktion gewöhnt man sich ziemlich schnell.” (Hebt den Zeigefinger) “Man kann sogar süchtig werden!”
  • (Beispiel fürs Public-Key-Verfahren) “Wir nehmen als erstes zwei große Primzahlen, nämlich 3 und 5…”
  • “Der Informationsverlust bei Stille Post entspricht der Entropie in der Wärmelehre.”
  • “Irgendwelche Leute sammeln ja online Aussagen von Dozenten, und ich sage demnach immer…” (dann der Spruch mit dem Weihnachtsmann)
  • “Nehmen Sie eine Menge aus zwei Äpfeln und eine aus zwei Birnen. Die Mengen sind disjunkt. Hm, die Menge der Äpfel ist endlich. Gibt es mehr Äpfel als Birnen? Schlechtes Beispiel, nehmen Sie halt irgendwas, was geht.”
  • “Wir nehmen… Also… Ach, ich schreibs mal auf.”


  • “Turingmaschinen können soviel wie Ihr Handy. Naja, Telefonieren nicht.”
  • “Das klappt natürlich nur, weil wir vollständig und deterministisch sind!”
  • “Reguläre Ausdrücke sind plattgehauene Bäume.”
  • “Es gibt für Variablen zwei Möglichkeiten, überflüssig zu sein”
  • “Sobald ein Durchschnitt ins Spiel kommt, bin ich im kontextfreien Fall verloren.”
  • “Hier dürfen Sie mal das Wort ‘trivial’ benutzen. Das ist Ihnen ja sonst bis zum Master verboten.”
  • “Hier brauchen wir eine trusted authority – ein Oxymoron ersten Grades…”
  • “Wo kriegen wir denn unsere Primzahlen her? Das ‘große Buch der Primzahlen’ gibt’s leider nicht.”
  • “Was ist das hier? Der Satz ist mir zu lang.”
  • “Der Angreifer heißt U, für ‘Uschi’ – die Folien sind noch aus seeligen Zensursula-Zeiten.”
  • “Ich hab jetzt Bob wieder rechts hingeschrieben, wie sich das gehört.”
  • (Terminfindung) “Also, 8-Uhr-Sachen mach ich nicht” (Streicht Zeile in Terminplan durch)
  • “Einen Moment Geduld. Das kann nur endlich lange dauern.”
  • “Wenn ich einen Körper habe, kann ich darüber Polynome bilden.”


  • “Bitte tragen Sie sich in den Email-Verteiler ein. Wenn Sie keine Emailadresse haben, kommen Sie bitte zu mir nach vorne, dann erkläre ich Ihnen, wie Sie das Studienfach wechseln.”
  • “c_1g und c_2g nehmen f in die Zange und führen es in die Unendlichkeit ab!”
  • (Nennt Objekte x_1, … , x_n. Sagt stolz:) “Das x soll andeuten, dass da noch was unbekannt ist!”
  • (Technische Probleme) “Wenn Kreide abstürzt, dann hebt man sie einfach auf!”
  • (Lösung von NP-vollständigen Problemen) “Alternativ können Sie auch auf Ihr Glück vertrauen. Sind Wirtschaftsinformatiker anwesend?”
  • (Thema: Wiedersprüchliche Ziele beim Algorithmenentwurf) “Das ist so wie mit den ehrlichen, hart arbeitenden Investmentbankern. Davon können auch nur zwei Dinge gleichzeitig erfüllt sein.”


  • “Sozusagen.”
  • (Hört falsche Lösungsidee) “Nee, da hätte ich Kopfschmerzen”
  • (Hausaufgabenrückgabe, auf dem Tisch liegen die Mappen mit den Hausaufgaben:) “Ich hab ALLES dabei, was ich habe!”


  • (Thema: Powerpoint-Präsentationen) “Bis man das vorbereitet hat, bin ich schon wieder gestorben.”
  • (Um halb Acht) “Steht die Uhr?” (Zustimmendes Murmeln) “Ja, es war doch eben schon halb acht! Na, zehn Minuten haben wir noch.”


  • “Genug Mathematik, kommen wir zurück zur Logik.”
  • “Die natürliche Deduktion kann ein Programm leicht nachvollziehen. Aber wenn Sie schreiben ‘de-Morgansche Regel’ kratzt sich der Computer am Kopf.”


  • Student: “Was heißt das da an der Tafel?” - Reineke: “Eins hoch Dreck!”
  • (Erklärt Lösung umgangssprachlich, so dass sie jeder verstanden hat) “Und das schreibe ich jetzt möglichst kompliziert hin.”
  • (Schreibt:) “Es ist leicht einzusehen…” (grinst selbst)
  • “Für wen Briefmarkensammeln zu aufregend ist, kann es sich ja zum Hobby machen, übers Wochenende Komplexitätsklassen zu besuchen.”


  • “Betriebssysteme sollten nach Möglichkeit nicht terminieren.”


  • “Wenn Sie in der Klausur auf das Ergebnis kommen, dass die Wasseraustrittsgeschwindigkeit am Schlauch 100 m/s beträgt, sollten Sie nochmal nachrechnen. Denn sonst sind da keine Blumen mehr.”


  • “Die Römer waren die Amerikaner des Altertums!”
  • “Menschen können 40 Tage ohne Nahrung auskommen - also, ich nicht, aber theoretisch.”
  • “…Bulldoggen! Äh, Bulldozer!”
  • “Klim-plus-Bim-Quadrat ist Klim-Quadrat plus zwei Klimbim plus Bim-Quadrat!”
  • “Alle diese Bildnisse zeigen einen idealtypischen Griechen. Der sieht ungefähr so aus wie ich: Bart… muskulöser Körper… ernster, in die Zukunft gerichteter Blick…”
  • “Manche Politiker sagen: ‘Wir haben einen Quantensprung geschafft!’ - der Quantensprung ist die kleinste Entfernung, über die man Energie überhaupt übertragen kann!”
  • “Pythagoras gründete eine Sekte mit komischen Regeln, z.B. durfte man keine Bohnen essen. Naja, das versteh ich ja noch.”
  • “Gegeben ist ein kubischer Steinaltar. Konstruieren Sie, nur mit Zirkel und Lineal, einen Altar mit doppeltem Volumen.”
  • “Wenn Sie früher nen Roman schreiben wollten, mussten Sie 500 Ziegen wegmetzeln.”
  • (Stratigraphie) “Christliches Erbauungsmaterial? Was soll der Kack, darunter ist Mathematik! Machen wir das mal weg.”
  • “Die Unendlichkeit zu erwähnen war bei den Griechen wie FKK machen mitten in der Stadt”
  • “Wir machen jetzt mal ein Beispiel … in (tiefe Stimme) 3D!!! (normale Stimme) In 2D ist das ja für Sissies.”
  • “Existieren Sie wirklich? Oder sind Sie nur ein Flackern in meiner Großhirnrinde und ich liege in Wirklichkeit in einem Tank, wie in ‘Matrix’ und der Präsident der TU schreibt ein Programm, das suggeriert, dass ich hier rede?”
  • “Wenn ich eine Strecke habe: Besteht die aus Punkten oder besteht sie nicht aus Punkten? Jetzt werden Sie sagen: ‘Das ist mir scheißegal.’”
  • (Beweis von Volumengleichheit per kontinuierlichem Verfahren) “Da kotzt Ihnen Aristoteles sofort die Currywurst mit Pommes aus!”
  • (Platons Göttervorstellung) “Sie sitzen mit Ihrer Geliebten am Fluss, und damit der so sprudelt, löst Gott dauernd im Kopf partielle Differentialgleichungen.”
  • (Mathematiker) “Ich würde sagen: Lustig. Witzig. Sie würden sagen: Schwere psychische Störung.”
  • “Dürrenmatt hat sein Stück ja nicht ‘Die Mathematiker’ genannt… und er hat gewusst, warum.”
  • “Meine Tochter ist Indie. Hört gerne Indie. Ihre Freunde sind auch alle Indie.”
  • “Zack! Beweis durch Hinmalen!”
  • “Interessiert Sie das überhaupt?”
  • “Phi-lo-po-nos. Ich hoffe, der schreibt sich richtig.”
  • (Insekt im Projektorlicht) “Schön warm da.” (Woche später) “Bring ich die immer mit?” (Woche später) “Da biste wieder!” (Klatsch)
  • (Folien sind durcheinander. Ganz ruhig und langsam:) “Ich… bin… eine… Schlampe…”
  • (Bildinterpretation) “Ich verrate Ihnen was: Das hier ist die Melancolia… und das hier ist ein kleiner, dicker Engel!”
  • “Ziehen Sie sich DAS mal LANGSAM durch die NASE rein! 1522! Da fangen die Leute wieder an, sich mit Kegelschnitten zu beschäftigen!”
  • “Jetzt passiert was, was mich immer wieder fröhlich stimmt:” (Folie: “1588: Vernichtung der Spanischen Armada”)
  • “Denken Sie sich eine Zeit, in der der typische englische Bauer ein Bäuerchen war.”
  • “Jetzt habe ich mich schon wieder festgesabbelt …”
  • “Die Engländer haben dann angefangen, mit dem Jakobsstab die Position der Sonne zu bestimmen. Wie oft können Sie das machen? – Zwei mal. Einmal mit dem rechten, einmal mit dem linken Auge.”
  • “Kommentar einer Braunschweigerischen Mathematiklehrerin: ‘Logarithmen sind überbewertet.’ – Manchmal hab ich so Träume, ich hätte ’ne Kettensäge …”
  • “Sinüsse”
  • (Mathematik) “Sieht man ja an der Millenium Bridge, dass man so nen abstrakten Kack nicht braucht. Schwingt ja auch so ganz hübsch.”
  • “Adelard of Bath, auf Deutsch: Adelard aus Bath, war ein junger Engländer aus Bath …”
  • “Der war leider kein Mathematiker, sondern Geisteswissenschaftler. Muss es ja auch geben.”
  • (Es spricht: Der Mechaniker.) “Du hast wohl den Schuss nicht gehört. Guck mal aufs Jahr! Das ist Feinmechanik, das können wir noch nicht, das wird erst in einigen Jahren erfunden.”
  • (Leibnitz’ d-Notation) “Das geht ganz automatisch. Jeder Schimpanse kann ableiten.”
  • (Versucht, zwei Bücher zu unterscheiden. Nach fünf Minuten Beschreibung eines Buches:) “Das Buch meine ich nicht.”


  • “Lektion Nummer 1: Immer die Datenbank-Software verantwortlich machen!”
  • (Datenbanken-Interna) “Wenn man eine Sache schön verpacken möchte, dann nennt man es einfach Algebra.”
  • (Allquantor) “Die Ausssage ‘Alle Studenten hier werden den RDB1-Schein bekommen’ zum Beispiel ist offentsichtlich falsch.”
  • “Yeeeeaah! Freie Variablen!”
  • “Das fragt ihr euch jetzt alle?? Ja? Nee? Ach kommt, das fragt ihr euch ALLE!”
  • (Von uns zusammengebastelte Begriffe aus der Vorlesung) “Das Sex-Attribut von Pussy ist nackig!” (Bedeutet: Die Eigenschaft “Geschlecht” der Katzen-Entität ist mit NULL belegt!)
  • (SQL vs Turing-Vollständigkeit) “Mit nem Leatherman kann man schon so allerhand machen. Aber ‘n dicker Hammer macht schon mehr Spaß!”
  • “…da spart man ne Menge Disketten… äh, Speicherplatz.”
  • “Wofür das B in B-tree steht, weiß keiner mehr so genau…”
  • “Das ist von Vendor zu Vendor verschieden!”
  • (DELETE FROM heroes…) “Schade für Superman, aber toller Trigger!”
  • “Ich geh mal davon aus, dass Sie alle Studenten sind. Naja, draußen is’ kalt …”
  • [Reads a quote] “Now we know that [the author] can write very long sentences, but what does it mean?”
  • “With semantic search, we could formulate queries like ‘beautiful pictures of Angela Merkel’. Well, beauty is in the eye of the beholder. She’s married, right?”
  • (Folie: “A frog is not a sunset”)


  • (Erfindung von SQL) “Der kam aus der Wirtschaft, dementsprechend konnte er nicht viel mit Logik anfangen…”
  • “Diese Relation, die ich jetzt aus Versehen durchgestrichen habe …”
  • “Convey what you want to convey in a simple way.”


  • “Guten Morgen, meine…” (sieht sich um) “…Herren!”
  • (Ackermannfunktion. Schreibt: a(4,4) = 2^2^2^2^16) “Das ist eine irre große Zahl. Aber ich hab übertrieben…” (Ergänzt an der Tafel: -3)
  • “Wenn’s zu dunkel ist, sagen Sie Bescheid.” - Student: “Bescheid!” - “Bitte??”


  • (AuD, Binärbäume. Student:) “Was is’n NIL?” - (Anderer:) “Ein Fluss!”
  • Bode: “Wie würden Sie das Verfahren zum Bestimmen der Nullstelle nennen?” - Student: “Raten!”
  • Koslowski: “Wir dürfen den Balkon ja nicht betreten… Wie ernst wollen wir das nehmen?” - Student: “Axiomatisch!”
  • (Einführung in Computergrafik. Magnor zeigt ein Bild voller bunter Pixel.) “Was stellt dieses Bild dar?” Student 1: “Drei!” Magnor: “Das ist die Zahl Pi, jede Ziffer ist in eine Farbe kodiert.” Student 2: “War doch nah dran!”
  • (ARM-Architektur) Student betrachtet seinen Arm.
  • Student 1: “Wie wird denn die Klausur aussehen?” - Student 2: “Weißer Hintergrund, schwarze Schrift?”
  • Student: “Ich hab schonmal Grafikeffekte programmiert!” - Magnor: “Womit?” - Student: “Notepad?” - Magnor: “….. Okay.”
  • (Hausaufgabenabgabe endet mit Beginn der Vorlesung, aber niemand kommt zu spät) Student: “Ich bin enttäuscht, ich bin extra mit dem Auto gekommen, um die Leute leiden zu sehen…”
  • “Woher kommt denn dieses Pfeil-Zeichen in meinem Quelltext?” - “Das ist dein Mauszeiger.”


  • “Durch die Spannungsquelle dürfen Sie nicht gehen! Das ist verboten!”
  • “Ich nehme jetzt eine Vereinfachung vor: Statt 500 Ohm nehmen wir hier 800 Ohm.”
  • (p-n-Übergang) “P steht, wie wir alle wissen, für… ‘Löcher’!”
  • (Schreibt: 0.8_10 = 0.1101_2) “Das Gleich enthält halt ne kleine Ungenauigkeit…”
  • (Student:) “Machen wir jetzt Aufgabe b oder a?” – “Wir machen noch gar nichts, wir gucken uns das Ganze erstmal einleitend an.”
  • “Sehen wir nachher jetzt sehen wir jetzt nachher gleich!”

Wissenschaftliche Mitarbeiter

  • “Na, wie geht’s?” - “Man könnte mir mit nem Baseballschläger den Kopf einschlagen und ich würds nicht merken.” - “Challenge accepted!”


  • “Sie empfinden eine Gänsehaut zum Beispiel, wenn Sie einen Horrorfilm gucken. Oder Volksmusiksendungen.”


  • (Konstruiert einen Winkel an der Tafel) “Grafischer Beweis: Der Winkel ist größer als 90°!”


  • “Die Lösung erhalten wir durch elementares Googlen.”


  • “…sei es Java, sei es irgendeine Programmiersprache, …”
  • “Diese Standardwerke sollten Sie sich zumindest mal aus der Ferne ansehen.”
  • “Verzeigern”, “Weggeschedulet”
  • “Schlossalgorithmen sind wie Umkleiden: Man kann reingehen, hinter sich zuschließen, und dann tun, was man möchte.”
  • (Licht geht plötzlich aus) “Energiesparen, ja?”
  • (Verliert den Faden. Lässt den Oberkörper hängen:) “Meeep!” (Setzt wieder neu an.)
  • “Sozusagen”
  • “Dann frohe Weihnachten, oder so.”


  • “In manchen Firmen kriegen Sie am Anfang so’n dickes Buch mit Coding-Standards, an die Sie sich zu halten haben. Und manchmal wird das auch getan.”


  • “Wenn Sie mal ein Smartphone aufschlagen …”
  • (Reißt was Interessantes an) “… aber darauf werde ich nicht eingehen.”
  • “Wenn man so ein iPad aufknackt …”
  • “Ganz ohne jedes Miracle!”
  • (Schaltsymbole) “Für die, die das noch nicht gesehen haben: Das ist ein UND, diese umgekippte, ausgelaufene Badewanne. Jetzt weiß ich, wo der Fleck herkommt…”


  • “Use the library, Luke!”
  • “Mathematisch macht das leider doch Sinn…”
  • “Wir benutzen dafür die leicht schweizerisch klingende Funktion glTexParameteri…”
  • “Wofür wir das jetzt brauchen, sei dahingestellt. Wichtig ist, dass wir es können!”
  • “Use GeForce, Luke!”


  • (Ersti-Vorlesung, es geht um fortgeschrittene Programmierkonzepte) “Sie kennen das ja aus Boost…”
  • (Gute Studenten werden mit Kaffee belohnt) “Bitte keine klugen Antworten mehr, wir haben nur drei Tassen.”


  • “Man konnte halt, wenn man das Richtige getan hat - oder das Falsche, je nachdem, wie man es sehen will - schlimme Dinge damit tun.”
  • “Dass ein C++-Programm Ihre Festplatte löscht, sollte nicht passieren, ist aber standardkonform.”


  • “Don’t listen to what I say, listen to what I mean”
  • “Das war ein Physiker-Argument, aber es stimmt trotzdem.”
  • (Begeistert) “Also ist das gleich…” (Geknickt) “Die Tafel ist zu Ende.”
  • “Mein Lieblingssatz: ‘Das passt noch irgendwo hin’”


  • “Prüfung ist leicht, wenn man’s kann.”
  • (Buchvorstellung) “Da haben sich zwei Leute mal drangesetzt… Drei Leute. Vier Leute? Einige Leute haben sich mal drangesetzt…”
  • “Die topologischen Transformationen habe ich Ihnen hier mal anhand der deutschen Grenze dargestellt - damit’s ein bisschen witziger wird.”
  • “Ich hatte ja nur endlich viel Zeit zum Programmieren des Algorithmus’. Und auch nur endlich viel Lust.”
  • “Wir haben dann folgendes getan… Also, wenn ich ‘wir’ sage, meine ich, dass ich Herrn X motiviert habe, es zu tun, und er hat dann die Arbeit gemacht.”
nom nom 2014-07-30T00:00:00+00:00 blinry

Helps you lose weight by tracking your energy intake and creating a negative feedback loop.

Vimboy vimboy 2012-07-22T00:00:00+00:00 blinry ]]> Managing paper with manila folders managing-paper-with-manila-folders 2015-04-25T12:05:00+02:00 blinry I’ve previously written about how I manage digital notes. This article is about my approach to organizing and storing physical paper documents.

Granted, this sound like an incredibly boring, bureaucratic topic, but this is a personal story of disentanglement and simplification. Wait and see :-)

Labeled tabs of manila folders

Approximately two years ago, I got really into minimalism. The principle of only owning things which are useful, beautiful or important resonates with me strongly. After all, one of my favorite quotes is the following by Antoine de Saint Exupéry:

It seems that perfection is attained not when there is nothing more to add, but when there is nothing left to remove.

My occupation with minimalism (last but not least via the lovely minimalism subreddit) led to simplifications in various parts of my daily life. At one point, I decided it was time to evaluate different approaches to storing paper documents. So, what’s there?

Ring binders

In Germany, it’s very common to store documents in ring binders (“Aktenordner”). You punch some holes in your documents (or put them in punched pockets), tug them away in the binders, and fixate all pages with a clip.

For many years, I did exactly that. I adopted this system from my parents, and put my documents into four different binders, categorized by labeled separator sheets with tabs.

A shelf of ring binders

I always hated this system. Here’s the workflow to file a new document:

  1. Find the correct binder, heave it out of the shelf, put it on a free surface.
  2. Open the binder, remove the clip which holds the pages at the bottom of the binder, open the correct section.
  3. Flip a lever to open the rings.
  4. Punch holes into your document (or fumble it into a pocket) and put it on those rings.
  5. Do steps 3.-1. in reverse.

This process sucks: It takes a lot of time, is boring and repetitive, and often led to me not filing documents at all (which then accumulated in the most durable structure in the known universe: stacks). So, let’s look for better alternatives.

Suspension files

Yeah, suspension files are the way to go, right? Turn your ring binders by 90 degrees, split the documents into separate vertical folders, and hook them onto a pair of rails! You can them access the individual folders directly from the top and insert new ones as needed.

Suspension file

This system was often suggested to me in various self-management books I read in my childhood, I even tried such a system for a few weeks. I didn’t like them for two reasons: Their whole construction seems unnecessarily complex; and their plastic tabs take away a lot of space, even when there’s just one document inside. Your mileage may vary, but they are not for me.

Manila folders

In The Power of Less (a book whose content, in my opinion, is so trivial that I gave it away immediately after reading it - quite ironic ;-), Leo Babauta recommended “manila folders” for filing documents. They also seem to appear a lot in the context of the Getting Things Done method. I had never heard that term before, but for everyone who has used a graphical computer file managers, manila folders look very familiar:

Manila folders

They are open at the sides and at the top, and are designed to hold a collection of loose papers. You can label the tabs, and then put many of them in a box (the German term is “Einstellmappen”).

I present to you: The manila folder workflow for filing a new document:

  1. Find the correct folder and hold it open.
  2. Drop your document into it. (I usually insert new documents at the front, so they are mainly chronologic, but I don’t care that much.)

That’s it! Not much room for improvement, and it could hardly get any simpler - mission accomplished!

My concrete implementation

In Germany, there are two commercial distributors for similar folders: MAPPEI and Classei. Their systems cost a fortune, but might suit you. I knew I wanted cheaper, simpler folders with fixed tabs like those depicted above.

After searching for manila folders in virtually all office stores in my home city to no avail, I finally turned to Amazon Germany, and found the Leitz 2434-00-11 folders, which seemed pretty, durable, and currently cost about 31 ct per piece. They have five slots for fixed tabs, and come in batches of 100 pieces, 20 of each tab position.

Ready for some technical details? The folders are 304 mm wide and 200 mm high (210 mm with tabs). The paper weighs 205 g/m² (the description on the Amazon page is contradictory there), which seems like a good compromise between robustness and thickness. One folder is about 0.8 mm thick.

As I couldn’t find a matching box to put the folders into right away (this one turned out to be too small :-S), I temporarily settled on a shipping box, cut to a width of 31 cm, a height of 16 cm and a depth of 17 cm. This works perfectly for me. I’m ashamed to admit that this temporary box is still in place after more than a year ;-)

Box with manila folders

I sort the folders alphabetically, following the schema below. The alphabet starts at the back, so that the beginning of a label is never covered by a neighboring tab. A disadvantage of this ordering is that the frontmost folder covers all other tabs starting with the same letter. But it has the (bigger) advantage that you get a good overview of the full alphabet, in contrast to a “chaotic tab position”, where, with some luck, you can see each label, but lose a sense of linear alphabetical ordering.

A-Z labels

Long-term experiences

One year later, I’m still very happy with this system. I don’t own ring binders anymore, and never looked back. Over the months, I’ve added some folders, and removed others. It’s quick, easy, and simple and works exceptionally well for me.

I currently use 32 folders. The system contains all important documents; after throwing away many documents I knew I’d never need again, the folders in use are now about 10 cm thick in total. The thickest folder contains about 3 cm of documents, which the system can integrate okayishly, I assume that it gets hard to handle with thicker folders.

These are the things I store in the folders: certificates, stamps (which is handy!), small gifts, bills, coupons, uni stuff, contracts, menus of delivery services, stickers, recipes, health-related documents, tax/insurance stuff, maps, address lists, photos, …

Two things to look out for are rain and sunlight. The open system is vulnerable to both, so I’d suggest putting it some distance away from windows. (Maybe you can see the small smudges on the labels ;-)

When I have to take documents with me, I use folders like this.

Git Cheat Sheet git-cheat-sheet 2012-04-17T00:00:00+00:00 blinry Git Cheat Sheet

I originally made this to introduce some fellow students to Git for a group project, and updated it in 2014 for a Git introduction I gave to freshman students.

Want the SVG to modify it for your own purposes? I’ve got you covered! The fonts are Bevan and Courier New.

Novena logo novena-logo 2014-05-12T00:00:00+00:00 blinry Novena logo on three different backgrounds

A logo design for the open-hardware computer Novena. It was one of 124 logo submissions. The “claw” is a reference to the Open Source Hardware logo.

Here are some older designs:

Freifunk, executive summary freifunk-executive-summary 2014-01-29T12:22:00+01:00 blinry Ich habe mir vor zwei Wochen Freifunk genauer angeguckt, und möchte euch hier mal zusammenfassen, was ich gelernt habe. Die Grundidee ist, in einer Stadt viele WLAN-Router aufzustellen, die sich untereinander vermeshen und so ein dezentrales (unzensier- und -drosselbares) Kommunikationsmedium bilden.

Lokale Communities

Für mich, der neu dazukommt, ist die Organisation der Community zunächst befremdlich: Jede Stadt pflegt ein eigenes Wiki, Mailinglisten und Standortkarten, was zu großer Informationsfragmentierung führt. Oft bauen die Städte sogar ihre eigene Firmware. Ist wohl gelebte Dezentralisierung, wirkt auf mich aber ineffizient. Die Community-Karte listet derzeit 57 Communities in Deutschland und Österreich auf.


Üblicherweise machen die Freifunk-Router zwei WLAN-Netze auf: Eines im Access Point-Modus, damit sich Endgeräte drauf verbinden können, eines im Ad-Hoc-Modus, zur Vernetzung mit anderen Routern.

Früher benutzte Freifunk das OLSR-Routingprotokoll, welches permanent die gesamte Netzwerktopologie auf alle Knoten verteilt. Das skalierte wohl nicht so gut, weshalb einige Freifunker eine einfachere Alternative entwickelten: B.A.T.M.A.N (“Better Approach To Mobile Adhoc Networking”). Ein Knoten ruft regelmäßig ins Netz, dass er da ist und merkt sich für jeden anderen Knoten, aus welcher Richtung er die meisten dieser Broadcast-Nachrichten empfangen hat. In diese Richtung werden dann Pakete geschickt, die für diesen Knoten bestimmt sind. Fertig.

Es gibt übrigens einen regelmäßigen Wettbewerb, in dem Mesh-Routing-Protokolle gegeneinander antreten, Battle Mesh ;-)


In allen Stadt-Communities sind zur Zeit die Router der chinesischen Firma TP-LINK beliebt, und zwar in der Schnittmenge folgende Geräte:

  • TL-WR741ND: 4 MB Flash, 32 MB RAM, eine Antenne, ca. 23 Euro. Der Flash scheint recht knapp zu sein, reicht aber für normale Knoten aus. Das “D” im Namen bedeutet jeweils, dass man die Antennen austauschen kann, gibt die meisten auch mit fest verbauten Antennen.
  • TL-WR841ND: Hardware wie oben, aber zwei Antennen (doppelte Datenrate per MIMO, ca. 22 Euro. Es gibt von Hardwareversion 8 wohl eine “chinesische Version”, die crappy ist (halber Flash und RAM). Hier bekommt man aber meistens die unabgespeckte internationale Version.
  • TL-WR842ND: Zusätzlicher USB 2.0-Port, ca. 42 Euro.
  • TL-WR1043ND: Schnellere CPU, 8 MB Flash, 64 MB RAM, drei Antennen, USB 2.0, mit Gigabit-Ports, ca. 45 Euro. Laut Kiel “für größere Aufgaben geeignet”.
  • TL-WDR3500: 8 MB Flash, 128 MB RAM, drei Antennen, ca. 36 Euro. Unterstützt als einziger dieser Liste 5GHz-Frequenzen (wovon manche aber wegen geringerer Reichweite durch stärkere Streuung für diesen Zweck auch eher abraten). Momentane Empfehlung von Berlin.

Ich habe mir mal testweise einen TL-WR841ND gekauft und die Hamburger Firmware draufgespielt, dauert vielleicht 10 Minuten, dann ist der Router online.


Braunschweig befindet sich auf der Community-Karte in einem ziemlichen Freifunk-Loch. Große “Nachbarn” sind Halle, Bielefeld und Hamburg. Hannover reaktiviert sich angeblich gerade wieder, im Forum ist allerdings bisher wenig Aktivität.

Im Freifunk-Wiki gibt es eine Seite über Braunschweig, die von vereinzelten Anläufen berichtet (letzte Änderung: 2009), die Mailaddressen sind nicht mehr erreichbar. Auf der Hamburger Karte findet man zur Zeit vier Knoten, die mit der Hamburger Firmware ausgestattet sind (die ermöglicht von Haus aus Internetzugriff über ein VPN in die Niederlande, wo es keine Störerhaftung gibt.

Weitere Ressourcen

Wenn ihr noch Fragen habt, gerne her damit!

Bachelorarbeit, Woche 21: LaTeX-Tipps und Abgabe! bachelorarbeit-woche-21 2013-11-30T07:32:00+01:00 blinry Am Donnerstag habe ich die Bachelorstudiengangsabschlussbescheinigung abgegeben, yay! Die letzten Wochen war noch recht viel zu tun, weshalb ich das Gefühl hatte, mir keine Zeit für einen ausführlichen Blogpost nehmen zu können. Heute berichte ich von der Arbeit selbst, in einem kommenden Post dann noch vom Abschlussvortrag.

Hier kommt zunächst die Arbeit als PDF mit anklickbaren Querverweisen. Im Original sind die Seitenabstände anders, um zweiseitig schöner auszusehen. Der LaTeX-Sourcecode ist auf GitHub. Wer dieses Blog verfolgt hat, ist mit dem Inhalts bereit größtenteils vertraut. Neu sind Beschreibung und Auswertung der Evaluation.

Ich war überrascht und etwas enttäuscht, dass sich am Institut niemand die Zeit nahm, die Arbeit nochmal inhaltlich durchzugehen und zu kritisieren. Während ich mitbekommen habe, dass an anderen Instituten die Abschlussarbeiten oft zu einem guten Teil das Werk des Betreuers sind, war ich hier fast vollständig auf mich allein gestellt. Es war einerseits ganz schön, so autonom arbeiten zu können, andererseits bin ich sicher, dass die Arbeit bei einer intensiveren inhaltlichen Betreuung noch deutlich besser, formaler und tiefgehender hätte werden können.


Auch für lange Dokumente betreut Enrico LaTeX-Klassen im Corporate Design der TU. Während die einwandfrei aussehen, gefallen mir die Schriftarten nicht besonders, daher verwende ich ein blankes scrreprt.

Ich möchte euch folgende LaTeX-Pakete empfehlen, auf die ich beim Schreiben gestoßen bin:

  • microtype ist ein Schritt hin zur typografische Perfektion: Es optimiert Buchstabenabstände, macht die Seitenränder optisch gerade und minimiert Worttrennungen. Ein Blick in das (interaktive!) Handbuch sei höchst empfohlen!
  • cleveref erlaubt textuelle Verweise auf Referenzen per \cref{<name>}, wobei der Typ des verlinkten Dinges angefügt wird (der Verweis lautet dann zum Beispiel “figure 3.14”). Es gibt auch Befehle für “on page 42” etc.
  • menukeys habe ich zum Erstellen von hübschen Darstellungen von Tastenkombinationen benutzt (\keys{\ctrl + C}), es eignet sich auch zum Formatieren von Menüfolgen (\menu{Extras > Settings > General}).
  • listings ist recht gut bekannt für das Erstellen von Codelistings, ich möchte hier nur nochmal unterstreichen, dass das Paket sehr hübsch konfigurierbar ist: Man kann sehr einfach eigene Umgebungen für verschiedene Sprachen anlegen und eigenes Syntaxhighlighting definieren - für meine nutsh-Codeschnipsel oder für EBNF-Grammatiken war das sehr praktisch.
  • pgfplots benutze ich zum Zeichnen von Balken- und Boxplot-Diagrammen. Es basiert auf dem Zeichenpaket PGF/TikZ (was ebenfalls höchst extremst empfehlenswert ist!), ist ziemlich mächtig und gut konfigurierbar. Ich bin nicht restlos begeistert vom Interface, habe mich aber auch nicht lange damit beschäftigt und es tut was es soll.


Das Nitpicker tool beschreibt sich als “overly picky language style checker”. Es überprüft formale englische Texte automatisch auf häufige grammatikalische, semantische und Rechtschreibfehler (verdammte passive voice ;-). Ich habe das Tool in einem Lightning Talk auf einem der letzten Kongresse kennengelernt und finde es inzwischen unersetzlich, um die gröbsten Schnitzer aus Texten rauszubügeln, bevor man es Menschen zu Lesen gibt. Benutzt es!

Fun fact: Das Nitpicker tool wird durch Katzenbilder angetrieben: 1, 2.


Symbolbild: Research paper vs Internet

Beim eigentlichen Schreiben fiel es mir teilweise sehr schwer, konzentriert zu bleiben und nicht herumzuprokrastinieren. Irgendwann kramte ich einen Motivationstrick heraus, den ich auch schon beim Lernen für Klausuren erfolgreich angewendet habe: Die Pomodoro technique. Die funktioniert so:

  1. Man stellt einen Küchenwecker auf eine halbe Stunde.
  2. Solange der Wecker tickt, arbeitet man möglichst konzentriert, ohne sich ablenken zu lassen.
  3. Wenn der Wecker klingelt, malt man ein Kreuz irgendwohin und macht fünf Minuten Pause (Lüften, Nahrungs- und Flüssigkeitszufuhr, Äkta manniskor gucken).
  4. Nach jeweils vier Kreuzen macht man eine längere Pause von etwa einer halben Stunde. Dann GOTO 1.

Und das funktioniert ganz hervorragend für mich. Ich freue mich immer sehr auf die kommende Pause und schaffe es, mich während der halben Stunde nicht ablenken zu lassen. Mithilfe dieser Technik habe ich in den drei letzen Wochen vor der Abgabe etwa 6 bis 7 Stunden pro Tag konzentriert gearbeitet.

Pomodoro ist übrigens das italienische Wort für “Tomate” - der Typ, der sich das ausgedacht hat, hat einen Küchenwecker in Tomatenform benutzt.

The Nut Shell nutsh 2013-11-26T00:00:00+00:00 blinry

A framework for creating interactive command line tutorials, inspired by text adventures.

Bachelor Thesis: The Nut Shell the-nut-shell 2013-11-03T00:00:00+00:00 blinry In my bachelor thesis, I designed and implemented a framework for creating interactive command line tutorials, called The Nut Shell. Here you can find the final thesis and the presentation:

Thesis (Director's Cut) Final talk

I posted the LaTeX source code of the thesis online – you are welcome to steal stuff from it!

While writing the thesis, I also blogged about my experiences (in German).

The resulting software framework can easily be adapted and reused to various command line environments, you can read more about it here.

Bachelorarbeit, Woche 13: Gliederung bachelorarbeit-woche-13 2013-10-05T10:33:00+02:00 blinry Blick zurück

So, der Vorkurs lief gut, die Teilnehmer schienen mir recht glücklich mit der Nut Shell, ich habe viel positives Feedback bekommen. Ich habe eine kleine Umfrage durchgeführt, um Spaß und Lernfortschritt quantifizieren zu können, die Ergebnisse werde ich in den kommenden Wochen hier veröffentlichen.

Blick nach vorn

Nun habe ich noch einen Monat zum tatsächlichen Schreiben der Arbeit. Hierzu habe ich eine grobe Gliederung entworfen, unten dargestellt als Outline. Die eingeklammerten Zeilen sind keine eigenen Abschnitte, sondern Zusammenfassungen der vorgesehenen Inhalte.

Ich habe versucht, den Hauptteil “von unten nach oben” zu strukturieren, also tatsächlich in der Reihenfolge, in der die Komponenten aufeinander aufbauen:

    (Design + evaluation methods)
    (Major results)
    (Summary of conclusions)
    (Topic: Command line tutorials)
    (Motivation: Traditional, static tutorials have problems)
        (Attention shift)
        (No goal affirmation)
        (No reaction to mistakes)
    (Core idea: Interlace tutorial text and CLI)
    (Role model: Text adventures)
    (Research question: Is this approach "better"?)
    (Prior approaches)
        (Try Ruby/Git/Haskell)
        (What's missing in them)
    (Conventions in this thesis)
    (Goals and principles)
        (Basic event loop: prompt -> editing -> execution/output)
        (Adaptability to arbitrary "targets")
        (Annotation + environment changing, otherwise raw CLI interaction)
    (Steps of this thesis)
    (Diagram: Layers)
    Command line parser
            (Recognizing parts of command line output)
            (How a terminal works)
            (Escape characters)
            (Readline key combinations)
            (Component diagram)
            (Parser EBNF)
        Problems and workarounds
            (Command line editing)
    Internal DSL
        (Purpose: High-level layer around CLI parser)
        (Description of necessary DSL calls)
    The nutsh language
            (Describes a self-contained teaching unit, a "lesson")
        Design goals
            (Easy to read and write)
                (Use syntax the user already knows: Regex + Go syntax)
                (Introduce new syntax for often-used semantics)
            (Minimize redundance)
                (DRY, allow reuse of code snippets)
        Lexical elements
            (Token types)
            (Diagram: State machine)
            (EBNF of language constructs)
            (How YACC works)
            (Specification of language constructs)
            (Function stack)
        Automated testing
            (Testing algorithm)
    Used technologies
        (kr/pty for terminal emulation)
    High-level design
        (Diagram: Package diagram)
    Command line tool
        Builtin functions
Application and evaluation
            (Description of setting: Preparatory course for CS students)
            (Previous teaching method)
            (Content, examples)
            (Best practises in lesson writing)
        (Pretty graphs)
        (Statistical evaluation)
    (Discussion of survey results)
Limitations and future directions
    (Future directions:)
        (Automated typo detection)
        (Simplified prompt syntax)
        (Lesson dependency tree)
    (Outlook, future of the Nut Shell)
Appendix A: Example lesson
    (nutsh source code)
    (Execution output)
Appendix B: Table of terminal escape codes
    ("Erklärung an Eides statt")

Mit dem langen Kapitel zur Sprache (Spezifikation inklusive Erläuterungen zum Parsen, Interpretieren, etc.) bin ich noch nicht so zufrieden, vielleicht ist es lohnend, einige Abschnitte in den “Implementation”-Teil zu verschieben. Das bricht aber die schöne bottom-up-Struktur. Hm.

Bachelorarbeit, Woche 11: Vorkurs beginnt! bachelorarbeit-woche-11 2013-09-16T11:37:00+02:00 blinry Nur ganz kurz: Heute beginnt der Vorkurs! Ich bin so gespannt, ob alles klappt! Die letzen Wochen habe ich wirklich viel geschuftet, damit heute alles schön ist.

Wer mitmachen möchte, kann sich die kurze Installationsanleitung geben. Ihr braucht einen Go-Compiler und Git. Und Linux, natürlich. Getestet ist das aber eigentlich nur im Raum, in dem der Vorkurs stattfindet und auf meinem Notebook, keine Garantien ;-)

Warnung: Das Setup ist für absolute Neulinge, deshalb hängt es eine Zeile an eure .bashrc, die das nutsh-Skript in den PATH tut. Dieses Skript sorgt für automatische Aktualisierungen (es kommen jeden Tag neue Lektionen dazu).

Viel Spaß!

Bachelorarbeit, Woche 9: DSL-Syntax bachelorarbeit-woche-9 2013-09-04T10:31:00+02:00 blinry Der letze Eintrag ist nun schon eine ganze Weile her, höchste Zeit für ein Statusupdate!


Die Sprache, in der man Tutorials verfassen kann, nenne ich nutsh, in Analogie zur Nut Shell. Sie ist viele Iterationen durchlaufen, bis ich etwas fand, was mir mächtig genug erscheint, möglichst einfach zu lesen und zu schreiben und simpel umzusetzen ist. Die Irrwege schildere ich vielleicht ein anderes Mal ;-)


Die Sprache basiert stark auf Strings ("blabla"). Stringausdrücke kann man verknüpfen ("bla"+"bla"), sowie auf Gleichheit überprüfen ("bla" == "bla"). Außerdem kann man überprüfen ob ein String einem Regulären Ausdruck entspricht ("bla" =~ "b.."). Jeder String kann als Wahrheitswert interpretiert werden, der bei einem leeren String falsch ist, ansonsten wahr. Die Vergleichsoperatoren geben bei Erfolg den (beliebig gewählten) String "true" zurück. Die üblichen logischen Operationen (! für nicht, && für und sowie || für oder) sind entsprechend definiert.

Es gibt noch die Kontrollfluss-Strukturen if-else sowie prompt, und man kann Funktionen definieren und aufrufen, und das reicht dann auch schon. Variablen sind nicht notwendig, weil man die auch in der Zielsprache definieren kann.

Naja, und typische C-Kommentare gibt es auch (// für Zeilenkommentare, /* ... */ für Blockkommentare).


Ganz zentral ist die Ausgabe von erklärendem Text. Dieser wird eingerückt und farbig hervorgehoben.

say("Dies ist erklärender Text")

Weil der Befehl so oft verwendet wird, kann man auch einfach schreiben:

"Dies ist die Kurzform"

Um einen Befehl im Kommandozeilen-Prozess auszuführen, benutzt man run. Rückgabewert ist die Ausgabe des Befehls.

run("echo testinhalt > /tmp/testdatei")

Ich überlege noch, ob auch hier eine Abkürzungsmöglichkeit sinnvoll wäre, etwa

!"echo testinhalt > /tmp/testdatei"


Ganz wichtig ist die Prompt-Schleife:

prompt {
    // Befehle

Sie Semantik ist die einer Endlosschleife, zu deren Beginn jeweils ein Befehl vom Benutzer eingelesen wird. Sie kann durch ein break verlassen werden.

Es gibt zwei eingebaute Funktionen command und output, die jeweils das zuletzt eingegebene Kommando und dessen Ausgabe zurückgeben.

Weiterhin gibt es if-else Ausdrücke, deren Syntax stark von Go beeinflusst ist (keine Klammern um die Bedingung):

if command =~ "^rm " {
} else {


Mehrfach verwendete Codeschnipsel kann man in Funktionen auslagern:

def exit_status {
    return(run("echo $?"))

def say_twice(text) {

prompt {
    say_twice("Der Rückgabewert war '"+exit_status+"'")

Funktionen ohne Argumente können auch ganz ohne Klammern aufgerufen werden.

Umgebende Zustände

Möchte man für eine Gruppe von Prompt-Schleifen die gleichen Bedinungen überprüfen, kann man diese Syntax benutzen:

def help {
    if command =~ "help" {
        "Don't panic!"

help {
    prompt {
        if command =~ "panic" {

    "Zweite Chance..."
    prompt {
        if command =~ "panic" {

Das bedeutet: “Zu Beginn jedes Prompt-Durchlaufs, führe die Funktion help einmal aus. Das geht auch mit mehreren Funktionen:

def stay_in(dir) {
    if ! run("pwd") =~ "^"+dir {
        say("Bitte komm wieder zurück nach `"+dir+"`!")
        prompt {
            if run("pwd") =~ "^"+dir {
        "Okay, weiter im Text."

def help {
    if command =~ "help" {
        "Don't panic!"

run("cd /tmp")

stay_in("/tmp"), help {
    "Wie spät ist es?"
    prompt {
        if command == "date" {

    "Und wer bist du?"
    prompt {
        if command == "whoami" {

Die Syntax einer solchen “Zustands-Schachtelung” hat mich am längsten aufgehalten, mit dem Ergebnis bin ich aber sehr zufrieden.

Was noch fehlt

Ein Tutorial braucht Metainformationen (Zielsprache, Name, nutsh-Version), man braucht eingebaute Funktionen zum Springen zwischen Lektionen und vielleicht auch ein goto, das wird sich zeigen.

Was ich außerdem möchte, ist ein eingebauter Befehl expect, mit dem man automatisiert überprüfen kann, ob man durch Eingabe dieses Befehls in den entsprechenden Zustand gelangt.


Das Lexen, also das Zerlegen des Sourcecodes in seine Bestandteile (Strings, Keywords, Identifier, Operatoren, Klammern) ist hier so einfach, dass ich das in einer kurzen Funktion selbst mache.

Zum Parsen, also zum Erkennen der Struktur, benutze ich die yacc-Version, die zusammen mit Go ausgeliefert wird, und mache damit ganz gute Erfahrungen.

Den resultierenden Parse-Baum kann man dann sehr einfach interpretieren, auch dazu später vielleicht einmal mehr.

Wie geht es weiter?

Ich habe noch anderthalb Wochen bis zum Beginn des Vorkurses, in denen ich Inhalte erstellen und die aufgeführten noch fehlenden Sprachelemente umsetzen werde. Ich werde eine Onlineevaluation vorbereiten, um die Eindrücke der Vorkurs-Teilnehmer etwas quantifizieren zu können. Insbesondere wird es eine zweite “Kontrollgruppe” geben, die noch mit den alten Aufgabenblättern arbeitet, um eine Vergleichsmöglichkeit zu haben.

Ich bin gespannt!

Zum Abschluss noch die kurze Lektion aus dem letzen Blogpost in nutsh:

def common_mistakes {
    if command == "1s" {
        "Das ist ein kleines L, keine Eins! Probier's nochmal!"
    if command == ".." {
        "`..` ist der Name des Verzeichnisses, du musst noch dazusagen,
        was du damit machen möchtest. Um \"hinzugehen\", schreib `cd`
    if command == "cd.." {
        "Da fehlt noch ein Leerzeichen zwischen `cd` und `..`!"

def stayinroot {
    if !(run("pwd") =~ run("echo $ROOT")) {
        run("cd $ROOT")
        "Bleib bitte erstmal hier."


run("rm -rf $ROOT")
run("mkdir $ROOT")
run("cd $ROOT")

run("mkdir schuhkarton")
run("mkdir schrank")
run("touch schrank/jacke")
run("touch schrank/hut")
run("touch linker_schuh")

"Hallo! Willkommen in der Nut-Shell! Ich möchte dir zeigen, wie du
mithilfe der Kommandozeile schnell und einfach mit Dateien und
Verzeichnissen umgehen kannst."

"Legen wir gleich los: Tipp mal `ls` ein und drück Enter."

common_mistakes, stayinroot {
    prompt {
        if command == "ls" {
            "Genau. `ls` steht kurz für \"list\" und zeigt dir die
            Dateien und Verzeichnisse an, die sich in deinem
            \"aktuellen\" Verzeichnis befinden. Die Verzeichnisse
            werden dabei blau dargestellt."

            "Du bist gerade in einem Ordner namens `/tmp/nutsh` - das
            steht auch in dem blauen Text, den wir \"Prompt\" nennen.
            Der Prompt endet mit einem Dollarzeichen, das heißt soviel
            wie: \"Du kannst jetzt ein Kommando eingeben!\""


    "Du hast vielleicht gesehen, dass sich hier ein Verzeichnis namens
    `schrank` befindet. Um dieses zu deinem aktuellen Verzeichnis zu
    machen, tippst du `cd`, dann ein Leerzeichen und dann den Namen des
    Verzeichnisses, in das du möchtest. Begib dich doch mal in den
    Schrank und sieh dich darin um!"

    prompt {
        if run("pwd") == run("echo $ROOT/schrank") {
            if command == "ls" {
                "Genau. Hast du bemerkt, wie sich der Prompt geändert


    "Und wenn du wieder aus dem Schrank herausmöchtest? Die Abkürzung
    für das Verzeichnis oberhalb des aktuellen ist `..`!"

    prompt {
        if run("pwd") == run("echo $ROOT") {

    "Gut. So, nun brauchen wir ein wenig Magie... *pling*"

    "[Der Schrank rumpelt und ächzt]"

    run("mkdir -p $ROOT/schrank/magische_tür/tür{1..3}")
    run("touch $ROOT/schrank/magische_tür/tür2/rechter_schuh")

    "Im Schrank hat sich nun etwas verändert. Geh hinein und such den
    rechten Schuh."

    prompt {
        if run("pwd") == run("echo $ROOT/schrank/magische_tür/tür2") {
            if command =~ "ls" {
                "Du hast ihn gefunden! Nun komm wieder aus dem Schrank


    prompt {
        if run("pwd") == run("echo $ROOT") {

    "Gut! So, das war eine Einführung in `ls` und `cd`. Hier ist das
    Tutorial erstmal zu Ende! Danke!"
Bachelorarbeit, Woche 3: Erstes Skripting bachelorarbeit-woche-3 2013-07-30T22:52:00+02:00 blinry Literatur


Ich war letzte Woche in der Unibibliothek. Wissen ist Macht!

Coole Entdeckung waren insbesondere die Tagungsbände der International Conference on Interactive Digital Storytelling, von der ich noch nie etwas gehört hatte. Außerdem das klassische “Drachenbuch” über Compilerbau sowie Grundlagen über Mensch-Computer-Interaktion und Computer-Didaktik. Wird mich bestimmt alles auf die ein oder andere gute Idee bringen.

Erste Skripting-Versuche

Ich habe um die cli-API von letzter Woche eine dünne Schicht von Methoden gelegt, die es mir ermöglichen, einfache Tutorials zu verfassen. Dabei entstand eine primitive interne domänen-spezifische Sprache, das heißt, sie ist Untermenge einer “normalen” Mehrzwecksprache. In meinem Fall heißt das, ich kann ein Programm in der Programmiersprache Go schreiben, wobei ich nur ganz bestimmte Methoden und bestimmte Sprachelemente benutze, und mich dabei meiner Vision der nutsh-Sprache, in der die Tutorials verfasst werden sollen, langsam annähere.

Hier ist ein Beispiel:

func main() {


    bash.Execute("mkdir schuhkarton")
    bash.Execute("mkdir schrank")
    bash.Execute("touch schrank/jacke")
    bash.Execute("touch schrank/hut")
    bash.Execute("touch linker_schuh")

    Say("Hallo! Willkommen in der Nut-Shell! Ich möchte dir zeigen,
    wie du mithilfe der Kommandozeile schnell und einfach mit
    Dateien und Verzeichnissen umgehen kannst.")

    Say("Legen wir gleich los: Tipp mal `ls` ein und drück Enter.")
    for Prompt() {
        if Command("^1s\n$") {
            Say("Das ist ein kleines L, keine Eins! Probier's
        if Command("^ls\n$") {
            Say("Genau. `ls` steht kurz für \"list\" und zeigt dir
            die Dateien und Verzeichnisse an, die sich in deinem
            \"aktuellen\" Verzeichnis befinden. Die Verzeichnisse
            werden dabei blau dargestellt.")

            Say("Du bist gerade in einem Verzeichnis namens
            `/tmp/nutsh` - das steht auch in dem blauen Text, den
            wir \"Prompt\" nennen.  Der Prompt endet mit einem
            Dollarzeichen, das heißt soviel wie: \"Du kannst jetzt
            ein Kommando eingeben!\"")


    Say("Du hast vielleicht gesehen, dass sich hier ein Verzeichnis
    namens `schrank` befindet. Um dieses zu deinem aktuellen
    Verzeichnis zu machen, tippst du `cd`, dann ein Leerzeichen und
    dann den Namen des Verzeichnisses, in das du möchtest. Begib
    dich doch mal \"in den Schrank\" und sieh dich darin um!")

    for Prompt() {
        if bash.Test("$(pwd) = \"$ROOT/schrank\"") {
            if Command("^ls\n$") {
                Say("Genau. Hast du bemerkt, wie sich der Prompt
                geändert hat?")


    Say("Und wenn du wieder aus dem Schrank herausmöchtest? Die
    Abkürzung für das Verzeichnis oberhalb des aktuellen ist

    for Prompt() {
        if Command("^\\.\\.\n$") {
            Say("`..` ist der Name des Verzeichnisses, du musst noch
            dazusagen, was du damit machen möchtest. Um
            \"hinzugehen\", schreib `cd` davor.")
        if Command("^cd\\.\\.\n$") {
            Say("Da fehlt noch ein Leerzeichen zwischen `cd` und
        if bash.Test("$(pwd) = \"$ROOT\"") {

    Say("Gut. So, nun brauchen wir ein wenig Magie... *pling*")
    Say("[Der Schrank rumpelt und ächzt]")
    bash.Execute("mkdir -p $ROOT/schrank/magische_tür/tür{1..3}")
    bash.Execute("touch $ROOT/schrank/magische_tür/tür2/rechter_schuh")

    Say("Im Schrank hat sich nun etwas verändert. Geh hinein und
    such den rechten Schuh.")

    for Prompt() {
        if bash.Test("$(pwd) = \"$ROOT/schrank/magische_tür/tür2\"") {
            if Command("^ls\n$") {
                Say("Du hast ihn gefunden! Nun komm wieder zurück!")

    for Prompt() {
        if bash.Test("$(pwd) = \"$ROOT\"") {

    Say("Gut! So, das war eine Einführung in `ls` und `cd`. Hier ist
    das Tutorial erstmal zu Ende! Danke!")

func gotoJail() {
    bash.Execute("rm -rf $ROOT")
    bash.Execute("mkdir $ROOT")
    bash.Execute("cd $ROOT")

Prompt() zeigt den Prompt an und liest Kommando und Ausgabe in spezielle globale Variablen. Output() gibt die Ausgabe aus, falls noch nicht geschehen. Say() gibt Text aus, Command() prüft, ob ein bestimmter String im letzten Befehl enthalten ist.

Es gibt noch zwei Bash-spezifische Funktionen: bash.Execute() führt eine Zeile Code aus und stellt sicher, dass er erfolgreich ausgeführt wird (der Rückgabewert ist dann Null). bash.Test() überprüft eine Bedingung mithilfe des test-Befehls.

Ähnliche Experimente habe ich mit Ruby als unterliegende Sprache gemacht und werde damit auch noch ein wenig weiter herumspielen, um herauszufinden, wie man das dahinterliegende semantische Modell später am besten organisiert. Was zum Beispiel noch gar nicht geht, sind “globale” Trigger, die sich über mehrere Zustände erstrecken (und hier zum Beispiel verhindern könnten, dass der Benutzer die Lektion über den nutsh-Ordner verlässt.

Zur Illustration folgt jetzt noch eine Nutsh-Sitzung, die aus oben stehendem Code resultiert. Die Farben gingen hierbei leider verloren, und mir fällt keine einfache Möglichkeit ein, sie hier in den Blog zu übertragen…

    Hallo! Willkommen in der Nut-Shell! Ich möchte dir zeigen, wie
    du mithilfe der Kommandozeile schnell und einfach mit Dateien
    und Verzeichnissen umgehen kannst.

    Legen wir gleich los: Tipp mal ls ein und drück Enter.

/tmp/nutsh $ ls
linker_schuh  schrank  schuhkarton

    Genau. ls steht kurz für "list" und zeigt dir die Dateien und
    Verzeichnisse an, die sich in deinem "aktuellen" Verzeichnis
    befinden. Die Verzeichnisse werden dabei blau dargestellt.

    Du bist gerade in einem Ordner namens /tmp/nutsh - das steht
    auch in dem blauen Text, den wir "Prompt" nennen. Der Prompt
    endet mit einem Dollarzeichen, das heißt soviel wie: "Du kannst
    jetzt ein Kommando eingeben!"

    Du hast vielleicht gesehen, dass sich hier ein Verzeichnis
    namens schrank befindet. Um dieses zu deinem aktuellen
    Verzeichnis zu machen, tippst du cd, dann ein Leerzeichen und
    dann den Namen des Verzeichnisses, in das du möchtest. Begib
    dich doch mal "in den Schrank" und sieh dich darin um!

/tmp/nutsh $ cd schrank
/tmp/nutsh/schrank $ ls
hut  jacke

    Genau. Hast du bemerkt, wie sich der Prompt geändert hat?

    Und wenn du wieder aus dem Schrank herausmöchtest? Die Abkürzung
    für das Verzeichnis oberhalb des aktuellen ist ".."!

/tmp/nutsh/schrank $ ..
bash: ..: command not found

    .. ist der Name des Verzeichnisses, du musst noch dazusagen, was
    du damit machen möchtest. Um "hinzugehen", schreib cd davor.

/tmp/nutsh/schrank $ cd ..

    Gut. So, nun brauchen wir ein wenig Magie... *pling*

    [Der Schrank rumpelt und ächzt]

    Im Schrank hat sich nun etwas verändert. Geh hinein und such den
    rechten Schuh.

/tmp/nutsh $ cd schrank
/tmp/nutsh/schrank $ ls
hut  jacke  magische_tür
/tmp/nutsh/schrank $ cd magische_tür
/tmp/nutsh/schrank/magische_tür $ ls
tür1  tür2  tür3
/tmp/nutsh/schrank/magische_tür $ cd tür1
/tmp/nutsh/schrank/magische_tür/tür1 $ ls
/tmp/nutsh/schrank/magische_tür/tür1 $ cd ..
/tmp/nutsh/schrank/magische_tür $ cd tür2
/tmp/nutsh/schrank/magische_tür/tür2 $ ls

    Du hast ihn gefunden! Nun komm wieder zurück!

/tmp/nutsh/schrank/magische_tür/tür2 $ cd ..
/tmp/nutsh/schrank/magische_tür $ cd ..
/tmp/nutsh/schrank $ cd ..

    Gut! So, das war eine Einführung in ls und cd. Hier ist das
    Tutorial erstmal zu Ende! Danke!

Bis nächste Woche! ;-)

Bachelorarbeit, Woche 2: Maschinenraum bachelorarbeit-woche-2 2013-07-22T11:33:00+02:00 blinry Heute mit Kommandozeilen-Tokenizern, Test Driven Development und Bytes auf Papier.

Ich habe mich während der letzen zwei Wochen weiter intensiv mit Strategien beschäftigt, bei normaler, möglichst unverfälschter Kommandozeileninteraktion die Bestandteile “Befehl” und “Ausgabe” herauszulesen und bin jetzt an einem Punkt angekommen, an dem das ganz ordentlich funktioniert.

Da diese Komponente die allerunterste, schmutzigste Schicht sein wird, war es mir wichtig, damit anzufangen, denn sie ist Voraussetzung für alles Folgende.

Ziel der Command-Line-Interface-Komponente ist Bereitstellung einer solchen Schnittstelle:

// Start a new command line process and initialize it
c := cli.Spawn("bash")

// Repeat the following forever
for {
    // Display the prompt and wait until the user enters a command
    cmd := c.ReadCommand()

    // Post-command, pre-execution logic

    // Wait for the command to terminate, return the output and
    // whether it was interactive
    output, wasInteractive := c.ReadOutput()

    if (! wasInteractive) {
        // Post-execution pre-output logic

        // If it wasn't, the user hasn't seen any output, print it
    } else {
        // Otherwise, the output was already printed to the user

    // Post-output logic

Interaktiver Modus

Bei der “Interaktivität” geht es um Programme, die im Vordergrund laufen, also auf Eingaben des Benutzers warten und darauf reagieren. Beispiele sind Texteditoren oder Pager, Programme, die einen langen Text anzeigen, in dem man dann hoch- und runterscrollen kann. Bei dieser Art von Programmen kann man nicht auf die Ausgabe warten, sondern muss sie dem Benutzer schon anzeigen bevor der nächste Prompt kommt.

Bisher löse ich das über Timer: Wenn ein Befehl länger als x Millisekunden läuft, schalte ich in den “interaktiven Modus”, der die Ausgabe direkt ausgibt. Man verliert dadurch die Möglichkeit, zwischen Terminierung des Befehls und Ausgabe des Befehls etwas zu tun, beispielsweise Bedinungen zu überprüfen oder Text auszugeben.

Aufbau des CLI-Moduls

Der Prototyp ist ja in Go geschrieben, was Nebenläufigkeit sehr einfach macht. In der folgenden Abbildung ist jedes Oval ein Thread (genauer: eine Go-Routine), die Kommunikation läuft über Channels, die man sich so ähnlich vorstellen kann wie UNIX-Pipes.

Aufbau des CLI-Moduls

startProcess ganz unten kommuniziert mit dem Kommandozeilen-Prozess. Über zwei Channels gehen Runen (Unicode-Zeichen) rein und raus. Die Ausgabe wird von tokenize gelesen, wo sie in Tokens zerlegt wird (Zeichenketten mit Typ, die Token-Typen sind “command”, “output” und “prompt”). Über den “runes”-Channel gehen die interaktiv geschriebenen Zeichen hoch. Die CLI macht damit dann High-Level-Kram. inputStdin pumpt vom Benutzer geschriebene Zeichen nach filterInput, auch von der CLI kommen Strings (z.B. Befehle, die Bedingungen überprüfen). filterInput macht schließlich die beschriebene Enter-Ersetzung und gibt das Resultat an den Prozess weiter. Es gibt eine zentrale “state”-Ressource (States sind “cmdinput”, “cmdecho”, “output” und “prompt”).

Erkennen des eingegebenen Befehls

Dazu habe ich letztes Mal schon etwas geschrieben: Ich fange ab, wenn der Benutzer Return drückt, und sende stattdessen “Ctrl-E Space Ctrl-U ☃ Backspace Ctrl-Y ☃ Backspace Backspace Return”. Das setzt den Cursor ans Ende der Zeile, fügt ein Leerzeichen ein (damit es, falls die Zeile vorher leer war, etwas zu löschen gibt), löscht die Zeile und kopiert sie in die Zwischenablage, schreibt ein spezielles Unicode-Zeichen als Marker, löscht den Marker wieder, fügt die Zwischenablage ein, sendet den zweiten Marker, und löscht diesen Marker und das Leerzeichen und sendet den Befehl. Auf diese Weise steht das eingegebene Kommando sauber zwischen den beiden Markern.

Das mit den Schneemännern ist natürlich nur eine vorläufige Lösung.

Erkennen des Prompts

Auch um den Prompt zu erkennen, benutze ich momentan Unicode-Marker am Beginn und am Ende des Prompts. Das führt zu Problemen, wenn der Benutzer den Prompt ändert oder ihn ausgeben will, ich weiß noch nicht, wie ich das lösen könnte. Aber diesen Ansatz behalte ich halt erst mal bei, bis mir etwas besseres einfällt.

Umgang mit mehrzeiligen Eingaben

Es gibt einige CLIs, die erkennen, dass ein Befehl beim Drücken von Enter “unvollständig” ist, und diesen dann noch nicht senden, sondern dem Benutzer die Möglichkeit geben, ihn fertig zu schreiben. Dabei wird ihm üblicherweise ein zweiter Prompt angezeigt, der sich vom normalen unterscheidet. Momentan schreibe ich andere Marker in diesen zweiten Prompt, machte nach dem oben beschriebenen Enter-Verfahren einen Lookahead, gucke mir also das nächste Ausgegebene Zeichen an. Ist es ein zweit-Prompt-Marker, wiederhole ich den Eingabeprozess und hänge am Schluss sämtliche so eingegebenen Zeilen zusammen.

Das funktioniert soweit gut, setzt aber natürlich Konfigurierbareit der Prompts voraus.

Versteckte Befehle

In den Tutorials werde ich später ausführlich Gebrauch von Befehlen “im Hintergrund” machen, die Bedinungen überprüfen, oder Trainingumgebungen einrichten. Dabei ergibt sich das Problem, dass diese in der Befehlsgeschichte auftauchen, wenn man sie an den Prozess sendet, mit dem der Benutzer auch arbeitet. Hier weiß ich noch nicht, wie ich die wieder daraus entferne/verberge. Befehle, die nicht auf den internen Zustand des CLI zugreifen, könnte man vielleicht in einer zweiten Instanz ausführen?

Test Driven Development

Ich mache stets gute Erfahrungen mit “Testgetriebener Entwicklung”. Dabei geht es darum, automatisierte Tests zu erstellen, die eine korrekte Funktionsweise des eigenen Codes sicherstellen. Der eigentliche Trick dabei ist, diese Tests vor dem Code zu schreiben, dadurch macht man sich selbst sehr gut klar, welche Anforderungen es gibt.

  1. Test schreiben. Der Test will Code benutzen, den es noch nicht gibt, er lässt sich deshalb nicht in ein Programm übersetzen.
  2. Gerade so viel Code schreiben, dass sich der Test übersetzen lässt. Der Test sollte nun fehlschlagen (dieser Schritt ist wichtig, um zu überprüfen, ob der Test korrekt geschrieben ist und tatsächlich fehlschlagen kann).
  3. Den einfachsten Code schreiben, der den Test erfolgreich sein lässt.
  4. GOTO 1.

Mich hat damals dieser Text zu TDD stark beeindruckt: An Extreme Programming Episode.


Diese Woche möchte ich hautpsächlich zwei Dinge tun: Zum einen Literaturrecherche nach Themen rund um Kommandozeilen, Sprachentwurf und Compilerbau, Didaktik. Zum anderen Schreiben einiger Beispiel-Tutorial, um genauere Anforderungsanalyse für die nutsh-Sprache machen zu können.

Und zum Schluss noch: Das passiert, wenn man zu sehr auf seinen Bytes herumkloppt und irgendwie einen “Drucken”-Befehl dabei erzeugt, der versucht, die Steuerzeichen einer Vim-Sitzung auszudrucken:

Bytes auf Papier!

Bachelorarbeit, Woche 0: Themenvorstellung und Prototyping bachelorarbeit-woche-0 2013-07-08T14:36:00+02:00 blinry Heute mit: PDF-Präsentations-Software, ehrlichem Feedback, Zeitplanung, Anfängen des Shell-Wrappers und dem Führen eines Logbuchs.


Letzten Montag habe ich den Themenvorstellungs-Vortrag vor meiner Erstprüferin und einigen Institutsmitarbeitern gehalten. Ich verlinke hier nochmal die endgültige Fassung der Präsentation mit mehr Zwischenschritten und leicht umsortierten Folien.

Zur Präsentation des PDFs habe ich pdfpc (“PDF presenter console”) benutzt, das einem die verbleibende Zeit, die nächste Folie, den Forschritt innerhalb der Präsentation sowie Notizen anzeigen kann, das eine Folienübersichts- und eine Schwarz-schalt-Funktion hat und das insbesondere mit den “Zwischenschritten” innerhalb von LaTeX-beamer-Präsentationen klarkommt. Sehr empfehlenswert!

Das Feedback war kritisch und ehrlich: Die Zuhörer stellten die Überlegenheit eines interaktiven Tutorials gegenüber einem herkömmlichen in Frage und äußerten insofern stärkeres Interesse an der Evaluation, als ich erwartet hatte. Ich glaube, mein “Adventure”-inspiriertes Beispiel war zu verwirrend und lenkte von der eigentlichen Idee ab. Wir diskutierten viel über die Generalisierbarkeit des Systems, die ich nach wie vor für machbar halte; über Edgecases (und “böse” Benutzer, die das System austricksen wollen) - ja, die wird es unvermeidlicherweise geben, man muss möglichst viele Fehlerfälle automatisiert abfangen; und darüber, dass eine Unterstützung bei Syntaxfehlern nur begrenzt möglich ist. Schöne Anregungen waren, in Shells den Rückgabewert von Programmen zu beachten, und ein Tutorial so dynamisch zu machen, dass bei “Vergessen” eines Befehls wieder zu dem jeweiligen Abschnitt zurückgesprungen werden kann.


Am Mittwoch, dem 3. Juli, habe ich dann die Arbeit dann im Sekretariat des Instituts angemeldet. Ab jetzt tickt die Uhr, ich habe 4 Monate Zeit bis zur Abgabe, die also - so wurde mir von Seiten des Prüfungsamtes inzwischen bestätigt - spätestens am 3. November erfolgen muss.

Gleichzeitig habe ich zugesagt, beim kommenden Vorkurs Informatik mitzuwirken, in dem ich die Nut Shell an Studienanfängern aus informatiknahen Fächern ausprobieren möchte. Der Vorkurs beginnt am 16. September, ich habe also 10 Wochen, um eine vernünftige Implementierung zu bauen, und dann noch 7 Wochen, um die Arbeit aufzuschreiben und die Evaluation auszuwerten. Sounds reasonable.

Bei der Anmeldung wird auch der Titel festgelegt, die Professorin fand meinen Arbeitstitel zu lang, während es meinem Betreuer gefiel, den Namen des Frameworks in den Titel mitzunehmen, insofern lautet dieser nun

The Nut Shell – A Framework for Creating Interactive Command Line Tutorials.

Damit bin ich auch sehr zufrieden :-)


Mein derzeitiges Ziel ist prototyp-hafte Umsetzung eines Programms, das sich um einen Kommandozeilen-Prozess wickelt, Ein- und Ausgabe mitschneidet und erkennt, welche Befehle eingegeben werden, was die Ausgabe dieser Befehle ist und wie der Prompt lautet (die Zeichensequenz die dem Benutzer signalisiert “ich bin bereit, du kannst mir jetzt einen neuen Befehl geben”). Das ist weniger einfach, als es klingt, weil in Ein- und Ausgabe diverse Steuerzeichen auftauchen (in der Eingabe Tasten und Tastenkombinationen zur Bearbeitung der momentatnen Kommandozeile, in der Ausgabe diverse sogenannte Escapesequenzen, die von dem Programm in dem die Kommandozeile läuft (dem Terminalemulator) als Aufforderungen verstanden werden, den Cursor zu bewegen, Teile der Zeile zu löschen oder die Textfarbe zu ändern (eine Übersicht der Escape-Codes, mit denen mein Terminal-Emulator urxvt zurechtkommt, findet der Linuxbenutzer unter man 7 urxvt). Die Abgrenzung der drei genannten Bestandteile ist alles andere als klar.

Das Teilproblem, das eingegebene Kommando zu erkennen, denke ich inzwischen zufriedenstellend gelöst zu haben: Alle mir bekannten Kommandozeilen-Interpreter unterstützen die beiden Tastenkombinationen Ctrl-U und Ctrl-Y, welche die momentan eingegebenen Zeichen löschen und in einer internen Zwischenablage speichern bzw. die Zwischenablage wieder einfügen. Diese Kombinationen sind deshalb so verbreitet, weil sie Bestandteil einer Programm-Bibliothek namens Readline sind, die praktisch überall benutzt wird, wo es darum geht, Text vom Benutzer einzulesen. Was ich also momentan mache, ist den Benutzer die Kommandozeile wie gewohnt eingeben zu lassen, dabei kann er tab-completion, Pfeiltasten, etc. benutzen. Sobald er jedoch Enter drückt, sende ich die Sequenz “Ctrl-U Anfangs-Marker Ctrl-Y End-Marker Enter” an den unterliegenden Prozess, was dazu führt, dass in der Ausgabe der tatsächlich eingegebene Befehl sauber zwischen zwei Markern steht. Nach guten Markern muss ich noch suchen (unbenutzte Escape-Sequenzen?), momentan schreibe ich einfach einen bestimmten String und lösche ihn direkt wieder…

Andere lustige Ansätze waren übrigens:

  • Intern ein eigenes Readline mitlaufen lassen – funktioniert aber mit vielen Shell-spezifischen Features nicht.
  • Die bash hat die Option set -x, um Befehle vor der Ausführung nochmals ganz anzuzeigen, soetwas ist mir aus anderen CLIs aber nicht bekannt.
  • Pfeil hoch und Pfeil runter senden, was bei command line interfaces mit Befehlshistory ebenfalls dafür sorgt, dass die Befehle erneut geschrieben werden.
  • Auf Enter warten, und dann (in der bash) “Pos1 CMD=" End "; echo "$CMD"; eval "$CMD"” senden. Aua.
  • History-Datei auslesen. Manche Shells haben aber keine, und die wird oft nur verzögert geschrieben.

Probleme bereiten noch mehrzeilige Befehle. Wie ich allgemein den Beginn des Prompts erkennen könnte, weiß ich überhaupt noch nicht. Auf einen konfigurierbaren regulären Ausdruck plus Pause warten?


Ich mache hervorragende Erfahrungen damit, beim Arbeiten stets die Seite “Bachelorarbeit” meines privaten Wikis offenzuhaben und Ideen, Probleme, wichtige Codeschnipsel, Quellen und Resultate mit Timestamps reinzuschreiben. Das hilft hervorragend gegen „Wo war ich stehengeblieben…?“, und macht mir selbst viele Dinge klarer. Ich hoffe, dass es das spätere Zusammenschreiben wesentlich vereinfacht, weil einfach vieles schon in schriftlicher Form vorliegt.

Dieses “Führen eines Logbuches” erleichtert auch das Schreiben dieser Blogposts ungemein, weil ich einfach nur den ganzen Kladderadatsch seit dem letzten Post durchgucken und zusammenfassen muss ;-)

Bachelorarbeit, Woche -1: Zukunftspläne bachelorarbeit-woche-minus-1 2013-06-24T18:21:00+02:00 blinry Nanu? Im letzten Blogpost schrieb ich doch noch, diese Woche würde die Arbeit angemeldet? Ja, aber wegen Terminüberschneidungen wurde das noch eine Woche nach hinten geschoben. Also, Woche -1. Was habe ich gemacht?

Präsentation zur Themenvorstellung

Am Institut, an dem ich die Arbeit schreibe, ist es üblich, dem Institutsleitenden die Themen von Abschlussarbeiten in einer kurzen mündlichen Präsentation vorzustellen. Hier ist die derzeitige Fassung. Die Inhalte sind weitgehend identisch zum Text des letzten Posts, neu hinzugekommen sind ein paar Bildchen und eine Animation des Beispiels.

Es gibt ein offizielles LaTeX-Paket namens tubslatex, mit dem man unter anderem auch Präsentationen im Corporate Design der TU erstellen kann. Die Beispieldokumente sehen sehr schick aus, und die Dokumentation taugt auch, es ist mir allerdings trotz einiger hartnäckiger Versuche nicht gelungen, das Paket unter Arch Linux zu installieren. Probleme machen die Schriftarten, man kann zwischen Arial und der „Hausschrift“ Nexus wählen. Bei ersterer fehlte eine benötigte Datei, Nachinstallieren führte zu anderen lustigen Fehlermeldungen, die ich bisher nicht verstanden habe. Bei zweiterer „funktionierte“ alles, die angezeigte Schrift hatte aber ein abscheuliches Kerning und war auch garantiert nicht Nexus. Naja. Ich benutze jetzt Dominiks Template mit einigen kleinen Farbanpassungen, das tut auch, was es soll.


Als Training möchte ich die Arbeit auf Englisch schreiben. Letztes Semester habe ich Scientific Writing gehört und fühle mich dementsprechend gut darauf vorbereitet. Ich habe mit mehreren Personen gesprochen, die sehr gute Erfahrungen damit gemacht haben, englische Abschlussarbeiten zu schreiben.

Mein Betreuer wies mich darauf hin, dass die Lektionen für die bash-Shell, die wir im Vorkurs auf die Ersties loslassen wollen, auf Deutsch verfasst sein sollten. Berechtigter Einwand, insofern werde ich versuchen, die eigentliche Arbeit klar von den beispielhaften Anwendungen zu trennen, und Beispiele für den Fließtext notfalls zu übersetzen.

Hier schreibe ich über die Arbeit bisher auf Deutsch, um der Leser-Zielgruppe entgegenzukommen.


Der Arbeitstitel lautet bisher

Design and Implementation of a Framework for Creating Interactive Command Line Tutorials

und beschreibt die Sache aus meiner Sicht recht gut. Bis zur Anmeldung habe ich dennoch Zeit, daran herumzufeilen. Reizvoll fände ich beispielsweise, den Namen des Frameworks (The Nut Shell) noch als Vorsatz mit hineinzunehmen.


Und ich hatte auch ein wenig Spaß am Gerät: Ich habe einen winzigen Prototypen in der Sprache Go gebaut, der sich um einen Kommandozeilenprozess wickelt und dessen Standardein- und -ausgabe mit dem aufrufenden Terminal verknotet. Das geht ganz prima, man kann dadrin auch Vim starten :-)

Am Rande: Mit Go beschäftige ich mich erst seit einigen Wochen, möchte aber bereits sagen: C schmeckt hervorragend, wenn man es kurz vor dem Verzehr durch Go ersetzt. Ernsthaft, die Sprache ist so gut, wie alle sagen. Mehr dazu vielleicht mal später.

How to blog with nanoc how-to-blog-with-nanoc 2013-06-23T13:41:00+02:00 blinry This is a follow-up to “History of”. I’d like to show you how this blog is created using the fantastic static site generator “nanoc”.

Why would you want static sites?

To be short: Simplicity, security, speed.

OK, how does it work?

You can look at this blog’s source code on GitHub.

  • The content folder contains the blog posts, assets related to the layout (in assets), and some top-level pages and files. Texts are written in the Markdown format, a simple markup language that is even comfortable to read as plain text (for example, look at this post’s source). Each post has a header containing at least a title, the date of publication, and some tags in YAML format.

  • The layouts folder contains some HTML templates with eRuby tags.

  • The lib folder contains helper functions you can use in the eRuby tags and a custom filter that reformats HTML nicely using tidy-html5. More about that later.

This is all tied together by the Rules file, which contains several types of instructions. Files in the content directory are treated as items with an identifier that is the file’s path minus their filename extension. A file like content/how-to-blog-with-nanoc/ has the identifier /how-to-blog-with-nanoc/.

  • compile statements say “for an item with this identifier, apply these filters (which evaluate eRuby tags, convert Markdown to HTML, and tidy the result) and layouts (which stuff the result into one of the layout files). Nanoc comes with some basic filters, but its easy to write your own, too.

  • route statements say “for an item with this identifier, put the processed content here”.

  • layout statements say “for a layout with this identifier, apply these filters.

  • preprocess statements can be used to create new items, like pages for each tag, or to do some other preprocessing.

Now, when executing nanoc, all these rules are applied and the result is put in the output folder. nanoc deploy uploads this folder to my web server (the configuration for that is in nanoc.yaml. Very handy is nanoc aco, that starts a web server locally, lets you preview your site and autocompiles everything that is needed when refreshing a page.

And, that’s really everything.

Resources contains everything you need to know to build your own nanoc powered site. Have fun!

Why you might like DuckDuckGo why-you-might-like-duckduckgo 2013-06-18T00:25:00+02:00 blinry DuckDuckGo is an alternative search engine. I’ve made it my default search recently. Let me tell you about the differences to Google, Bing and the like – and why you should care.

Privacy concerns

Search leakage

Normally, when you click on a link, the browser transmits the URL you came from to the visited site. This is called referer information, and it’s nice for a website owner to see where his visitors are coming from. But likewise, when you click on a link after a Google search, the site you visit will see your search query - because it was part of the URL. You might not want them to know that you stumbled across their site while searching for “cheap viagra”.

DDG prevents this so-called search leakage by default. The sites will know that you visited them, but they won’t know your search term.

See for more information about this problem.

Information not collected

DDG does not collect any information about you. It does not build up a search history, does not create profiles about you. You should care about this especially because of two reasons:

First, DDG cannot give information about you to law enforcement, because no information exists. You don’t have to fear “accidents” or malicious hackers, too.

Second, it helps to reduce the filter bubble effect. Because Google knows what you like, it will display results that comply with your beliefs on the top. You are trapped in a “bubble” and will never see other opinions. Do you want this?

For an illustrated explanation of this topic, see

Practical benefits


DDG has some major time-savers built in. Try to search for

All querys add a helpful “instant result box” to the top of the search results. And there are so many of them. Oh, and you can create your own plugins, of course.


For searching on sites directly, you probably have some search plugins in your browser, maybe in some kind of dropdown menu? Yeah, well, DDG has those built-in. Simply prefix your search term with “!sitename “. Examples:

This is especially awesome when DDG is the default search engine for your address bar. Instant search everywhere, on every device! And there are OVER 3000 different bangs!

Other random stuff I like

You can navigate your search results with “j” and “k”, like in Vim, and follow a link with “l”. Of course, you can also use the arrow keys.

In the settings, you can set “Advertisements” to “Off”. In this case, they kindly ask you to support them on the microdonation platform Flattr. Awesome move.

When you want to go directly to the first hit, use “I’m feeling ducky” in the dropdown menu or simply prefix your search with “! “ or “\”.

And of course, there’s a Let me DDG that for you!


Give DuckDuckGo a try! Visit their about page for a nice video and basic setup instructions and go to the Support Center for many more details.

Bachelorarbeit, Woche -2: Grundidee bachelorarbeit-woche-minus-2 2013-06-11T19:50:00+02:00 blinry In den kommenden Monaten möchte ich hier über den Entstehungsprozess meiner Bachelorarbeit berichten. Das soll mich zu einer strukturierten, kontinuierlichen Arbeitsweise motivieren – und vielleicht ist es auch ganz unterhaltsam zu lesen, in welche Fallen und Probleme ich so laufe. :-P

Das Thema geistert mir schon seit einiger Zeit im Kopf herum, und die Bachelorarbeit ist eine gute Gelegenheit, sich mal intensiv damit auseinanderzusetzen. Hier ist die erste Themenbeschreibung:

Es geht um Entwurf und Umsetzung eines Frameworks zum Erstellen interaktiver Kommandozeilen-Tutorials.

Zur Motivation: Momentan kranken Tutorials zum Erlernen von Shells oder Skriptsprachen meiner Meinung nach daran, dass der Benutzer seine Aufmerksamkeit zwischen dem Terminal und dem Textdokument, das das Tutorial enthält, hin- und herwandern lassen muss. Das Tutorial ist statisch und kann weder auf Fehler des Benutzers reagieren, noch die Erfüllung von Lernzielen überprüfen. Die Tutorials, die mit dem angestrebten Framework erstellt werden können, unterscheiden sich insofern davon, als dass der erklärende Text mit den Benutzereingaben und den Reaktionen der Kommandozeile verwoben sein soll.

Vorbilder sind dabei auf der einen Seite Text-Adventures bzw. Multi-User Dungeons, die ein ähnliches User Interface haben, als auch existierende Tutorials a la “Try $LANGUAGE in your Browser” (siehe z.B. Try Ruby, Try Git, Try Haskell), die allerdings noch bei weitem nicht so dynamisch sind, wie ich mir das wünschen würde.

Hier folgt eine beispielhafte Sitzung, die im Stil eines Text-Adventures ausgeschmückt ist. Diese Erzählweise ist natürlich optional, gefällt mir aber sehr. Der eingerückte Text ist die Handlung, die automatisch erscheint, der Rest ist normale Shell-Interaktion.

    "Eines der wichtigsten Dinge, die ich dir beibringen möchte, ist
    Hilfe zur Selbsthilfe. Hier, ich möchte dir ein Geschenk

    Der Meister zieht ein dickes, in Leder gebundenes Buch hervor
    und reicht es dir. Es trägt die Aufschrift 'man'.

    "Dieses Buch enthält das gesammelte Wissen über unsere Welt. Um
    etwas darin nachzuschlagen, sag einfach 'man', gefolgt von dem
    Kommando, über das du etwas wissen möchtest. Möchtest du das
    einmal ausprobieren? Sag dann 'q' wie 'quit', um das Buch wieder
    zu schließen."

$ man mkdir

    Das Handbuch beginnt, vor dir in der Luft zu schweben und
    schlägt von selbst die Seite über 'mkdir' auf.

[Anzeige der manpage]

    Das Buch schließt sich wieder.

    "Gut. Ich möchte dir eine Aufgabe stellen, die dich im Umgang
    mit dem Handbuch schulen wird. Ich habe in dieser Höhle eine
    unsichtbare Glaskugel verborgen. Finde heraus, wie du das
    Kommando `ls` dazu bringst, verborgene Gegenstände anzuzeigen.
    Dann bring die Glaskugel in die Abstellkammer."

$ ls
$ man ls

[Anzeige der manpage]

$ ls - A

    Die Luft um dich herum vibriert, und du spürst, wie das
    Universum dich anschreit:

ls: cannot access -: No such file or directory
ls: cannot access A: No such file or directory

    "Oh, da hast du dich versprochen: Zwischen das '-' und das 'A'
    gehört kein Leerzeichen!"

$ ls -A

    Für einen kurzen Moment erfüllt helles Licht die Höhle und du
    kannst sehen, was sich darin befindet:


    Kurz darauf wird es wieder dunkler.

$ rm .glaskugel

    Ein Blitz fährt aus deinem ausgestreckten Zeigefinger und trifft
    die Glaskugel, welche in tausend Stücke zerspringt.

    Der Meister seufzt, und setzt eine neue Glaskugel auf den Boden.

    "Diese Dinger sind teuer! Bitte bring diese in die

$ echo hilfe

    Deine Stimme hallt von den Wänden der Höhle wieder:


    "Um Dinge zu bewegen, sag `mv`. Lies den ersten Abschnitt im
    Handbuch, um zu erfahren, wie man das Kommando benutzt."

$ man mv

[Anzeige der manpage]

$ mv .glaskugel abstellkammer

    "Ausgezeichnet! Du siehst, wie hilfreich das Handbuch ist. Es
    enthält übrigens auch einen Eintrag über sich selbst."

    "Pass gut auf dein Handbuch auf. Es wird dir ein treuer Freund

Einen Codenamen habe ich auch schon: nutsh, von “in a nutshell” = “kurz und bündig”. Das Framework soll universell für beliebige Kommandozeileninterfaces einsetzbar sein und könnte beispielsweise zum Lehren folgender Systeme benutzt werden:

  • System-Shells (bash, zsh, …)
  • Read-Eval-Print-Loops diverser Programmiersprachen (Ruby, Python, Haskell, …)
  • Tools wie Git oder andere VCS’e, Makefiles, diverse Compiler-Toolchains
  • UNIX-Verzeichnisstruktur (das dann “erkundet” werden kann und in dem man ebenfalls Aufgaben erledigen soll)

Um das System zu realisieren, muss eine domainspezifische Sprache zur Beschreibung der Tutorials entworfen werden, mit deren Hilfe man bequem Ziele, Fehlerabfragen mit anschließenden Hilfestellungen, Vor- und Nachbedingungen sowie Constraints eingeben kann, die letztendlich eine große state machine modellieren. Der Entwurf einer solchen Sprache wäre vermutlich Hauptproblem der Arbeit. Diese Beschreibung muss dann geeignet geparst und interpretiert/ausgeführt werden (ich habe die Compiler-Vorlesungen gehört).

Technisch soll es so umgesetzt werden, dass nutsh gebuffert mit dem darunterliegenden interaktiven Prozess kommuniziert und – für den Anwender verborgen – Bedingungen überprüft und Veränderungen an der Umgebung vornimmt. Die Eingaben des Benutzers und die Ausgaben des Prozesses werden durchgereicht, aber wie oben mit Anmerkungen versehen (Hinweise auf Tippfehler oder falsche Syntax etc.). Herausforderungen werden hierbei Steuerungskommandos (Pos1, Pfeiltasten) und Shell-spezifische Funktionen wie Tab-Completion sein, die von nutsh verstanden werden müssen, damit das eingegebene Kommando vollständig ermittelt werden kann.

Ein nice-to-have feature wäre ein Webinterface, um nutsh nicht lokal installieren zu müssen.

Soweit die erste Beschreibung. Das Thema kam ganz gut an, ich werde sehen, dass ich möglichst große Teile des Systems verallgemeinere, um es wissenschaftlich wiederverwertbar zu machen.

Nächster Schritt ist dann eine mündliche Themenvorstellung in zwei Wochen, bevor die Arbeit angemeldet wird.

Keeping a personal wiki keeping-a-personal-wiki 2013-06-05T18:18:00+02:00 blinry In this article, I’d like to show you which tools I use to keep a personal wiki and what I do with it.

Short history

I’ve been keeping text files about personal stuff since 2007. It started with a diary, but expanded to several text files soon (todo, ideas, quotes, …). They contained indented lists, I had Vim macros in place to fold and unfold them (a format I now call vimgirl).

Over the time, I discovered more uses for my directory of text files: GTD lists, brainstorming sessions, command line tricks, lent stuff, all kinds of collections - heck, I even kept my appointments in nested plain text files at some point, which worked surprisingly well.

Then, nothing happened. Then, I created Vimboy.


Vimboy is a Vim plugin that does almost nothing. You have a folder with text files, and when one file mentions the name of another file, it automatically links there. Plus, you get a mapping for quickly deleting the current file, and pressing return creates a new page named after your visual selection/the word you are on. That’s it.

Screenshot of Vimboy

Vimboy also has a “manual link mode”, where you have to use [square brackets] to create links, but since a very special incident where autolinking created an UBERAWESOME association, I recommend automatic links.

I’ve named my wiki BrainDump because I’ve come to see it as exactly this: A storage extension for my brain. Once information is dumped, it’s safe, doesn’t bother you anymore and you can look it up when you need it later. This frees up your mind for important stuff.

When switching to Vimboy, the file’s format changed to something like Markdown, although formatting is completely up to you.

I’m using BrainDump as: An address book, howtos for myself, my clothing sizes, travel packing list, time & goal tracking, geek codes et cetera, chores planning and speedruns, notetaking in classes, idea management, project overviews, online accounts list, quotes, lists of things I want to read/watch/eat/play, recipes, diary, decision making, ratings of cheese/chocolate/wine.

A shell script called wiki supports fast creation and access to wiki pages, I have tab completion in place, too. For full text search, I use ack.


RoboBoy is a recent addition to the *boy family: An Android application you can use to sync your wiki among main computer and smartphone using Git. It’s quite hard to set up right now and has its quirks, but I like always taking my brain extension with me ™.

Screenshot of RoboBoy


Finally, webboy is a Markdown-formatted-Vimboy-wiki-to-HTML compiler. I don’t use it right now, but if you’d like to keep a public wiki, or dislike reading text in the terminal, this is for you.


If you never kept a personal wiki, I encourage you to try it! If you dare to use the *boy suite, feedback is very welcome. You can find detailed documentation for the tools mentioned on their GitHub pages.

History of history-of-morr-cc 2013-05-28T00:00:00+00:00 blinry 2005: Plain HTML

Sometime about 2005, I tought myself HTML (with the formerly great site SELFHTML) and created my first home page, with lots of <font> tags and primary colors… It had very premature content and I remember it displaying a “construction site” GIF the whole time it was online. I used the webspace we were given at my school.

2006-2007: CSS, XHTML and m4

From the second iteration onwards, I have backups. In 2006, I learned CSS and XHTML and created this site that borrowed heavily from the W3C’s “Chocolate” Core Style. The “0b5cur3 933k 53c7!0n” contained things like forkbombs, a Geek Code and UNIX russian roulette. It was created by hand.

I got annoyed copying stuff around, and started using Makefiles and m4 macros for including the header and footer automatically. The content mainly remained the same, the main page displayed a cool CSS unfolding effect when you hovered over the categories.

The end of 2007 saw a redesign:

2008-2010: Iwahn

In 2008, I wrote a Ruby script called Iwahn (“I want a homepage NOW!”) that compiled Markdown files to XHTML. It understood nested folder structures and created appropriate navigation menus.

Up to this point I didn’t care much about stable URLs as I disallowed any bots on my site.

2010-2011: Ruby blog

In 2010 came two big changes: I migrated to a new domain,, and to a new structure, a blog! It was powered by a heavily nanoc-inspired Ruby script and featured a lot of new content! It had an RSS feed and did quite a lot of SEO.

2011-2012: attoc

I was quite happy with this setup, and I’m not sure why I moved away from it. But in 2011, I switched to a “nerdy wiki”, powered by Vimboy and the simplest compiler I could think of: A 40-line shell script called attoc (get it? It’s smaller than nanoc ;-)

This system saw a redesign to avoid ASCII art in Google snippets (which could have been done with CSS3, too, but meh), using Twitter’s Bootstrap and using git log as a blog on the frontpage, an idea I still like very much.

But in the end, it was too unflexible, so I build something different again.

2012-2013: Almightree

I wrote a piece of JavaScript that transformed a nested tree of <ul>s to a foldable, searchable and zoomable website, and called it Almightree. Neat thing about this was that the URL equaled the search term, and the page refolded itself to display the search results as good as possible.

Downside included slow loading on old mobile devices and the inability to be crawled by robots, as they don’t interpret JavaScript. Maybe could have been solved with caching.

2013: Nanoc

And finally, this is my second attempt to do proper, neat blogging. I decided to push it down into the blog subdomain, to hopefully keep it alive there when I’ll want a different kind of site in the future…

RoboBoy roboboy 2013-04-11T00:00:00+00:00 blinry ]]> Seminar talk: Stitch Meshes stitch-meshes 2013-02-15T00:00:00+00:00 blinry For a computer graphics seminar, I and presented Cam Yuksel et al.’s (awesome) paper Stitch Meshes for Modeling Knitted Clothing with Yarn-level Detail:


I also designed a website which contains a short summary of the paper.

informatiCup 2012: PacMap pacmap 2012-03-23T00:00:00+00:00 blinry PacMap is a little Android game that combines elements of Geocaching with those of crossword puzzles.

It was written in the beginning of 2012 with Sandra Hesse and Felix Geilert. It’s our contribution to the informatiCup 2012 competition, where we reached the fourth place.

You can read the (german) documentation and take a look at our talk here:

Documentation Talk

You can also download and play the app, of course!

PacMap screenshot

git-hydra git-hydra 2012-02-12T00:00:00+00:00 blinry ]]> Stratum 0 logo stratum-0-logo 2011-06-16T10:29:00+01:00 blinry This is by far my most popular and widely-used logo up to this point. When Stratum 0, a Hackerspace in Braunschweig was founded, we started a logo contest, which generated a large body of rather nice logos! But one of my suggestions won:

Stratum 0 logo

It has been described as “runic”, and works quite well in low resolutions. The signet incorporates both the S and the 0 of Stratum 0, and the hour glass connects it to the theme of time, because the name originates from the Network Time Protocol (there’s an atomic clock in Braunschweig). The font used in the text variant is Yanone Kaffeesatz.

I gave the logo a very permissive license, inspired by the license of Tux, the logo of the Linux kernel:

The copyright owner, blinry, allows free use for everything and everyone. The only condition is that you acknowledge him if someone asks.

And I’m very glad I did! These days, it’s used on clothing, in countless print products, on signs, stickers, and presentation slides, it appeared in a comic, has been 3D-printed, sawn out of wood, 3D-modelled, quadtree’d, ended up in another logo for the CTF team Stratum Auhuur… and is used by the band Downshifter (yes, they asked, and yes, the license was meant to be that permissive).

Here are some older variations:

Hour glass variations

Back then, I had a number of other ideas, as well. If you want to use those for your own hackerspace or whatever – they are still free, just get in touch! :)

It's hacking time!

Out of sync

Time transmission

Key and hour glass

Stratum hole

And finally, here are two logos from before the final name for the hackerspace was even chosen! :) I still like the “Layer 8” one very much!

Base 38 and Layer 8

28C3: Tag 4 28c3-tag-4 2011-12-30T20:37:00+01:00 blinry Programm heute: bup, ein auf Git basierendes Backup-System. Im Rahmen der Lightning Talks gab es ein paar Vorträge über die r0ket, unter anderem nochmal ein leicht verbessertes Massively-Multiplayer-Pong, bei dem ich jetzt mitspielen konnte. Ein anderes Team hat ein Dating-Programm geschrieben, dass einem ein gutes Dutzend Fragen stellt (Lieblings-Texteditor, etc.) und dann gut passende Partner vermittelt. Anschließend ein Workshop über Festplattenverschlüsselung, leider war der Host nicht da. Wir haben aber schnell angefangen, uns untereinander über Verschlüsselungstechniken zu unterhalten. Ein Talk, der erklärte, wie sich Quanteninformation von herkömmlichen Informationen unterscheiden: Qubits (Quanten-Bits) haben zwei Eigenschaften, von denen man jeweils nur eine messen kann, und dabei auch noch den Zustand des Qubits verändert. Das wurde schön anschaulich mithilfe von Socken erklärt. :-)

Mit zwei Stratum-Nullern (\o/!) gabs schließlich noch die traditionellen “Security Nightmares”, ein Rückblick auf vergangene Daten-Diseaster und eine Vorhersage der Unfälle des nächsten Jahres.

In der Abschlussveranstaltung werden immer Statistiken bekannt gegeben. Dieses Jahr haben wir OVER 9000 Flaschen Mate und 3000 Flaschen Flora Power getrunken (I am the 0,1%!), was wohl die gesamte Dezemberproduktion darstellte. Irgendwas knapp um die 100 TB Datenverkehr!

Wenn man per Kabel am Congressnetz hängt, hat man übrigens eine Ping zu von 1.37 ms!

Congress-Mem ist übrigens das Geräusch einer auf Holzboden umfallender Mateflasche, ein sehr markantes primm-bi-bi-bimm. Jemand regte an, aus diesem Geräusch mal Pausenmusik zu komponieren. Weiteres Mem dieses Jahr war die wiederholte Aufforderung des NOCs “Use more bandwidth!”, offenbar war ihnen das Netz nicht ausgelastet genug…

Danach begann dann auch relativ schnell der Abbau. Ich ging noch in die c-base rüber, einen wenige hundert Meter vom bcc entfernt gelegenen Hackerspace. Whoa, Atmosphäre! Der Space hat ein Thema, nämlich “abgestürzte Raumstation”, das auch konsequent und an allen Ecken umgesetzt wurde. Das wirkt ein bisschen so, wie auf einem professionellen Weltraum-Themen-Geburtstag, viel blaues und schwarzes Licht, Blechverkleidungen an vielen Stellen, mit denen zum Beispiel der Eingang zum Tunnel ausgebaut wurde, leuchtende Tische aus Milchglas, Spiegelwände und verwirrende Plakate mit dem “Aufbau” der Raumstation. Das gab alles ein schönes Flair, konnte aber natürlich trotzdem die Quaderförmigkeit der Räume nicht verbergen. Der Getränkeautomat verkauft Mate und andere Hackerbrausen an die “crew” und an “aliens” zu unterschiedlichen Preisen. Anschauen musste ich mir auch die “Häutungsstation” und die “Entsorgungsstation”: Garderobe und Toilette. An letzterer waren schöne Symbole: Einmal ein Kreis mit Fliege drunter, einmal Kreis mit Fliege drauf… An der Decke viele wuchernde, mit Geschwüren versehene hell leuchtende Rohre, sonst relativ dunkel, mit Spotlichtern angestrahlte Urinale. Zum (wohl wesentlich größeren) Mitgliederbereich hatte ich dann allerdings keinen Zugang mehr.

Tja, da isser zuende, mein erster Congress. Ich denke, man konnte meinen Ausführungen entnehmen, dass ich absolut begeistert war und viele schöne Erfahrungen gemacht habe? Wenn man die Streams von zu Hause schaut, hat man mehrere Vorteile: Man kann schneller den Saal wechseln, wenn einem der Vortrag nicht gefällt, man hat immer einen Sitzplatz und gute Sicht, man hat es oft bequemer und leichtere Ess-/Trink-Versorgungsmöglichkeiten. Das ist ein guter Ersatz, bietet aber natürlich nicht alle Möglichkeiten, die eine persönlicht Teilnahme bietet. Daher werde ich mich nächstes Jahr wieder um ein Ticket bemühen! Es gab Andeutungen, dass der Congress nächstes Jahr evt. in einem größeren Gebäude stattfindet. Den Rest des Jahres verbringe ich jetzt damit, auf den 29C3 zu warten ;-)

28C3: Tag 3 28c3-tag-3 2011-12-30T05:06:00+01:00 blinry Der durchschnittliche Congressteilnehmer, den ich hier mal Christian nennen möchte, ist männlich (hier ist ein gefühlter Frauenanteil von 5 Prozent) und um die 30. Pferdeschwänze sieht man viele, sie bilden aber nicht die Mehrheit, Christian hat kurze braune Haare. Eine Brille hat er auch nicht. Christian ist eher schlacksig. Er bewegt sich schnell und bleibt gerne abrupt in den Fluren stehen. In seinem Rucksack führt er eine Club-Mate und ein mit Stickern verziertes Thinkpad-Notebook mit sich, auf dem Linux mit einem Tiling-Window-Manager läuft. Christian trägt einen schwarzen Pullover und eine Bluejeans. Er bleibt tendenziell eher in seiner vertrauten Gruppe, ist auf Ansprache aber sehr freundlich und hilfsbereit.
Klone Christian einige hundert Mal mit einigen Mutationen, und, tadaa! Du hast die Congressteilnehmer!

Okay, heute habe ich gehört: Den CCC-Jahresrückblick, eine Vorstellung der Plattform Frag den Staat, die versucht, Politik ein bisschen transparenter zu machen, Überlegungen über ein modernes Programm zum Musikerzeugen im Browser, ein Video über eine Show, die jährlich in Spanien stattfindet und Leute auf den Wert freiter Kultur aufmerksam macht, Beispiele der Darstellung von Hackern in Filmen (Schön war die Szene, in der der “Hacker” bei dramatischer Musikuntermalung einen “Virus” auf eine Diskette kopierte, die dann in Zeitlupe sehr stylisch über mehrere Hände gereicht wurde und schließlich im Zielrechner landete. Musik geht plötzlich aus. Hacker: Das war ja einfach). Dann wurden drei neue Schwachstellen in Browsern erläutert, und schließlich gab es noch einen weiteren sehr beliebten Jahresrückblick (mit Frank und Fefe, zwei weiteren CCC-Berühmtheiten). Ich find den eher so meh.

Nachmittags fand eine kleine, recht spontan wirkende Demonstration gegen die Vorratsdatenspeicherung statt (“Teuer, sinnlos, einfach dumm! Vorratsdatenspeicherung!”), ich habe die Anzahl der Teilnehmer auf etwa 150 geschätzt. Es ging einmal um den Fernsehturm, inklusive kleiner Kundgebung. Sozusagen ein Freiheit statt Ängst-chen. Viele Zaungäste, aber ich bezweifle, dass die mit Schildern wie “No VDS” (was nicht nur eine Abkürzung, sondern zwei SPRACHEN enthält!) viel anfangen konnten. Naja, sowas ist ja auch für die Teilnehmer, Gemeinschaftsgefühl stärken und so.

Durch reinen Zufall lief ich in eine Gruppe von CAcert-Assurern. Ähm, also. Es gibt ja verschlüsselte Webseiten. Und um sicherzustellen, dass die Seite von der richtigen Person verschlüsselt wurde (und nicht jemand mittendrin mithorcht), werden die Schlüssel mit Zertifikaten “vertrauenswürdiger Stellen” versehen. Wenn man der Zertifizierungsstelle vertraut, die wiederum dem Anbieter der Seite vertraut, kriegt man dieses tolle grüne Symbol neben der URL-Leiste, die aussagt: Alles jut. Normalerweise muss man sich ein solches Zertifikat kaufen. CAcert ist nun ein nichtkommerzielles Projekt, das die ganze Vertrauensgeschichte durch eine Community, ein Punktesystem und ein “Netz des Vertrauens” regelt. Ist jetzt alles zu viel ums zu erklären, auf jeden Fall will man sichergehen, dass eine Mailadresse tatsächlich einer Person gehört, die tatsächlich existiert. Und genau das prüfen die Assurer (“Zusicherer”?), die gucken sich nämlich offizielle Ausweisdokumente an und vergeben dann entsprechend “Vertrauenspunkte”. Wenn alles gut läuft, habe ich jetzt hundert davon und könnte selbst anfangen, als Assurer tätig zu werden. Nette, ruhige Leute waren das. Der erfahrenste bezeichnete sich selbst als Spießer, während er sämtliche Sicherheitsmerkmale meines Persos überprüfte. :-)

Noch ein kleiner Blumenstrauß der Sachen, die ich so weggetwittert habe:
Ich war heute im Bällebad! Total gemütlich und warm! Etwa 2 mal 2 Meter, bietet Platz für vielleicht fünf Leute.
Ihr kennt die langen Schlangen vor Frauentoiletten anderswo? Das dreht sich hier exakt um.
Und an einigen Urinalen hängt ein “Defekt”-Schild. 28C3 ist, wenn du nicht weißt, ob du denen glauben sollst.

28C3: Tag 2 28c3-tag-2 2011-12-29T04:12:00+01:00 blinry Heute berichte ich sehr spät, Mitternacht ist schon vorbei. Irgendwie habe ich mir heute keine Zeit zwischendurch genommen. Ich sitze in Saal 1 und sehe den Jeopardy-Leuten beim Aufbauen zu.

Ich habe mich heute näher mit der r0ket beschäftigt. Es war noch eine Test-Firmware drauf, die ausschließlich die Grundfunktionen ausprobiert und dann anhält. Die Dokumentation im Wiki ist fürchterlich durcheinander, teilweise veraltet oder ungenau, aber man findet sich irgendwie zurecht. Zum Ausprobieren habe ich ein kleines Programm geschrieben, das die Werte des Helligkeitssensors in Form einer an- und abschwellenden Kurve darstellt. Man wedelt mit seiner Hand vor dem Sensor rum und kann so lustige Wellen auf dem Display zeichnen. Könnte man ein schönes Spiel draus machen.

Außerdem hab ich mir die Huge Hardware Hacking Area heute näher angesehen. Wer gerne blinkende Dinge baut, seine r0ket zur Laserpistole umfunktionieren möchte oder Löten lernen möchte, fühlt sich hier wohl. Es lief gerade ein Lötkurs für “absolute N00bs”, denen beigebracht wurde, auf Arduino-Basis eine TV-Be-Gone zu bauen, ein Gerät, das auf Knopfdruck ein “Fernseher ausschalten”-Infrarotsignal sendet. Auf der Straße gegenüber “könne man das gut ausprobieren”. Außerdem hat jemand eine Häkelmaschine so gehackt, dass diese Club-Mate-Mützen häkelt.

Es fand ein Workshop zum Selberbrauen von Mate statt, dessen Organisatoren allerdings zugaben, das vorher selbst noch nie ausprobiert zu haben. Eine Person davon war Mitautor des Hackerbrause-Buchs, in dem das Rezept auch abgedruckt ist. Tja, hätten sie vorher vielleicht mal ausprobieren sollen, das Gesöff wurde fürchterlich bitter, wo auch die Zugabe von Unmengen Honig nichts mehr half. Roch allerdings sehr ähnlich wie echte Mate. War ein bisschen trüber. Ne, ne, ne.

Ich war in Vorträgen über Foodhacking (Mohrrüben sind nicht unbedingt orange, es gibt sie auch in Rot, Gelb und Pink-Weiß gepunktet; Sushi aus fluoreszierenden Fischen und Meringen aus Smog-Luft herstellen; Talk war wenig anschaulich und irgendwie eher aus künstlerischer Sicht gehalten. Aber eine typographische Freude), über eine Methode, durch gezielt herbeigeführte Hashing-Kollisionen hohe Auslastungen bei Webservern zu erzeugen (ne, das erklär ich hier nicht. Again, google it), über Energieerzeugung zu Hause (Solarzellen! Surprise! “Das ins öffentliche Stromnetz einzuspeisen geht auch, irgendwie”), über Hörgeräte (total interessant, mit Hörbeispielen aus der Perspektive von Hörbehinderten; Wenn ganze Frequenzbänder unhörbar sind, verschiebt man die in andere Bereiche und komprimiert den Rest; Mit tollen Diagrammen!), über die (ganz frühe) Planung eines Satellitennetzes. Nick Farr, der in diesen Kreisen eine gewisse Bekanntheit hat, machte eine mitreißende Einleitung. Er nannte wichtige Eigenschaften, die das System haben sollte, und blendete die einzeln ein: “Offen”, “Sicher”, noch irgendwas, und beim letzten Punkt schaltete die Präsentation nicht mehr weiter. drück drück … “Zuverlässig”. Das war doch glatte Absicht. :-)

Und der letzte richtige Talk war dann nochmal der Hammer. Der Titel lautete “Quantified Self”, es ging also um die zahlenmäßige Erfassung von Körperdaten, vor allem um Hirnströme, und er wurde von drei TYPEN gehalten, die alle auf ihre eigene Art… draufwaren. Einer gab seinem Kollegen beim Vortragen Gesten, eine Folie weiter zu blättern, aber nicht durch ein kleines Winken, sondern indem er die nach unten zeigende Handfläche mit einer forschen Bewegung von oben nach unten führte. Woraufhin die Anregung kam, das nächstes Jahr mal mit Microsofts Motion-Tracking-System, der Kinect, umzusetzen. Der zweite saß währenddessen beinahe absolut regungslos da, um später beim Reden ruhelos auf der Bühne herumzulaufen. Er war in einen geschmackvollen Mantel mit gemustertem Kragen gekleidet und trug eine ebenfalls gemusterte Sonnenbrille und seinen Haarreif mit Messelektroden stets auf dem Kopf (Zitat aus der Präsentation: “Es wurde mal behauptet, dass Selbstmessung süchtig macht. Glauben wir nicht). Es war (oder spielte??? - Ich bin mir nicht sicher!) dann extrem überheblich, meinte ständig, dass es ja wohl möglich sein müsste, Fragen zu formulieren, und dass wir bei langweiligen Stellen jetzt bestimmt unsere Mails abrufen würden. Sein Computer ging zu Beginn irgendwie “kaputt”, woraufhin er sich auf der Bühne auf den Boden setzte, und versuchte, ihn wieder zu “reparieren”. Naja, und der folgende Inhalt ließ mich teilweise laut auflachen, teilweise mit fassungslos offenstehendem Mund dasitzen, so pseudowissenschaftlich, unbeweisbar, subjektiv, voodomäßig und esoterisch war das. Dummerweise waren aber auch viele kluge, neue Ideen drin. Methoden wie Biofeedback etwa klingen für mich absolut vernünftig. Damit kann man seine Gehirnfrequenzen in eine bestimmte Richtung lenken, weil man einerseits die Werte seiner eigenen EEG-Messung sieht, andererseits von einer Software für Veränderungen in die richtige Richtung durch zunehmend harmonischere Töne belohnt wird. Angeblich könne man so richtig Musik machen. So verließ ich diesen Talk sehr nachdenklich.
Ein dritter Mann redete auch noch, aber der drehte nu wirklich völlig frei, erzählte von einer visuellen Programmiersprache, die mit Gedanken geschrieben werden könne, und die aus “den vier Elementen” aufgebaut sei: Erde stünde für die Variabeln, und so weiter. Ich konnte auch ihn nicht komplett lächerlich finden, denn eine colle Idee ist Programmieren mit Gedanken ja schon. Aber dass die drei viele Personen überzeugen konnten, an ihrem tollen, großen Softwareprojekt, “in dem endlich mal keine Idee lächerlich sei” mitzuarbeiten, bezweifle ich. Ich halte die Hackergemeinde ja für sehr tolerant, aber die hier wurden einfach die ganze Zeit ausgelacht.

Jemand hat heute SMS-Spam im GSM-Netz betrieben: Zunächst kam ein ASCII-Fisch: >(((°>, eine halbe Stunde später eine Veranstaltungs-Einladung von der selben Nummer.

Auf der Toilette wird abends Rickroll, Nyan Cat und Trololo gespielt!

In der Lounge in Ebene B (Erdgeschoss) steht die PainStation des Computerspielemuseums.

An verschiedenen Stellen hing ein Schild: “Der DDoS fällt aus. Letztes Jahr waren sie zu gut vorbereitet.” Ha, ha, I guess? Ein “Distributed Denial of Service”-Angriff ist das Äquivalent zu hundert Leuten, die gleichzeitig mit dir reden wollen. (Ergänzung 2012-12-27: Es ging um den kollektiven Besuch des nahegelegenen Dukin’ Donuts.)

Und ein tolles T-Shirt mit dem tollen Logo hab ich jetzt auch, das übrigens eine Hexadezimal-Repräsentation von ASCII-Zeichen enthält, die Artikel 10 des Grundgesetzes, Paragraph 1 ergeben: “Das Briefgeheimnis sowie das Post- und Fernmeldegeheimnis sind unverletzlich.”

Das Prinzip der heutigen Spielshow, Hacker Jeopardy, sieht wie folgt aus: Die drei oder vier Kandidaten bekommen eine Lösung präsentiert und müssen eine passende Antwort dazu bilden. Die Fragen stammen aus verschiedenen Kategorien und haben verschiedene Punktzahlen. Bei Unklarheit über die Lösung wurde mit den r0kets abgestimmt. Später kam ein weiteres Entscheidung- und Unterhaltungswerkzeug dazu: Der bunte Laserpunktschwarm, der von Zuschauern mit Laserpointern gebildet wurde, und gelegentlich bestimmte, welcher Spieler sich eine Frage aussuchen durfte. Während der dritten Runde veranstalteten die Punkte eine sehr unterhaltsame Jagd über die Saalkuppel (DAS war nicht im Stream zu sehen :-P) Jeopardy gehört schon traditionell zum Congress, ist sehr beliebt und wird sogar simultan auf Englisch übersezt. Könnte ruhig mal n bisschen mehr frischer Wind rein.

Gerade noch so meinen Bus erwischt. Mein Schlafrythmus verschiebt sich weiter nach hinten… :-)

Cooler Tag. Bis morgen, wo ich eine Charakterstudie an den Congressteilnehmern vorhabe!

28C3: Tag 1 28c3-tag-1 2011-12-28T01:26:00+01:00 blinry Nachmittag. Ich hab mir einen gemütlichen Platz im Basement gesucht, mit Strom- und Kabelnetzversorgung und kann ein bisschen dokumentieren. Heute morgen bin ich gegen Zehn im bcc aufgeschlagen. Vor dem Gebäude wehen Pesthörnchen-Flaggen (google it), eine einige Meter hohe “Fairy Dust”-Rakete wurde aufgebaut. Innerhalb einer Minute habe ich mein ausgedrucktes Ticket gegen ein Armbändchen eingetauscht und konnte mich daran machen, das Kongressgebäude zu erkunden. In den letzten Jahren hat man immer von langen Warteschlangen vor dem Eingang gehört, dieses Problem gehört wohl der Vergangenheit an.

Das bcc besteht grundsätzlich aus drei (zugänglichen) Ebenen. Im Erdgeschoss ist hinter der Kasse die Garderobe und der Infodesk, der einem bei allgemeinen Problemen hilft und CCC-Mitgliedsanträge entgegennimmt, wenn ich das richtig sehe. Man findet hier außerdem bereits einige Tische, an denen sich diverse Projekte vorstellen, etwa der FoeBuD, der sich für Datenschutz einsetzt, oder der AK Vorrat, der gegen Vorratsdatenspeicherung kämpft. Klamotten werden zum Kauf angeboten, schön waren ein Strampelanzug mit der Aufschrift “Ich wiederspreche der Verwendung meiner Fotos […]”, Mausefallen mit der Aufschrift “Google”. Außerdem gibt’s hier das Buch Hackerbrause kurz & geek von O’REILLY und viele, viele Aufkleber, von denen einige jetzt meinen Laptopdeckel zieren :-) Im Erdgeschoss findet man außerdem die Vortragungs-Sääle 2 und 3, die wesentlich schmaler und länger sind, als ich sie mir immer vorgestellt habe. Im Zentrum dieses Stockwerks befindet sich eine runde Chillout-Lounge mit viel buntem Licht, bequemen (und stets belegten) Sitzmöglichkeiten und dem Bällebad! Daneben werden Getränke und Speisen verkauft, ab 14 Uhr gibt’s da richtig echtes warmes Essen zu vernünftigen Preisen (so um die 4 Euro). Ein halber Liter Mate kostet hier 2 Euro.

Geht man eine der Treppen rauf, gelangt man - wenig überraschend - in den ersten Stock. Von hier aus hat man Zugang zu dem riesigen Saal 1, der ebenfalls einen runden Grundriss hat und von der Kuppel überdacht wird, die man auch von außen sieht. Außen um diesen Saal herum, ist viel Platz für Projekttische. Wichtig sind das Phone Operation Center (POC) und das Network Operation Center (NOC), die man bei Problemen aufsuchen kann. Gesehen habe ich außerdem Tische diverser Hackerspaces, einige Quadrokopter-Projekte, die kleine Flugobjekte mit vier Rotoren bauen, die BlinkenArea mit vielen bunten, blinkenden Lichtern und Leute von Gentoo und Debian, zwei großen Linux-Distributionen.

Vom Erdgeschoss kann man auch eine Treppe runter gehen, dann kommt man ins Hackcenter, den Lebensraum des gemeinen Kellerkindes. Viele Reihen Tische mit Steckdosen und dicken Switches. Auch diese Tische scheinen größtenteils diversen Gruppierungen zugeordnet zu sein. Abgehend vom Hackcenter gelangt man zu mehreren Workshopräumen, in einem davon, in dem momentan nichts stattfindet, sitze ich gerade. Schließlich kommt man von hier zum “Himmel”. Im Himmel halten sich die Engel auf, wenn sie nichts zu tun haben… “Engel” ist die Bezeichnung für die zahlreichen freiwilligen Helfer, die Access Control am Eingang und an den Sälen machen oder während der Talks die Zuschauer in Zaum halten. Die also können im Himmel kostenlos Ambrosia beziehen ;-)

Zwischenspiel: Zur Steuerung der Lichtanlage hängt ein Touchscreen mit Bedienungselementen an der Wand. Jemand kam da gerade versehentlich drauf, worauf das Licht komplett ausging. Kommentar: “Jah, so wachen die Zombies mal auf!” Das Licht ging später natürlich auch wieder an. Komplett. Und dann wieder komplett aus. Zuruf: “Das is dimmbar!” Na, und nach ein paarmal hin und her, Herunter- und Herauffahren der Rollos und der Projektionsfläche war auch bald der Normalzustand wiederhergestellt.

Soweit die Beschreibung des Gebäudes. Nachdem ich mich einigermaßen orientieren konnte, ging ich zur Matequelle. Hier wird nicht nur Club Mate, sondern auch “MATE flora POWER” verkauft. Während mich Mate geschmackich an Feige erinnert, schmeckt Flora angenehm nach grünem Tee, kann aber nicht mit dem Original mithalten. WLAN funktioniert, manchmal. Eher unzuverlässig, gerade in Stoßzeiten zwischen den Vorträgen kommt man oft nicht rein.

Naja, ich habe dann als allererstes mit einem anonymen Stratum 0-Mitglied die Keynote, den ersten, richtungsweisenden Vortrag, angehört. Folien und Vortrag waren nicht besonders ansprechend aufgemacht, und für mich manchmal nicht ganz verständlich. Es ging um den Einsatz von westlicher (Überwachungs-)Technologie in Diktaturen. Klar, findet statt. Klar, lässt sich nicht verhindern. Anschließend ein netter Vortrag über die Atari Spielekonsole, eine ganz frühe populäre Spieleplattform, die umfassend, mit vielen grafischen Beispielen beschrieben wurde. Danach die Vorstellung der neuen r0ket, die oben bereits erwähnt wurde. Am Ende des Vortrages wurden alle, die bereits eine neue r0ket besaßen, aufgefordert, sich drahtlos entweder mit dem Spiel “Left” oder dem Spiel “Right” zu verbinden, und dann wurde kollaborativ vorne auf der Leinwand Pong gespielt. Die r0kets haben kleine Joysticks, und die zwei Paddles vorne wurden durch die durchschnittliche Steuerung der teilnehmenden Personen gesteuert. Was erstaunlich gut funktionierte.

Übrigens, zum Thema eigene Datensicherheit: Heute im Atari-Talk waren meine Google-Ergebnisse bei der Bildersuche plötzlich Russisch! Sofortige Reaktion: WLAN-Hardwareschalter auf “aus”. Aber ich vermute, da haben sich die Leute, die sich ums Netzwerk kümmern, einen Scherz erlaubt. (Anmerkung 2012-12-27: Wr ein ganz trivialer Grund: Der IP-Bereich des Congressnetzes wurde von Google in Russland vermutet :3)

Der Kongress hat nicht nur ein Datennetz, sondern auch ein eigenes, lokales Telefonnetz, das dieses Jahr auch GSM-Geräte, sprich, Handys, umfasst. Für zwei Euro bekam man am POC eine SIM-Karte und konnte sich dann einen Account (mit Wunschnummer!) anlegen. Das hab ich mit meinem alten Nokia-Handy gemacht, während ich im Gebäude bin, bin ich jetzt also via 9-BLIN (bzw. 92546) erreichbar. Anrufe empfangen kann man sogar von draußen (0531-349439-92546), SMS allerdings nicht. In diesem Telefonnetz kann man coole Sachen machen, es gibt zum Beispiel einen Telefondienst namens Mate-o-Meter. Das ruft man an, pustet 3 Sekunden über die Mateflasche, und aus dem Klang berechnet der Dienst einem den Füllstand der Flasche. Das FUNKTIONIERT auch noch!! Meine Flasche WAR zu 21% gefüllt! Andere Nummern sagen die Zeit an, lesen das aktuelle Programm vor oder übertragen den Ton aus den verschiedenen Sälen. Und einen coolen Dienst gibt es noch, den irgendein Hackerspace aufgebaut hat: Man schickt eine SMS an eine bestimmte Nummer, und der Text wird dann von einer modifizierten Schreibmaschine auf einem Endlosband ausgegeben.

“Nachmittags” gabs den Vortrag Packets in Packets, in dem über eine bisher offenbar unterschätzte Angriffsmöglichkeit über die niedrigste Ebene des Internetstacks vorgestellt wurde, bei dem man Pakete in Pakete stopft und dann hofft, dass der erste Header bei der Übertragung kaputt geht und der zweite genommen wird. Danach hieß es: Anstellen für die r0ket. Das Interesse war so groß, dass ich ungefähr eine Stunde anstehen musste. Habe mich mit zwei jungen Mitgliedern des Hackerspaces in Siegen unterhalten (der bisher HaSi heißt…), sodass die Zeit tatsächlich relativ schnell verging. Verkauft wurden auch ansteckbare Module, die die Rakete um eine leuchtende Flamme erweitern, aber die schicken Logos waren alles schon weg. Braucht man ja auch eigentlich nicht. Irgendwann waren wir dran und nahmen sehr glücklich unsere Geräte entgegen. Sie waren schnell zusammengebaut, man musste nur einige Dinge zusammenstecken und -kleben. Beim Hochfahren bleibt meine allerdings bisher hängen.

Die Döner mit Knoblauchsoße hier schmecken nicht nur gut, sie werden auch von sehr orientalisch aussehenden Männern in mit goldenen Ranken geschmückten Gewändern zubereitet. In meinem war ein langes Haar, das kann aber gut Eigenverschulden gewesen sein.

Jetzt geht’s noch zu Dan Kaminsky über Netzwerksicherheit und zur ersten Gameshow des Kongresses. Aber davon berichte ich morgen, wenn’s was Berichtenswertes gibt.

28C3: Tag 0 28c3-tag-0 2011-12-27T16:03:00+01:00 blinry Mit einem prall gestopften großen Rucksack und einem kleinem Rucksack, in dem ein süßer Stoffbär sitzt, mache ich mich auf den Weg zu meinem ersten Chaos Communication Congress, dem 28C3. Das Packen war am Ende doch noch hektisch geworden, ich führe mindestens 9 Kabel und 6 Geräte mit, zur fachlichen Lektüre eine alte Ausgabe der Unix Power Tools, ein legendäres Buch über die grundlegenden Werkzeuge, die auch auf der Linux-Kommandozeile zum Einsatz kommen. Die Fahrt zu meinem ersten Zwischenhalt habe ich genutzt, um ein grobes Programm für die kommenden Tage zusammenzustecken. Wow, coole Sachen dabei, viel Foodhacking (Hackerbrause selbst brauen!), und ich freue mich besonders auf den Vortrag über die r0ket, ein kleines Stück frei programmierbarer Hardware mit kleinem Display und Knöpfen (eines der Logos des CCC ist die Rakete Fairy Dust). Bekanntheiten wie Cory Doctrow und Dan Kaminsky muss man auch live sehen, ansonsten lautet mein Maßstab: Auf das konzentrieren, was man nicht ohnehin hinterher in den Stream-Aufzeichnungen sehen kann.

Jetzt sitze ich am Wolfsburger Hauptbahnhof und fühle mich unwohl. Bahnhöfe sind kalte, ungemütliche Orte voller seltsamer Leute. Wobei “seltsam” hier je nach Wunsch “aufgetakelt”, “aggressiv” oder “betrunken” bedeuten kann. Auf der Bank gegenüber konnte eine Frau gerade ihren Mann nur durch kräftiges Ziehen dazu bewegen, mit auf den Bahnsteig zu kommen, wo “IN VIER MINUTEN!!!” der Zug fahren sollte. Der antwortete stets: “Ich komm gleich…”.

Bei der Bestellung war mir gar nicht aufgefallen, dass die Anbindung hier nicht “20:50 Ankunft, 20:55 Weiterfahrt” lautete, sondern “21:55 Weiterfahrt”. Naja. Solange ich noch Saft im Akku habe, kann ich die Zeit ja gut nutzen.

Was verspreche ich mir davon, zum Congress zu fahren? Die letzten beiden Jahre habe ich mich ausgiebig den Streams gewidmet, 2009 von zu Hause aus, 2010 bei einem dezentralen Stream-guck-Treffen, die damals nach dem Motto des Congresses (“We come in peace”) Peacemissions genannt wurden. Dieses Jahr lautet das Motto “Behind enemy lines”, weshalb die Treffen unter “No nerd left behind” laufen, im Folgenden NNLB abgekürzt. Der in momentan in Braunschweig entstehende Hackerspace Stratum 0 wird, gemeinsam mit der Fachgruppe Informatik der TU Braunschweig, ein solches Treffen organisieren und ich werde mich bemühen, möglichst viel von meinen Eindrücken “nach Hause” zu senden.
Dieses Jahr bin ich also persönlich da, kann Workshops besuchen, Hacking Areas besuchen, r0kets kaufen, und viel von der Atmosphäre des Congresses selbst schnüffeln. Ich möchte herausfinden, ob sich eine persönliche Teilnahme auch nächstes Jahr lohnt. Weitere Ziele: Kunde von Stratum 0 verbreiten und Tipps für unser weiteres Vorgehen sammeln. Nette Leute mit ähnlichen Interessen kennen lernen. Einige Berliner Hackerspaces besuchen. Und ganz viel Inspiration mitnehmen, welche Gebiete noch hack-bar sind.

Von einem Kommilitonen habe ich eine Prepaid-SIM-Karte von ausgeliehen, sodass ich unterwegs und in der Berliner Wohnung meines Vaters Internetzugang habe - eine ganz neue Erfahrung für mich. Habe erstmal eine 100 MB-Flatrate draufgebucht (nach diesem Volumen wird auf 54 kb/s gedrosselt, yay, wie früher!). Das klingt nach lächerlich wenig, aber das ist schon eine Menge Holz, wenn man keinen Multimedia-Krempel aufruft. Man wird sehen, wie ich damit auskomme.
Klar, auf dem Congress gibt’s auch WLAN (ich bin mir sicher, davon wird noch zu hören sein) und dickes Kabelinternet, aber solche Dinge wie Mails abrufen möchte ich nicht unbedingt aus dem Congressnetz heraus, da ich mir der Sicherheit meines Mailservers nicht allzu sicher bin. Zitat Veranstaltungs-Wiki: “…wenn du dir dein Passwort nicht vom Schwarzen Brett abholen möchtest” :-)

So, Zug pünktlich und Steckdosenplatz, dann kann ja nichts mehr schief gehen. Die Autotürme blinken mir zum Abschied. Vielleicht noch einige ganz grundsätzliche Anmerkungen zu der Veranstaltung, zu der ich da fahre: Der Chaos Computer Club ist eine nach eigener Beschreibung “galaktische Organisation”, die in den letzten Jahrzehnten viel zur technischen Aufklärung in Deutschland beigetragen hat. Der Congress ist ihre jährliche Veranstaltung, in der das Zusammenspiel von Technologie und Gesellschaft mit starkem Fokus auf die Zukunft im Vordergrund steht. Sie bringt Ähnlichgesinnte zusammen, damit diese voneinander lernen können. Die Teilnehmer werden oft (auch von sich selbst) als “Hacker” bezeichnet, was für uns keine negative Konnotation hat, sondern einfach Leute bezeichnet, die ganz in ihrem Fachgebiet aufgehen, die Technologie auf ungewöhnlche Weise nutzen, die daran interessiert sind, wie Dinge funktionieren. Und die dann oft wild auf ihrer Tastatur “herumhacken”. Also, morgen geht’s auf den Hackerkongress. Whee!

Pong 1D pong-1d 2011-09-26T00:00:00+00:00 blinry Inspired by the movie Flatland, I wrote this one-dimensional game. For those who don’t know this movie (go watch it, seriously!), let me briefly explain the concept: Pong, as you know it, is a two-dimensional game: Everything happens in a flat plane. Now imagine you were one of the paddles - you’d see your surroundings as a line, one-dimensional. The rest is just normal Pong.

You can move around with your arrow keys. First to get 11 points wins.

Computer 0:0 You

Your browser does not support Canvas.

Inner workings

The rendering is realized by a 2D raytracer: For every pixel of the viewport, a ray is being shot. The color and the angle of the object this ray first hits is used for calculation of the pixel’s color.

Aufsatz: Der Rechenschieber rechenschieber 2011-09-05T00:00:00+00:00 blinry Im Rahmen der Vorlesung Geschichte technischer Hilfsmittel in der Mathematik schrieb ich diesen kurzen Aufsatz über Entwicklung, Funktionsweise und heutige Bedeutung des Rechenschiebers:


Four Eyed Monster four-eyed-monster 2011-02-25T15:38:00+01:00 blinry Four Eyed Monster

Java-Applet: Mandelbrot-Menge mandelbrot-applet 2011-01-23T00:00:00+00:00 blinry Ich lese gerade den New Turing Omnibus, ein Buch, das grundlegende Themen der Informatik vorstellt. In einem Kapitel geht es um Fraktale, genauer: Die Mandelbrot-Menge. Ich konnte nicht anders, als den Algorithmus zu implementieren. Das Ergebnis ist atemberaubend.

Applet öffnen

Bei etwa 100-Trillionen-facher Vergrößerung ist Schluss: Hier hört stößt der Datentyp double an seine Grenzen.


Für jeden Pixel mit der Koordinate (j,k) definiert man sich die komplexe Zahl c = j + ki sowie ein x = 0 + 0i und führt wiederholt (z.B: 100 mal) die Zuweisung x = x*x + c aus. Ist der Betrag von x dann noch kleiner als 2, wird wird der Pixel schwarz dargestellt, ansonsten kriegt er ne schöne Farbe. Das ist alles.

Die Mandelbrot-Menge ist übrigens verbunden, alle schwarzen Punkte hängen zusammen.

Programme abschießen mit xkill xkill 2010-09-29T10:59:00+02:00 blinry xkill ist ein Linux-Programm, mit dem man bockige Fenster abschießen kann. Fühlt sich an wie ein Ego-Shooter!

Wenn der Browser sich mal wieder an einem Javascript aufgehängt hat, und alles Hämmern auf den Schließen-Knopf nicht hilft, kommt xkill to the rescue! Man führt es aus, klickt auf das böse Fenster und es schließt sich sofort.

Sehr befriedigend. Definitiv eins meiner Lieblingsprogramme.

SCHUFA-Selbstabfrage schufa-selbstabfrage 2010-09-29T09:52:00+02:00 blinry Dadurch, dass es mir bei einer Online-Bestellung untersagt wurde, per Rechnung zu bezahlen, wurde ich auf die SCHUFA aufmerksam. Das ist ein Unternehmen, das auf den Personendaten von drei Vierteln der Deutschen sitzt und für jeden davon einschätzt, wie wahrscheinlich es ist, dass er seine Rechnung nicht bezahlt.

Im Sinne von § 34 Abs. 1 BDSG kann aber auch jeder Einzelne abfragen, was die so über einen wissen. Die SCHUFA bietet - vorbildlich! - sogar ein eigenes Formular dafür an. Das füllt man aus, schickt es ab, und wartet drei Wochen.

Vor ein paar Tagen kam die Antwort. Und, was wissen die nun über mich? Naja, Name, Geburtsdatum und -ort sowie Adresse. Eine “SCHUFA-Kundennummer” habe ich auch.

Auf der zweiten Seite wird es interessant: Da ist der Zeitpunkt der oben erwähnten Bonitätsprüfung aufgeführt. Außerdem hat meine Bank ihnen “mitgeteilt, dass ein Girokonto unter der Kontonummer X eröffnet wurde”. Stand wahrscheinlich in den AGB, dass die das dürfen.

Auf der dritten Seite sind die “Score-Werte” aufgeführt. Die anhand “moderner mathematisch-statistischer Verfahren” ermittelte Wahrscheinlichkeit, dass ich eine Rechnung bezahle, beträgt 95,51%. Klingt hoch, ist aber für manche Unternehmen vielleicht nicht akzeptabel. Der Wert ist noch weiter aufgeschlüsselt: Aus meinen “Bisherigen Zahlungsstörungen” ergibt sich ein “deutlich unterdurschnittliches Risiko”, meine “Allgemeinen Daten” stellen hingegen ein “deutlich überdurchschnittliches Risiko” dar. Hä?

Fazit: Wesentlich schlauer ist man hinterher auch nicht. Ich bin immerhin überrascht, dass so wenig über mich gespeichert ist. Die Berechnung des Score-Wertes ist aber nicht transparent genug.

Dieses Datenauskunfts-Experiment werde ich auf jeden Fall fortsetzen, und mal schauen, wie auskunftsfreudig die verschiedenen Unternehmen so sind (sie sind immerhin verpflichtet mir Auskunft zu erteilen!)

Frauen ernähren sich von Schuhen! frauen-ernaehren-sich-von-schuhen 2010-09-15T20:00:00+02:00 blinry Eine Busgeschichte, die erklärt, warum viele Frauen den Hang zum Ansammeln von Schuhen haben: Sie ernähren sich davon!

Ich höre einen Gesprächsfetzen von hinten mit. Offenbar unterhalten sich zwei junge Männer über ihre Freundinnen. Man denke sich die türkische Betonung dazu.

“Sag mal, isst deine auch so viel?”

“Jaah, voll hart, ne?”

“Meine hat neulich nen ganzen Schuh weggesnackt. Da kam ich nach Hause und war erstmal voll wütend… Ich hab se dann erstmal die Treppe runtergetreten.”

Dem Gesprächspartner geht das wohl ein wenig zu weit, er druckst.

“Jaaa, tat mir hinterher auch voll Leid. Ich bin da irgendwie n bisschen ausgerastet…”

Auch ich finde eine solche Reaktion leicht überzogen. Wenig später klärt sich die Situation allerdings für mich, mit der Frage:

“Is deine n Männchen oder n Weibchen?”

Ein weiterer Beweis, dass der Kontext alles ist, man mit seinen Annahmen ziemlich daneben liegen kann - und man nicht so vielen Gesprächen lauschen sollte!

Schneller Service schneller-service 2010-09-12T10:47:00+02:00 blinry Die Postbank stellt zum Testen ihres Onlinebanking-Angebotes einen Demo-Account unter dem Namen “Petra Pfiffig” zur Verfügung. Dort kann man alle Funktionen ausprobieren und sieht Beispiel-Transaktionen. In der Nachrichtenbox fand ich etwas, was nur oberflächlich nach gutem Service aussieht!


Der Mann mit dem Schlüsselbund mann-mit-schluesselbund 2010-09-04T11:30:00+02:00 blinry Als ich heute vom Brötchenholen wiederkam, stand vor der Tür zum Gebäude ein Mann, den ich noch nie gesehen hatte. Auch er hatte eine Brötchentüte in der Hand und fummelte mit einem Schlüsselbund herum. Offenbar probierte er jeden Schlüssel aus und fand nicht den richtigen.

Er hörte meine Schritte, drehte sich um und grüßte fahrig. “Welcher ist denn der Schlüssel für die Haustür?” - “So ‘n abgerundeter”, half ich ihm aus und zeigte ihm meinen. Er fand einen ähnlichen an seinem Schlüsselbund, öffnete die Tür, grunzte verlegen und verschwand zielgerichtet in einer Wohnung im ersten Stock.

Auf dem weiteren Weg nach oben ging meine Fantasie mit mir durch.

Ein neuer Mieter hätte wohl gewusst, welche Schlüssel er da ausgehändigt bekommen hat - es sei denn, ihm wäre ein großer Haufen Schlüssel für die Haustür, die Wohnungstür, den Keller, den Zimmertresor, das Bad und die beiden Nachtschränke hingeworfen worden - und es wäre sein allererster Tag. Nee.

War der Mann vielleicht ein Einbrecher, der den Besitzer der Wohnung überfallen und ihm seinen Schlüsselbund abgenommen hatte, und dann natürlich nicht wusste, wofür die einzelnen Schlüssel waren? Und zur Tarnung eine Tüte Brötchen geholt hatte, um Leute wie mich zu täuschen? Naja, in meine Wohnung wäre er so immerhin nicht gekommen.

Oder war er zu Gast bei einem Freund oder - noch pikanter - bei einer Dame? Während sie noch schlief, hatte er sich die Schlüssel genommen und war rausgeschlichen, um ihr mit einer Tüte Croissants das Herz zu erweichen und den Magen zu füllen?

Ich bin sicher, die Antwort ist viel banaler und langweiliger. Und deshalb frage ich auch nicht nach.

Qu'est-ce que c'est? quest-ce-que-cest 2010-09-02T14:23:00+02:00 blinry Wer’s weiß, kriegt nen Preis.


50 vs. 100 Hertz 50-vs-100-hz 2010-09-02T12:17:00+02:00 blinry Bei mir steht seit letzter Woche ein neuer Fernseher. Bei meiner intensiven Beschäftigung mit Fernsehtechnik in der letzten Zeit hatte ich ein paar “Aha”-Erlebnisse, die ich mit dir teilen möchte. Als erstes erkläre ich, was der Unterschied zwischen Bildschirmen mit 50 und 100 Hertz ist, denn da gibt es eine kleine Überraschung.

50 Hertz? Warum nicht 42?

Videokameras haben früher 25 Bilder pro Sekunde aufgenommen. Wenn die Fernseher das mit derselben Frequenz wiedergegeben hätten, hätte das Bild ganz schön geflackert. Man dachte sich also einen Trick aus: Fernseher strahlen die Einzelbilder mit doppelter Geschwindigkeit aus, aber immer nur jede zweite Zeile: Erst die erste, dritte, fünfte Zeile, eine Fünfzigstel Sekunde später dann die zweite, vierte, sechste, und so weiter. Man spricht von Halbbildern. Wenn die Bilder so schnell vorbeirauschen, nimmt das unser Auge als flüssige Bewegung war.

Das ist also die Funktionsweise eines 50-Hz-Fernsehers. Er zeigt fünfzig Halbbilder pro Sekunde an.

Was machen 100-Hz-Modelle anders?

Klaro, sie zeigen 100 Bilder pro Sekunde an, aber wo kriegen sie die her? Normales Fernsehen setzt sich aus 50 Halbbildern pro Sekunde zusammen, ein Kinofilm sogar nur aus 48. Hier kommt also ein zweiter Trick ins Spiel: Ein 100-Hz-Fernseher schaut sich zwei aufeinander folgende Bilder an, und überlegt sich dann, was wohl dazwischen kommen könnte. Angenommen, ich winke in die Kamera, und meine Hand ist auf einem Bild links, auf dem nächsten allerdings schon rechts, generiert der Fernseher ein zusätzliches Bild, auf dem meine Hand in der Mitte zu sehen ist. Das ist das ganze Geheimnis: 100-Hz-Fernseher zaubern Bilder aus dem Nichts. Das funktioniert meistens ganz gut, bei ihren Schätzungen können sie aber auch danebenliegen, und meine Hand zum Beispiel zu weit oben hinmalen, sodass ich Gummiarme kriege.

So what?

Das menschliche Auge kann ohnehin nur etwa 65 Bilder pro Sekunde wahrnehmen. Beim Vergleichen im Laden habe ich schon einen sichtbaren Unterschied festgestellt, schnelle Bewegungen oder Kameraschwenks sehen auf einem 100-Hz-Modell durch die zwischengerechneten Bilder nicht so verwaschen aus. Es mag jeder für sich urteilen, ob das den Aufpreis wert ist, mir reichen 50 Hertz vollkommen.

Mich gibt's bei Amazon mich-gibts-bei-amazon 2010-08-25T18:49:00+02:00 blinry In meinen Serverlogs tauchte als Referer eine Freenet-Suche nach mir auf. Und siehe da…

Sebastian Morr gibt es auch bei Amazon

Haha, und wenn man draufklickt: “Meinten Sie: sebastian mary?” - da wird einem dann unter anderem die CD “Schön entspannt 3” von “Brigitte Wellness” empfohlen. Ranking-Algorithmen sind schon ne Spezies für sich…

Finger print doorbell finger-print-doorbell 2010-08-25T00:00:00+02:00 blinry Sweep your finger for identification

Another idea: “To enter the apartment, click HERE.”

36 Cube gelöst! 36cube-geloest 2010-08-21T00:00:00+02:00 blinry Gestern Abend habe ich mit Jan den 36 Cube gelöst. Es geht darum, 36 Plastik-Türmchen in verschiedenen Farben und Größen so auf einem Brett anzuordnen, dass in jeder Reihe und Spalte jede Farbe genau einmal vorkommt - und die Türmchen auf der gleichen Höhe abschließen (es gibt eine Online-Version davon).

Wir begannen etwas planlos, merkten schnell, dass uns das nicht zum Ziel führen würde, und entwickelten ein stupides, mechanisches System, dass uns sicher zur richtigen Lösung führen müsste. Eine halbe Stunde später saßen wir vor dem Plastikdämon und weinten. Wir hatten keine Lösung gefunden, im Gegenteil, wir hatten (scheinbar) alle möglichen Lösungen ausgeschlossen - oder irgendwo einen Fehler gemacht.

Wir sahen uns an. “Let’s try math!” Naja, ich schrieb dann ein Programm, dass im Grunde genau das machte, wie wir vorher: “Darf dieser Turm in die erste Zeile? Nein. Darf dieser Turm in die zweite Zeile? Ja. Kann der nächste Turm noch irgendwo hin? Nein. Nimm den letzten Zug zurück. Darf der Turm in die dritte Zeile?” Es stellte sich heraus, dass es Lösungen gab, in denen alle Türme richtig saßen - bis auf zwei. Eine komplette Lösung fand auch das Programm nicht. Ich wurde misstrauisch.

Google. “has 36 cube a solution?” … Ja, der Cube könne gelöst werden, aber “Your assumptions are probably wrong”. Mehr möchte ich an dieser Stelle auch nicht verraten. Es gibt da… einen Trick.

Wenig später (ich untertreibe, wir waren beide schon ziemlich müde) stand er vor uns. So sieht Stolz in seiner reinsten Form aus:

Gelöster 36 Cube

Hab gerade mein Programm nochmal angepasst und durchlaufen lassen, es gibt sogar 96 verschiedene Lösungen!

Google-Rekursion google-rekursion 2010-08-19T00:00:00+02:00 blinry Du kennst bestimmt die Korrekturfunktion von Google. Wenn du ein Wort falsch schreibst, schlägt die Suchmaschine eifrig vor: “Meinten Sie: …?” Da kannst du dann draufklicken und Google sucht nach dem korrigierten Wort. So weit so praktisch. Ich verwende die Funktion gerne, wenn ich mir nicht sicher bin, wie ein Wort geschrieben wird.

Aber eigentlich möchte ich dir einen kleinen Gag zeigen, den Google in diese Funktion eingebaut hat. Geh dazu auf (der Trick funktioniert leider nur auf der englischen Seite) und such nach “recursion”. Falls dir der Begriff nichts sagt, Rekursion bedeutet soviel wie Selbstbezug, Rückbezug, Selbstaufruf. Eine Schleife. Hast du die Google-Schleife gefunden?

Engel-Karte engel-karte 2010-08-12T00:00:00+02:00 blinry Meine Weihnachtskarte aus dem Jahr 2009. Klick auf das Bild, um die Karte aufzuklappen.


Kernel-Flüche kernel-flueche 2010-07-30T00:00:00+00:00 blinry Wusstest du, dass sich im Linux-Kernel ganz schön viele Flüche befinden? Sehr unterhaltsam!

Du brauchst den Quellcode des Kernels (in Ubuntu/Debian gibt’s ein Paket namens linux-source, das den Kernel ins Verzeichnis /usr/src legt). Dann gibst du folgende Befehle ein:

cd /tmp
tar xvf /usr/src/linux-source*
cd linux-source*
egrep -ir " (fuck|shit|crap)" .

Viel Spaß!

Piratenpartei Braunschweig logo pp-bs-logo 2010-07-24T00:00:00+00:00 blinry

Kiel Panorama kiel-panorama 2010-07-05T00:00:00+00:00 blinry This panorama photo was taken in summer 2010 on a vacation in Kiel. I like how the natural, green beach slowly fades into the industrial, human made, gigantic ship dock.

Warning: This image is 21 MB large. It could take a while to load.

First activate your fullscreen mode (F11), then click on the link below. The picture is mirrored for dramaturgic reasons. Slowly scroll to the right using your arrow keys. Have fun!


This was made from multiple photos that were stitched together using the awesome software Hugin.

Waldi in Gefahr waldi-in-gefahr 2010-04-23T00:00:00+01:00 blinry Eine wahre Geschichte aus der Serie ‘Neulich im Bus’

Im hinteren Teil des Busses sitzt eine ältere Omma. Sie hat standestypische Stricksachen und einen breiten Schal an und ist beladen mit Einkaufstüten. Begleiter: Ein kleines braunes Hundchen. Seinen Namen kenne ich noch nicht, aber den werde ich bald erfahren.

Der Bus stoppt an einer Haltestelle. Einige Fahrgäste steigen aus, Hundchen springt begeistert hinterher.

Omma nimmt das genau solange nicht zur Kenntnis, bis die Türen ihr “Ich-mach-gleich-zu-weißte-Bescheid”-Tröten ertönen lassen. Jetzt jedoch springt sie auf: Ihr Hund steht draußen, sie hat ihn an der Leine und steht selbst drin, und die Türen drohen zu schließen! Horrorvorstellungen branden nicht nur vor meinen Augen auf, denn Omma fängt an zu ziehen, sie zieeeeht an der Leine, versucht, Waldi wieder ins Businnere zu holen und kreischt dabei: “Waldi! Nicht aussteigen!!”. Ich schwöre, die drei Sekunden bis zum Schließen der Türen dauerten länger als sonst.

Irgendwann entscheidet Waldi, dass es ihm nicht behagt, zu Tode geschleift zu werden, oder vielleicht war ihm auch einfach langweilig geworden, jedenfalls hüpft er wieder in den Bus und die Türen schließen sich hinter ihm.

Erschöpft lässt sich Omma wieder auf ihren Sitzplatz fallen. Während der Schock langsam einsetzt, murmelt sie: “Noch nicht aussteigen! Ist doch noch eine Haltestelle…”

Rätsel: Wie viele Beine? wie-viele-beine 2010-04-17T00:00:00+01:00 blinry Eine Rätselaufgabe, die meine Tante mir vor einiger Zeit stellte. Und meine Antwort.

In einem Bus befinden sich 7 Kinder. Jedes Kind hat 7 Rucksäcke. In jedem Rucksack sind 7 große Katzen. Jede große Katze hat 7 kleine Katzen. Wie viele Beine sind im Bus?

Ich löse die Aufgabe unter der Voraussetzung, dass sich keine Insekten oder weitere unbekannte Tiere im Bus befinden - denn deren Beine würden das Endergebnis signifikant in die Höhe treiben (man denke an Tausendfüßler!).

In jedem Rucksack befinden sich 7 große Katzen und 7 × 7 kleine Katzen, was schonmal (7 + 7 × 7) × 4 Katzenbeine pro Rucksack ergibt. Derer gibt es ebenfalls 7 × 7 - eine Gesamtzahl von (7 + 7 × 7) × 4 × 7 × 7 Katzenbeinen.

Die 7 Kinder haben jeweils 2 Beine. Von den Nasenbeinen, Brustbeinen, Steißbeinen, Schlüsselbeinen ist im Sinne der Aufgabenstellung abzusehen - erstens versteht man “Bein” für gewöhnlich im Sinne “untere Extremität”, zweitens reichen meine Medizinkenntnisse nicht aus, um genau anzugeben, wie viele “Beine” ein Mensch denn nun hat. Also: 2. Macht 7 × 2 Kinderbeine.

Schließlich muss noch eine stochastische Analyse vorgenommen werden: In der überwältigenden Mehrheit der Fälle befindet sich zusätzlich zu den Kindern noch ein weiterer Mensch im Bus: Der Busfahrer. Ausnahmen davon sind:

  • Pinkelpausen des Busfahrers
  • Wechsel des Busfahrers sowie
  • die Existenz begabter, leider sträflich fehlgeleiteter Kinder, die sich morgens selbst im Bus zur Schule fahren.

Ersteres und zweiteres nimmt am Tag nur wenige Minuten in Anspruch, letzeres traue ich Kindern mit Katzen im Rucksack nicht zu. Zur Beinsumme addieren sich also noch 2 Busfahrerbeine.

Resümee: (7 + 7 × 7) × 4 × 7 × 7 Katzenbeine + 7 × 2 Kinderbeine + 2 Busfahrerbeine ergeben eine Gesamtmenge von unglaublichen 10992 Beinen im Bus!

Bei meinen Überlegungen stieß ich auf eine interessante Tatsache: Wenn wir annehmen, dass eine erwachsene Katze um die 5 kg, eine kleine Katze um die 2 kg, ein Schulkind um die 40 kg und ein Busfahrer um die 90 kg wiegt (ja, 90. Die Typen sitzen doch den ganzen Tag rum.), dann trägt der Bus ein Passagiergewicht von insgesamt 7 × 7 × 7 × 5 + 7 × 7 × 7 × 7 × 2 + 7 × 40 + 1 × 90 kg, was umgerechnet knapp 7 Tonnen entspricht, etwa so viel wie der Bus selbst wiegt.

Und das Fazit, das wir aus dieser Rätselaufgabe ziehen können? Busfahrer haben’s nicht leicht. Das Miauen von zweieinhalbtausend Katzen, der Platzbedarf von 49 Großraumrucksäcken, das ständige Genöle der Kinder - und das JEDEN TAG!?

Und nicht zuletzt ständig diese Leute mit ihren Taschenrechnern…

Bundeswettbewerb Informatik bwinf 2008-11-16T00:00:00+02:00 blinry Ich habe an drei Runden des Bundeswettbewerbs Informatik teilgenommen (in den Jahren 2009 und 2010). Hier möchte ich meine Lösungen veröffentlichen, vielleicht können kommende Teilnehmer daraus lernen. 2010 war ich außerdem Teilnehmer der Endrunde.

1. Runde des 27. BWINF1. Runde des 28. BWINF2. Runde des 28. BWINF

Screamie screamie 2009-08-17T00:00:00+02:00 blinry Screamie

Abi 09 logo abi09-logo 2009-05-02T00:00:00+00:00 blinry

Translation: “To hell with Pisa, it’s not our tower.” Was created for a T-shirt when I finished high school.

Ubucon 2008 logos ubucon-logos 2008-08-10T00:00:00+00:00 blinry

Facharbeit: Künstliche neuronale Netze knn 2008-04-04T00:00:00+00:00 blinry Im 12. Jahrgang schrieb ich meine Facharbeit zum Thema Künstliche neuronale Netze. Diese Arbeit stellte ich außerdem in einem Referat vor:

Facharbeit Referat

Freie Software: Eine Analogie freie-software 2007-05-07T00:00:00+00:00 blinry Mithilfe einer Analogie kann man sehr anschaulich erklären, was Freie Software ist. Es werden nur wenige alltägliche Elemente benötigt, an denen man jedoch viele Sachverhalte erklären kann. Gerade für technisch weniger Versierte sollte dieses Modell hilfreich sein.

  • Ein Kochrezept: Ein Rezept entspricht in diesem Modell dem Sourcecode, der “Sprache”, in der Programme verfasst werden.
  • Ein Koch: Das sind wir - man stellt sich vor, jeder von uns Computernutzern sei ein Koch.
  • Ein Gericht: Aus einem Rezept kann ein Koch ein fertiges Gericht zubereiten. Dies entspricht in der Computerwelt einem ausführbaren Programm. Erfreulicherweise kann der Koch dabei keine Fehler machen; Es hängt also nicht von der Erfahrung des Koches ab, wie gut das Gericht wird, sondern ausschließlich vom Rezept. Rezepte und Gerichte haben in dieser imaginären Welt außerdem die Eigenschaft, dass die enorm schnell und kostengünsig vervielfältigt werden können, denn Dateien kann man schließlich auch kopieren.

Nochmal zusammengefasst: Der Koch bereitet aus einem Rezept ein leckeres Gericht zu. Als nächstes könnte man fragen: Woher bekommt der Koch seine Rezepte?

Möglichkeit 1: Er erfindet es selbst. Das ist natürlich ein langwieriger und aufwändiger Prozess. Damit verhielte er sich so wie ein Programmierer, der seine eigene Software entwickelt. Möglichkeit 2: Er kocht nach einem schon existierendem Rezept. Genau hier kommt der Gedanke der Freien Software beziehungsweise Rezepte ins Spiel: Wenn etwa jemand, der einige Rezepte erfunden hat, daraus ein Kochbuch schreibt, können alle Anderen ein Rezept nachschlagen und selbst kochen.

Das mag wie eine Selbstverständlichkeit klingen, doch diesen grandiosen Gedanken muss man sich vor Augen halten, wenn man das Prinzip wieder in die echte Welt überträgt: Autoren von freien Programmen veröffentlichen den Sourcecode kostenlos und jeder kann ihn aus dem Internet, von CDs oder anderen Datenträgern beziehen und mit einem Computer in ein funktionsfähiges Programm übersetzen.

Das ein solches Rezept nun “frei” ist, bedeutet nicht nur Kostenfreiheit, obwohl das sicher auch eine wichtige Eigenschaft ist. Noch wichtiger ist die Freiheit, das Rezept beliebig an andere Köche weitergeben zu können. Auch das Gericht darf man weitergeben, wenn man etwa Freunde einlädt und jedem einen Teller Nudeln vorsetzt (aufgrund der schnellen Verdopplung ist das natürlich noch leichter). Weiterhin kann man ein Rezept natürlich auch verändern und nach eigenen Vorlieben anpassen. Erneut sei hier daran erinnert, dass alle diese Eigenschaften auch auf Freie Software zutreffen! Beispiele für grandiose Freie Software sind GNU/Linux, Mozilla Firefox oder

Schön und gut - klingt nach einer Menge positiver Eigenschaften. Doch ist das nicht alles irgendwie … selbstverständlich? Keineswegs! Die Welt ist voll von Köchen, die Geld mit ihren Kochkünsten machen wollen (Bill Gates etwa ist ein sehr prominenter). Das Ganze funktioniert bei ihnen so wie in einem Restaurant: Ihre Rezepte sind geheim und sie kochen hinter verschlossenen Türen. Das fertige Gericht wird dann gegen eine oft saftige Gebühr an den Tisch gebracht. Die Gäste in diesem Restaurant wissen weder, wie das Essen zubereitet wurde, noch was die Zutaten sind. Außerdem ist es fast unmöglich das Gericht selbst zu verändern, wenn es ihnen nicht schmeckt. Sie dürfen es auch keinesfalls kopieren, jeder Gast muss erneut bezahlen. Der Koch lacht sich dabei ins Fäustchen, denn wie wir wissen, können die Gerichte in diesem Modell fast kostenlos immer wieder verdoppelt werden. Zurück in die echte Welt! Für die meiste Software muss man heutzutage bezahlen. Man darf sie nicht studieren, nicht verändern, nicht weiterverbreiten und oft ist sogar die Benutzung eingeschränkt. Diese Art von Programmen nennt man proprietär oder unfrei. Windows und die Microsoft Office Suite sind bekannte Beispiele. Das war nicht immer so - vor einigen Jahrzehnten, als Computer noch in den Kinderschuhen steckten, war jedes Programm frei. Bill Gates war dann einer der ersten, die anfingen, für das sehr kostengünstige Kopieren von Software Geld zu verlangen.

Erwähnen sollte man noch Programme, die zwar kostenlos benutzbar sind, jedoch ebenfalls Einschränkungen in ihrer Benutzung haben - sogenannte Freeware. Diese muss man ganz deutlich von Freier Software angrenzen. Die Analogie wäre ein Mann mit Bauchladen, der kostenlos Fritten verteilt. Man muss zwar nichts bezahlen, aber alle anderen oben genannten Nachteile bleiben erhalten.

Aufruf: Benutzt Jabber! benutzt-jabber 2006-12-18T00:00:00+00:00 blinry Hallo! Ich bin der Sebastian! Und ich erklär euch heute, wie man sich übers Internet unterhalten sollte und wie nicht.

Ihr kennt doch alle ICQ. Dieses bunte Programm zum chatten. Haben eure Freunde ja auch. Aber, was ihr vielleicht nicht wisst: ICQ ist sehr, sehr böse. Kann man hier alles nachlesen. Kurz gesagt, dürfen die Betreiber von ICQ alles, was ihr euch dadrin so schreibt, speichern und mitlesen. Ihr verliert all eure Rechte an dem, was ihr schreibt. Theoretisch dürften die eure geheimsten Gedanken auch veröffentlichen. Klingt komisch? Ist aber so.

Ist natürlich doof. Kann man aber was machen! ICQ, MSN und die anderen bösen Protokolle sind ja nicht die einzigen fürs Instant-Messaging! Da gibts nämlich auch noch was namens “Jabber”. Das ist ein freies Protokoll, da darf niemand mitlesen und so. Ein guter Client ist Pidgin. Kann man ganz einfach installieren und einrichten. Ist ganz ohne nervige Werbung. Und wenn ihr jetzt sagt “Das haben meine Freunde aber nicht!”, dann erzählt denen doch einfach davon und nennt ihnen die oben genannten Argumente gegen ICQ! Für die Übergangszeit könnt ihr auch mit Pidgin euer böses ICQ-Konto weiterbenutzen.

Auch ich finde das ganz schön blöd, dass so wenige Jabber benutzen. Aber vielleicht kann ich ja hiermit dazu beitragen, es bekannter zu machen. Denn jetzt wisst ihrs ja besser. So bleibt mir nur, ein letztes Mal zu sagen: “Benutzt Jabber!”

Und nächste Woche erzähle ich euch, welche Browser ihr verwenden solltet und welchen nicht!


Wenn ihr dieser Anleitung folgt, habt ihr in etwa 10 Minuten einen eigenen Jabber-Account. Mit dem Programm dazu, Pidgin, könnt ihr sowohl die Vorzüge von Jabber nutzen, aber auch mit ICQ weiterchatten.

  1. Auf Pidgin herunterladen (10,9 MB).

  2. Das Programm installieren. Normalerweise reicht es, bei der Installation immer auf “Weiter” zu klicken.

  3. Beim ersten Start öffnet sich das Konten-Fenster. Dort klickt man auf “Hinzufügen”. Als Protokoll wählt man XMPP, das Jabber-Protokoll. Nun sucht man sich einen schönen Benutzernamen und ein Passwort aus. Die anderen Einstellungen kann man so lassen, wie sie sind. Bequemerweise klickt man schließlich noch auf “Passwort speichern”, macht ein Häkchen bei “Konto neu anlegen” und klickt zweimal auf “Registrieren”. Kommt die Fehlermeldung “Konflikt” hat sich schon jemand den Benutzernamen ausgesucht, man wiederholt die Prozedur dann einfach mit einem anderen Namen. Das wars schon! Das neue Jabber-Konto ist einsatzbereit!

Nun kannst dich mit einem Klick auf das Kästchen vor dem Konto anmelden. Adde alle Jabberaner, die du kennst (= mich, unter Buddys->Buddy hinzufügen.

Nun kannst du noch das alte ICQ-Konto hinzufügen: Wieder im Konten-Fenster auf “Hinzufügen”, als Protokoll ICQ (ist Pidgin nicht herrlich selbsterklärend?), als Benutzername deine ICQ-Nummer, Passwort wie gehabt, Speichern. Deine alte Kontaktliste wird übernommen.

Das war’s! Viel Spaß beim Chatten! (Und empfiehl Jabber weiter!)

Kalauer-Sammlung kalauer 2005-09-16T00:00:00+00:00 blinry
  • Sagt die Null zur Acht: Schöner Gürtel!
  • Warum ham die Araber ka Brot? Weils ka Mehl haben!
  • Treffen sich zwei Jäger: Beide tot!
  • Ich gehe nicht zu seiner Beerdigung, er geht auch nicht zu meiner…
  • Was ist ein Keks unter einem Baum? Ein schattiges Plätzchen!
  • Was sind die Steigerungsformen von imposant? Im Hintern Kies, im Arsch Beton!
  • Ich hasse Leute, die mitten im Satz
  • Der kürzeste Trabbi-Witz: Steht’n Trabbi auf’m Berg…
  • Gestern hab ich bei den Weight Watchers angerufen - hat keiner abgenommen!
  • Treffen sich zwei Fische: “Hi!” - “Wo?”
  • Fällt ein Kuckuck ins Meer. Taucht ein Hai auf. Sagt der Kuckuck: “Hi!”. Sagt der Hai: “Kuckuck!”.
  • Was ist weiß und stört beim Essen? Eine Lawine!
  • Was ist weiß und tut weh, wenn man es ins Auge kriegt? Ein ICE!
  • Was ist weiß und steht hinterm Baum? Eine schüchterne Milch!
  • Ein Schneemann zum anderen: Riechst du auch Karotten?
  • Warum gehen Fliegen nicht in die Kirche? Sie sind Insekten!
  • Zwei Kanibalen essen einen Clown. Meint der eine: “Schmeckt irgendwie komisch.”
  • “Kellner, bitte Zahlen!” - “Fünfzehn, achtundsiebzig, elf…”
  • Wie heißt ein Bumerang, der nicht zurückkommt? Stock.
  • Ober: “Wie fanden Sie das Schnitzel?” Gast: “Rein zufällig unter dem Salatblatt!”
  • Pessimist: “Schlimmer geht’s nicht…” Optimist: “Doch!”
  • Was ist der Unterschied zwischen einem Ingenieur und einem Bauingenieur? Die einen bauen Waffen, die anderen Ziele.
  • Kundin ruft beim Support an: “Mein Monitor ist kaputt.” Support: “Ist er denn an?” Kundin: “Ja.” Support: “Dann machen sie ihn mal aus.” Kundin: “Oh, jetzt geht er.”
  • Brechstangen sind aus Diebstahl gemacht.
  • Der Pessimist: Das Glas ist halb leer! Der Optimist: Das Glas ist halb voll! Der Ingenieur: Das Glas ist doppelt so groß, wie es eigentlich sein müsste!
  • Fünf von vier Leuten können nicht rechnen.
  • Das Leben ist eine tödliche Krankheit, die durch Geschlechtsverkehr übertragen wird.
  • Ein Bahngleis ist ne harte Droge: Ein Zug und du bist tot…
  • Liebe ist nur ein Wort. Quark auch.
  • Neulich hab ich mal einen Chemie-Witz erzählt. Keine Reaktion.
  • Meine Freundin meint, ich wäre neugierig… zumindestens steht das in ihrem Tagebuch.
  • Wenn Atheismus eine Religion ist, dann ist “Aus” auch ein Fernsehsender.
  • Kann ich mein Leben mal kurz speichern und was ausprobieren?
  • Bevor man stirbt, zieht das ganze Leben an einem vorbei. In Echtzeit.

  • A balanced diet is a chocolade in both hands.
  • If I agreed with you, we’d both be wrong.
  • I stepped on a corn flake - now I’m a cereal killer.
  • If this sentence is true, then Santa Claus exists.
  • ]]>
    Kunstprojekt "Babel" babel 2005-09-06T00:00:00+00:00 blinry Diese Fotoserie entstand in der zehnen Klasse. Es stellt in achtzehn Bildern zwischenmenschliche Beziehungen mit Büchern dar.

    Ich habe auch eine Reflexion über die Entstehung geschrieben.





































    Simpsons-Zitate simpsons-zitate 2005-08-22T00:00:00+00:00 blinry Zitate aus der gelbsten Fernsehserie der Welt. Gesammelt während meiner intensiven Simpsons-Phase um 2005 herum.

    Homer: “Tut mir nichts, ich hab Frau und Kinder! Tötet die!”

    Grampa: “Ich mach jeden Test mit, den ihr wollt: Sehtest, Hörtest, Erinnerungstest, Erinnerungstest, …”

    (Dokumentarfilm): “Mach dir nichts vor, Jimmy. Wenn eine Kuh die Möglichkeit hötte, würde sie dich auch essen und alle, die du lieb hast!”

    (Krusty tritt als Vampir verkleidet auf): “HEYHEY! Today I’m going to SUCK!” (Pause) “… your blood!”

    (Etwas explodiert)

    Wiggums: “Puuh, das war knapp! Gut, dass es in dem qualmenden Krater gelandet ist!”

    (Marge betet und ein Wunder geschieht)

    Homer: “Gut Marge, er ist drauf reingefallen!”

    Homer: “Bart, Lisa, geht auf eure Zimmer und verprügelt euch selbst!”

    Bart: “So ein fauler Vater…”

    Marge: “In den meisten Serien wird leider viel zu viel wiederholt”

    Smithers kommt reingestürmt: “Maggie hat schon wieder Mr. Burns umgebracht!”

    Lisa zu Milhouse: “Sei nicht traurig, du hast noch dein ganzes Leben vor dir!”

    Milhouse: “OH NEIN!! WÄHÄHÄ!!”

    Moe: “Seht euch nur die Sterne an… So viele kleine Lichter, die im Grunde niemandem nützen…”

    Homer: “So eine dumme Topfpflanze! Steht einfach hier rum und vertrocknet!”

    Homer: “Sieh dir nur diese Typen an, mit ihren Pelzmänteln und komischen Hüten!”

    Marge: “Homer, das sind Hirsche!”

    Homer: “Na und? Ich hasse sie trotzdem!”

    TV-Spot: “Bürgermeister Quimby setzt sich für Drehtüren an Gefängnissen ein und hat sogar den Massenmörder Tingeltangel-Bob freigelassen! Kann man einem solchen Menschen trauen? Wählt Tingeltangel-Bob!”

    Homer: “Oh nein, das jüngste Gericht! Schnell, schafft Bart aus dem Haus, bevor Gott kommt!”

    Chief Wiggums: “Hey, das ist Tierquälerei!” (lächelt freundlich) “Haben Sie eine Genehmigung dazu?”

    (Nach Itchy und Scratchy)

    “Dieser Film enthielt äußerst gewaltsame Szenen und hätte nicht von kleinen Kindern gesehen werden dürfen”

    Wiggums: “Ihr Rücklicht hat ‘nen Wackelkontakt, das blinkt beim Abbiegen”

    Homer: “Hm, wie bestraft dich deine Mutter normalerweise?”

    Bart: “Sie zwingt mich, Bier zu trinken”

    Homer: “Oh nein, wir haben Mr. Burns umgebracht! Mr. Burns wird bestimmt sauer sein!”

    Homer: “Kommt, wir gehen nach Hause!”

    Lisa: “Wir sind zuhause…”

    Homer: “Das ging aber schnell!”

    (Homer testet eine Pistole und fuchtelt damit herum)

    Verkäufer: “He, nehmen Sie sich in acht!”

    Homer: “Ich brauch mich nicht in acht zu nehmen, ich hab ne Waffe!”

    Willie zu Edna: “Es würde mir konvenieren, dienstagabend mit Ihnen zu dinieren”

    Schreibt in seinen Kalender: “Schlampe bumsen”

    Grampa: “Ich möchte in Würde sterben, zum Beispiel beim Ausrutschen in der Dusche! Und dann findet mann mich zwei Wochen später so aufgequollen, dass man nicht weiß, bin ich ein Mann oder ein Sofa?”

    Flanders: “Ich bin Flanders, aber meine Freunde nennen mich Ned”

    Homer: “Hallo, Flanders”

    (Filmleute malen einem Pferd Flecken auf)

    Martin: “Entschuldigung, aber warum nehmen Sie keine echten Kühe?”

    “Kühe sehen im Film nicht wie Kühe aus, da muss man Pferde nehmen”

    “Und was machen Sie, wenn ein Tier wie ein Pferd aussehen soll?”

    “Ach, da binden wir meistens nur ein paar Katzen zusammen”

    (Bart ist taub)

    Skinner: “Ah ja, ein Klassiker, genauso wie der blinde Bart, Rollstuhl-Bart, der schwangere Bart und mein persönlicher Favorit, Eisenbahnschwellen-Bolzen-durch-den-Kopf-Bart”

    Zeitungstyp: “Unsere Zeitungen enthalten einen gewissen Prozentsatz recyceltes Papier!”

    Lisa: “Und welchen?”

    “Null! Null ist auch ein Prozentsatz!”

    Homer: “If an emergency goes off, there are earplugs in the top drawer.”

    [Ethiopian resautaurant] Lisa: “They’re using pancakes as spoons.” - Bart: “Ooh, let’s see what else they do wrong!”

    Bart: “Heh, heh, we totally wasted his time!” - Homer: “And ours!”

    (Psychologist) “So, what I understand from our phone conversation, you have a very poor service provider.”

    “Tonights Simpsons episode was brought you by… the number e. Not the letter, but the number, whose exponential function is the derivative of itself.”

    “America has so many enemies: Iran, Iraq, China, Mordor, …”

    Lisa, on walkie talkie: “Roger.” - Bart: “Name’s Bart.”

    Was man alles mit einem Backstein machen kann backstein 2004-06-11T00:00:00+00:00 blinry

    Vor vielen Jahren gingen wir im Klassenforum der 9c der Frage nach, was man alles mit einem Backstein machen kann. Hier die gesammelten Ergebnisse!

    1 Gegen Türen werfen
    2 Drauf sitzen
    3 aus dem fenster werfen
    4 papier drumm wickeln
    5 gegen Bauch werfen
    6 gegen Kopf werfen
    7 In eine Menschenmenge werfen
    8 Versuchen zu essen
    9 Ein stück von abschlagen
    10 Cd auf den boden legen und stein durff werfen
    11 Auf stifte werfen
    12 Auf mäuse werfen
    13 auf mäuse (pc) werfen
    14 auf tastaturen werfen
    15 auf bildschirme werfen
    16 gegen puter werfen
    17 versuchen mit dem kopf in der mitte zu zerbrechen
    18 draufstellen
    19 in die luft werfen
    20 in die luft werfen und nicht weggehen
    21 in einen bratwürstchen stand werfen
    22 verkleiden als ein würstchen und dann verkaufen gg
    23 einen bieba butzemann enthüllen und drüber stülpen
    24 ein haus bauen
    25 eine mauer bauen
    26 ein turm bauen
    27 in baugruben schmeißen
    28 gegen wände schmeißen
    29 auf den boden schmeißen
    30 arbeitern gegen kopf werfen
    31 Tiere abwerfen
    32 in mülleimer schmeißen
    33 in brennende mülleimer schmeißen
    34 gegen laternen schmeißen
    35 gegen litfaßsäulen (scheiß wort) werfen
    so jetzt macht ihr mal weiter!!
    so viel Zerstörung...
    ok, geb ich auch meinen senf dazu
    36 gebratener Backstein mit Weißbrot
    37 gekochter Backstein mit Schnitzel und Pilzsoße
    38 mit Käse überBACKener Backstein (muhaha)
    39 Backsteinauflauf
    40 Kartoffeln mit Backsteinsoße
    41 Backsteinpudding mit heißen Kirschen
    42 Backsteinpuffer mit Apfelmus
    43 gedünsteter Backstein mit Johannisbeeren
    44 und die Spezialität des Hauses, Backsteinkuchen mit Zuckerguss und 
    Schlagsahne auf Wunsch
    45 in den Kühlschrank legen und Eltern erschrecken
    46 mit in die Schule nehmen und damit angeben
    47 in den Garten pflanzen und warten ob ein Backsteinbaum wächst
    48 in der Handtasche mitnehmen
    49 in der Schule damit rumprahlen
    50 viele stapeln und dann wieder durcheinanderschmeißen
    51 kleinen Geschwistern zum Spielen geben
    52 Tauschbörse eröffnen
    53 ins Diskettenlaufwerk schieben
    54 als Glücksbringer mit zu Mathearbeiten nehmen
    55 sich damit unterhalten
    56 bei Ebay versteigern
    57 bis in die Erdatmosphäre pfeffern
    58 zerkrümeln und Feinden ins Essen streuen
    59 Gedichte drauf schreiben
    60 ins Vakuum stellen und gucken, was passiert
    61 verschenken
    62 filmen
    63 fotografieren
    64 ein abstraktes Kunstwerk draus machen
    65 anbeten
    66 Toiletten damit verstopfen
    67 in Briefkästen der Nachbarschaft werfen
    68 "Backstein" in Englisch, Französisch, Spanisch, Elbisch und
    Zamonisch übersetzen
    69 damit schimpfen
    70 lieb haben und damit kuscheln
    viel Spaß beim Nachmachen
    woho, du hast ehrlich die besser fantasie, meine besteht nur aus 
    zerstörung! Muhahahahahaha!! :D
    71 an Stromkreis anschließen
    72 erhitzen
    73 abkühlen
    74 mit radioaktiver Strahlung beschießen
    75 im Teilchenbeschleuniger gaaaaanz schnell beschleunigen
    76 in den Weltraum schießen
    77 mit einem Thermoelement die Temperatur des Backsteins messen
    78 würfeln und damit Wahrscheinlichkeitsrechnung machen
    Kann man mit einem Backstein vielleicht auch mathematisches machen? Zum
    LGS lösen taugen sie jedenfalls nicht...
    man könnte doch auch die kanten messen und die oberfläche und das
    volumen ausrechen! ist doch mathematisch oder?!
    79 Höhe mal Breite mal Tiefe ausrechnen
    80 Zwei mal Höhe mal Tiefe und zwei mal Höhe mal Breite und Zwei mal
    Tiefe mal Breite ausrechnen
    und noch was naturwissenschaftliches
    81 Teilchenmenge ausrechnen
    81 wiegen
    82 Zusammensetzung untersuche Massenproduktion
    85 verkaufen
    da komme ich von der Wissenschaft ab... Jetzt was revolutionäres
    86 auspressen und
    87 Treibstoff daraus herstellen
    88 verstrahlt als Lichtquelle nutzen
    89 und sowieso als Energiequelle
    90 sehr viele verbrennen um einen Klimaumschwung zu erzeugen
    91 wenn die Polkappen abschmelzen aufpumpen und zusammenbetonieren um
    Boote herzustellen
    92 damit Wohnungen unter der Wasseroberfläche bauen
    93 oho; als neue Währung einführen (nennen wir sie doch "Backstein")
    94 alle alten Gebäude vom damaligen Land abreißen und reich werden
    (muhahaa, daher kommt "steinreich" :)
    95 Raumschiffe daraus bauen und zu einem unverseuchten Planeten fliegen
    jetzt werden wir wieder primitiv
    96 möglichen Außerirdischen an den Kopf werfen
    97 auf deren Gebäude und Technologien werfen
    98 neue Städte daraus aufbauen
    99 den Backsteintag als Nationalfeiertag einführen
    100 den Backstein als eigenständiges Wesen verehren
    vergessen habe ich jetzt
    98,1 Neue Längen-,
    98,2 Gewichts- und
    98,3 Volumeneinheiten auf Grundlage der Länge, des Gewichts und des
    Volumens eines Backsteins einführen
    98,4 ärgern, das früher alles viel einfacher war und deshalb alle 
    existierenden Backsteine
    siehe 20 in die luft werfen und nicht weggehen
    Boah 100 erreicht! Respekt!
    da gibt es bestimmt noch viel mehr!!!=)
    101 Stefan an den Kopf werfen (von Frau Evers)
    und meine Ideen a la David:
    102 David an den Kopf werfen
    103 Henni an den Kopf werfen
    104 Möhrchen an den Kopf werfen
    105 Schmiddi an den Kopf werfen
    106 Maurus an den Kopf werfen
    107 Hendrik an den Kopf werfen
    108 Benni  an den Kopf werfen
    109 Gerrit an den Kopf werfen
    110 Daniel an den Kopf werfen
    111 Jasper an den Kopf werfen
    112 Joachim an den Kopf werfen
    113 Lukas an den Kopf werfen
    115 Jan an den Kopf werfen
    116 Simon an den Kopf werfen
    117 Tim an den Kopf werfen
    muuhaha; jetzt gaaaanz weit werfen:
    118 Peer an den Kopf werfen
    119 Kevin an den Kopf werfen
    Keine Gewalt gegenüber Fastfrauen.
    Man kann auch leckere Sachen damit machen:
    120 Essen
    121 Zerbröckeln und als Brause trinken
    122 Kochen
    123 Braten
    124 Erwärmen bis es flüssig wird und dann trinken
    125 Erwärmen bis es gasförmig wird und dann einatmen
    etc. (usw.)
    126 weihnachtsgeschenk
    127dem weihnachtsmann an den kopf werfen
    128 in geschenkpapier einwickeln
    129 als kerzenständer nutzen
    130kekse drauflegen!!;)
    etwas aus dem sportlichen bereich:
    131 handstand drauf machen
    132 Handstandüberschlag drauf machen
    133 handstand drüber machen
    134 Handstandüberschlag drüber machen
    (sehr einfallsreich ;))
    135 Mit skatboard fahrn
    136 kickflip mit machen
    137 Eine Halfpipe mit runter fahren
    138 Zwei jeweils unter einen Fuß schnallen und mit Inliner fahren
    139 damit an einer rail grinden
    140 versuchen irgendwo aufzuhängen und einen aufschwung machen
    141 wenn klappt umschwung
    142 unterschwung dann umfallen
    143 dann den stein auf den kopf bekommen
    144 als boxsack gebrauchen(kann möglicherweise wehtuen, nicht machen)
    145 Auf einen tich legen und hocke drüber machen
    146 drüber hüpfen
    147 drauf seilspringen
    148 drauf arobic (wusste bich wie's geschrieben wird) machen
    149 Rolle drauf machen
    150 Handstandabrollen drau machen
    suuuuper ideen! eine übertrifft die andere! für manche übungen brauchst
    du aber einen gaaaanz großen stein...
    so langsam wird dieser backstein lästig... versuch mal ihn
    151 in Scheiben schneiden
    152 in eine Kanone stopfen und wegschießen
    153 ertränken
    154 einfrieren
    155 vergraben
    156 grillen
    157-172 mit dem Blaster, der Bl, der Lavapistole, dem Minigeschützturm,
    der Klingenpistole, dem Multiwurfstern, dem Lancer, dem Blitzgewehr,
    dem Infektor, dem Schicksalsagenten, dem Zoomer, der Bananenpistole,
    dem Vernichter (keine Lust mehr) und der N48 kaputtmachen
    173 in einen Lavasee werfen
    174 sprengen
    175 implodieren lassen (keine Ahnung, wie das gehen soll)
    176 als Dummy benutzen
    177 an die Hochspannungsleitung anschließen
    178 in die Streckbank spannen (ja, und kurbeln)
    179 versuchen, Daumenschrauben anzulegen
    180 auf den elektrischen Stuhl mit ihm!
    181 werft ihn ins Feuer!!
    aber ich soll mich nicht von meinen Gefühlen leiten lassen
    182 Bioarbeit schreiben lassen
    183 ihm die Bioarbeit wiedergeben
    184 ihn die Bioarbeit berichtigen lassen
    185 ihm die Bioarbeit mit Fehlern wiedergeben
    186 ihn die Bioarbeit nochmal berichtigen lassen
    187 im finsteren, bitterkalten Wald aussetzen
    188 ihn Rotkäppchen als Geschenk für die Großmutter mitgeben
    189 ahaaaa: vom bösen Wolf fressen lassen
    190 in ein Reh verwandeln
    191 in den Backofen schubsen
    192 aus dem achten Stock fallen lassen
    193 Stücke abschlagen
    194 Stücke abraspeln
    195 Stücke abschmirgeln
    196 Stücke abfeilen
    197 in einen aktiven Vulkan werfen
    198 in einen aktiven Wirbelsturm werfen
    199 nach einem Erdbeben in eine Erdspalte werfen
    -=:[200]:=- über Millionen Jahre hinweg von Bakterien zersetzen lassen
    ob wir den nochmal wiedersehen?
    201 per modernster technik wieder rematerialisieren
    202 ihn fragen wie es vor millionen jahren mal war
    203 ihn ein geschichtsbuch schreiben lassen (was den titel "Geschichte 
    eines (psychisch und physisch gequälten) Backstein" trägt)
    nein ahh, uhuhuaarrrrrrrrgg, wahhhhhhhhhh, 203 eine ungrade zahl, was
    soll das? hm? sach ma? was fällt dir eigendlich ein?ß hm? erklär mir
    Etwas aus dem nützlichen Bereich
    204 als türstopper benutzen
    206 lochen und abheften, dafür, dass man ihn mal irgendwann wieder
    207 rundmachen und als kunstobjekt bezeichnen
    208 dünn fräsen und als klopapier benutzen
    209 dünn fräsen und taschentücher draus machen
    210 klein hacken und als kleine kekse auf dem weihnachtmarkt verkaufen
    211 in ein brötchen packen, ketchup drauf und als 1/2 kilo bratwurst
    auf dem weihnachtmarkt verkaufen
    212 zu pulver machen und als tütensuppe verkaufen
    an david: ich galube briefbeschwerer war schon dabei!!!
    haha selber reingefallen, dann wäre es jetzt keine ungerade zahl
    danke jasper! :D
    213 als Erkennungszeichen für einen geheimen Bund benutzen
    hey was soll das :'C  jetzt bin ich ganz traurig und schreib was da
    214 bei einer Versteigerung versteigern(ist nicht ebay!!)
    hmm. ist 214 eine schöne zahl? huch, ich hab nichts gesagt, wir wollen
    ja die backsteingötter nicht verärgern... backstein drüber! ahaaa:
    215 damit die Tafel wischen
    216 damit waschen
    217 214 Backsteine abzählen und finden, dass das keine schöne Zahl ist
    218 Rätselheft machen:
    219 Was ist schwer, schmeckt gut, ist leicht zu zerstören und eine
    wirksame Waffe?
    220 Suchsel
    Such das versteckte Wort:
    221 Führe den Backstein zum Mörtelsack!
    Tipp: Geh nicht den direktesten Weg!
     _____    ###########################################   /    \
    |\ ____\                           #                   |     |
    \|_____|  ##################       #      ###########  |_____|
                               #              #
    Außen rumgehen ist gemogelt!
    222 Wie kommt man auf die Idee, zu fragen, was man alles mit einem
    Backstein machen kann?
    - Man bestraft ein Geburtstagskind damit.
    werden jetzt manche sagen.
    Aber David kann uns die Geschichte erzählen (falls er sie noch weiß)

    David hat die Geschichte im Forum nicht mehr erzählt, wenn ich mich recht entsinne, wurde sein Bruder mal an dessen Geburtstag im Geschichtsuntericht mit dieser Aufgabe betraut. Whatever. Unsere Aktionen im Forum haben gerockt! :-)

    The Mork mork 2001-01-01T00:00:00+00:00 blinry One my oldest digital works I still have. A stop motion video, made around 2001, filmed with the Lego Camera that came with the Lego Mindstorms Vision Command kit!

    The content was probably inspired by the Plonsters. The video file is named Mork.avi, so I assume that was supposed to be the character’s name!