Here’s the cheat sheet, with the entire grammar on one side, and the entire vocabulary on the other side:
If you want to modify it, you can also download the ODT file. You’ll need the fonts Fira Sans and Roboto.
In 2022, jan Sa (with the help of jan Deni, jan Ke Tami, jan Kekan San and jan Seli) made an updated version: https://jansa-tp.github.io/cheatsheet
Here’s a changelog:
A number of people kindly translated the cheat sheet! More translations very welcome!
This map shows that first section of the trip. I’m taking the “Lake Shore Limited”, an overnight train. Will arrive in Chicago in around 20 hours, and amazingly, that’s the only time I’ll have to change trains!
We’re first going north, following the Hudson river.
The seats are big and comfy! But the train seems to be booked out.
A train attendant asked everyone where they’d get off, and put little notes over our seats – probably to wake up people who have to get off in thr middle of the night.
Another picture of the Hudson river! Pretty light!
Surprise: We’re stopping in Albany for a full hour! Maybe to connect with a train from Boston?
So now I can show you my train from the outside:
The connecting train was delayed, so now we also are! 🙃
Making our way out of Albany, now heading westwards!
I just realized that the entire trip from coast to coast will be 5000 kilometers long.
That’s a lot of kilometers.
You could also say: Five megameters!
(3150 miles, for you folks with non-SI units :P)
It’ll take three nights overall. I’m sooo hyped! 😆
When I told @piko about this trip, they reminded me of the time I got that book about hypersonic trains from the library, a hypothetical train system designed for 7200 km/h:
https:// chaos.social/@blinry/111495370 153260987
Good morning!
Oof, didn’t sleep much… the AC in the train is set ridiculously cold, the ride is very shaky, and there’s nothing to lean your head against…
But we made it through a brief section of Pennsylvania and through Ohio, and are about to cross over to Indiana!
Hello Chicago! :)
Most important thing to do during the stopover: Get more vegetables for the second stretch of the train trip!
But not these. One is not a vegetable, and I’m not sure if I can prepare the other one?
Visited Chicago’s Climate Action Museum, and one of its central messages is: “Stay home!”
As someone who loves to travel, who takes so much joy from immersing myself in places, cultures, landscapes I’m not used to, this leaves me confused and conflicted… :/
I’ve gone though a similar process when I started eating a vegan diet.
The last question it came down to was “Is my personal enjoyment of the taste of animal products more important than the suffering of those animals?” – and my personal answer was “no”. Especially when it’s as easy as it is these days to replace those products.
Maybe I could substitute travel experiences, as well? 🤔
Anyhow. Here’s the route for the second part of my trip!
Seat61 calls the California Zephyr “one of the great train rides of the world”.
It’ll take 51 hours, over the course of two nights, and, eventually, bring me to @bangbangcon !
Here we go!! Boarding!
I’m treating myself to a “roomette” with an actual fold-down bed on this train.
Here’s my little home for the next 2.5 days!
Leaving Chicago! 👋
Here’s a tour of all the features of my li’l roomette!
There’s two seats like this, opposite of each other. Using the handlebar below it, you can recline the back a bit, like in an overnight bus.
A plastic table between the seats fold out. It seems to have an integrated chess board! :O
Control panels next to the head rests allow you to set the air temperature, and the volume of the announcements.
Sadly, the other “music channels” are silent. You can also set the ceiling lights to bright, dim, and off. Very handy.
I also have been granted the power to summon a train attendant! Haven’t used it yet.
Speaking of lights, there are at least 5, which can be controlled individually, for a very customizable lighting experience!
There’s a trash can, a mirror, coat hangers, and tiny cute corners for tiny cute towels! 😆
I didn’t notice this at first, but under the ceiling, there’s a ready-made fold-down bed, with straps to make sure you don’t fall out!
And the lower seats also can be collapsed flat, and there’s an extra mattress to put on top; so this room can be used by two people!
~ End of the room tour ~
I feel a bit like in a space ship! The room is compact and functional, but I really like it.
What I don’t have here is a toilet – there are shared toilets and showers in the hallway. I’ll report! And I also have the rest of the train to explore!
We have just crossed the Mississippippi River, which marks the state border between Illinois and Iowa! The train went extra slow, not sure whether for safety reasons or for photo op reasons! :P
Slept really well! Woke up in Denver, Colorado, where we’re making an hour-long refueling stop!
Took a shower in one of the little shower cabins!
And decided to go on a little walk. You can already see the Rocky Mountains from here!!
Let’s hope that I don’t miss my train! 😅
Headed into the mountains now!
Impressive to see how quickly the Great Plains gave way to this very different kind of landscape! :O
We’ve passed the Moffat Tunnel, and are now snaking our way alongside some very pretty creeks!
We made another li’l stop earlier, so I can show you my train from the outside! :)
And here’s more of the interior! Coach section, panorama lounge, and diner!
The diner car is where passengers with sleeper tickets get three free meals per day! And they do have vegan options! \o/
It’s interesting to meet different kinds of people on the train:
Yesterday, I had dinner with a polite nurse and her mum yesterday, and we were joined by a French guy, who kept drinking wine and talking about his many great trips and friends… :/ Not the kind of conversation I’m into…
For lunch today, I had better luck: I was seated with a retired genetic researcher, whom I inmediately liked! He has a refreshingly positive perspective on scientific progress.
The landscape has changed yet again, and is now much more cliff-y and sandy.
That’s Mt. Garfield on the last picture!
We’ve stopped at Grand Junction, on the edge of the Colorado Plateau, a “high desert”. It’s hot all of a sudden, 90 °F/32 °C!
Tumbleweed!!
And we encountered the California Zephyr going in the other direction! :)
Seing plenty of things for the first time on this trip! Amish people. A forest fire. Eagles that aren’t in captivity. A desert!
Pictures of the Colorado Plateau! It’s vast, much more than I had imagined.
What’s going on at Green River? Wrong answers only!
By the way, I lied to you! I’m not going to San Francisco directly. This train ends in Emeryville, close to Oakland.
I’ll then make my way South, to Santa Cruz, where @bangbangcon takes place! (You can still get pay-what-you-want online tickets!)
It’s only after !!Con that I’ll explore San Francisco for a few days. It’s my first time there! Any recommendations for what to see/eat/do there?
Also, does anyone of you live in San Francisco? I’ll be around from Monday to Friday – if someone would enjoy (and have time) to meet up and do a little city exploration together, that could be really fun!
Feel free to drop me a DM! 📬
Whattt! Just when I thought it couldn’t get any better! 🌈
(That was yesterday in Utah.)
At this point, we’ve made it through Nevada, and just entered California! Trees are starting to appear again!
First palm trees as we’re descending Sierra Nevada!
Almost there!!
And there it is: The skyline of San Francisco!
And the Cloudy Gate Bridge! ✨
This is the final stop of my train.
I made it!! What an adventure!
Feeling a bit sad as I watch my train drive away… :/ It has been my home for the past days!
This was such a humbling, thrilling and inspiring trip! Thanks for following along, it was a huge joy to share it with y’all!
Might post some more reflections over the next days, but for now:
~ End of thread ~
]]>And indeed, the vegan cheese that’s available in supermarkets is often… not great so far.
So I wanted to show you how to make a simple, quick & cheap cheese from cashews! It’s tangy, savory, and has lots of protein!
This is what we’ll need:
This time, I used distilled vinegar concentrate, with you need to dilute 1:4 with water to get to an acid content of 5%.
But I’ve also used rice vinegar in the past. Any other vinegar should work, as well.
Put all ingredients (except the pepper) in a blender.
You could also use an immersion blender, maybe you’d need to stir it up a couple of times with a spoon.
Blend until you get a consistency like crumbly ice cream with chunks! :D
The trick here is not to blend too much, or let it get too hot – otherwise, the result will be more like a cream cheese.
So put the blender on a rather slow speed, take breaks, or stir it in between.
Almost done! Shape it into a wheel, and try not to snack to much, because it’s already so delicious at this stage!
Finally, I like to roll the cheese in roughly-ground black pepper, which adds an extra kick to it!
If you’d like a less intense version, you can use other herbs or spices – I’ve once used dill, and that was very tasty! Oregano could also be nice.
Put the cheese in plastic wrap, and chill it in the fridge for a few hours – it will firm up quite a bit.
Done! :) If you try it, let me know how you like it, and send pictures!
This is a style of cheese alternative that I first found in Spain. It doesn’t try to imitate cheese made from animal milk, and instead does its own (delicious) thing.
]]>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!
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!
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!
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.)
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 meters. 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:
And for higher frequencies, I used the tiny screw-on antennas from the kit:
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!
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!
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
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
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. 🙅
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”.
And it worked! \o/ I decoded the signal using the software SDRangel. Fascinating! I saw some big & small airplanes, and even a helicopter!
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).
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.
The Federal Highway Research Institute publishes an Excel table, where I could look up that this is a town in Lower Saxony!
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! 😁
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!
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.
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.
At 433 MHz, there’s a frequency band for “industrial, scientific and medical” applications. And wow, there was quite a lot of activity nearby!
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?
Later, an “Interlogix Security” device also appeared, reporting “closed switch states” :O
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
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…
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.
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
I was super excited when I first received a signal from a NOAA satellite! 🛰️
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.
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
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”!
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!
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+.)
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!
I decided to go on a field trip, using trains and my bike.
I was following the tracker. The balloon popped earlier than predicted, and I frantically changed travel plans!
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.
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!
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
SDRangel can create a map automatically:
I started the day by building an antenna!
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)…
…directly attached it to the center of another SMA connector…
…and draped it all around my room!
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 :)
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!
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!
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.
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
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
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!
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 short-wave.info, 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:
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.
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…
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!
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!
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.
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.)
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?
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
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.
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.
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.
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
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!)
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…
Friends later suspected that this effect is due to weak batteries affecting the crystal in the sending devices, or temperature changes.
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:
3MV MAX VALIER SAT ... MANFRED ES CHRISTA FUKSE 73 ... II3MV ...
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!)
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:
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:
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…
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 https://skyvector.com!
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!
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!
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.
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)! 🎉
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
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
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
Here’s some things that I haven’t tried or that haven’t worked:
Also, doing things with Wi-Fi/Bluetooth/Zigbee could be fun, but I’d need a more expensive receiver for those frequencies.
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: 50ohm.de
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
]]>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!
]]>The SVG source is available, if you want to repurpose this design for something! The font is Geo.
]]>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.
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: https://github.com/blinry/compass-belt-hardware
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!
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: https://github.com/blinry/compass-belt-clip
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: https://github.com/blinry/compass-belt-firmware
I copied the firmware to the Pico using the following Linux command. Naming it main.py
on the controller makes it auto-start this program after booting:
ampy -p /dev/ttyACM0 put firmware.py main.py
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 serial.tools.miniterm ACM0 115200
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: https://github.com/blinry/compass-belt-app
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:
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.
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:
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):
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!
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:
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.
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!
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…
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 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.
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.
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.
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!
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!
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…
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
systems.
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
rice.
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
[1] https://www.en-standard.eu/bs-en-631-1-1993-materials-and-articles-in-contact-with-foodstuffs-catering-containers-specification-for-dimensions-of-containers/
[2] Jonah Reider's YouTube video: "These Are The Only
Kitchen Containers You Need" https://www.youtube.com/watch?v=y-dGZXAi1vc
[3] https://www.dartcontainer.com/products/foodservice/containers/plastic/microgourmet-plastic-deli-containers-and-lids
[4] https://www.edding.com/en-us/products/edding-780-paint-marker/
[5] https://www.scotchblue.com/3M/en_US/scotchblue/products/catalog/~/ScotchBlue-Original-Painter-s-Tape/?N=4336+3294340635&preselect=3293786499&rt=rud
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
blinry
EMail: mail at blinry dot org
URI: https://blinry.org
]]>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!
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:
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?
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:
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:
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:
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.
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.
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.
Initially, I set up the weekly project structure as an experiment for a month. Here’s the projects I picked:
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:
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
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.
I have a couple of modifications of the weekly project structure I’d like to:
If you have more ideas on how to develop this format, I’d love to hear your thoughts!
]]>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.
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.
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 <urkud.urkud@gmail.com>
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 = [];
lines.
svn path=/nixpkgs/trunk/; revision=10415
commit 8779bd423223b47bf523b1feab0d9cfb3c664f9c
Author: Yury G. Kudryashov <urkud.urkud@gmail.com>
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 <marco-oweber@gmx.de>
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
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 http://nix.cs.uu.nl/dist/tarballs/stdenv-linux/x86_64/r6905/glibc.tar.bz2
>
> curl: (6) Couldn't resolve host 'nix.cs.uu.nl'
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 nix.cs.uu.nl 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 tarballs.nixos.org
.
For this project, the only file where I needed to do this replacement was pkgs/build-support/fetchurl/mirrors.nix
:
hashedMirrors = [
http://tarballs.nixos.org
];
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...
trying http://curl.haxx.se/download/curl-7.17.1.tar.bz2
% 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.
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/h2py.py -i '(u_long)' /usr/include/netinet/in.h
Traceback (most recent call last):
File "../../Tools/scripts/h2py.py", line 175, in ?
main()
File "../../Tools/scripts/h2py.py", 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 <flo@chaoflow.net>
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/
done
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/
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";
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/linux6-config.py doesn't exist
> user-config.py 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/linux6-config.py
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/linux2-config.py
. 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!”
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.
Other approaches I tried:
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…
Another program I started using a lot 15 years ago is the vector graphics program Inkscape.
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:
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 www.inkscape.org
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/libfreetype.so.6
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/libfreetype.so.6
#1 0x00007ffff54e9134 in load_truetype_glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/libfreetype.so.6
#2 0x00007ffff54e99cf in Load_Glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/libfreetype.so.6
#3 0x00007ffff54dda41 in FT_Load_Glyph () from /nix/store/4shfp39ixrjz7riga3n26v53arb0vwpc-freetype-2.3.1/lib/libfreetype.so.6
...
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
Another program I wanted to build is Firefox.
$ nix-build path/to/nixpkgs -A firefox
error: builder for '/nix/store/dkdxljpvhdr2bn3i5cvpj5p9fy50hwpr-firefox-2.0.0.11.drv' failed with exit code 1;
last 10 log lines:
> building ../coreconf/Linux6.2.mk
> /nix/store/36sp3r35nxhhj5m83bxsvf7xqgdrhz1l-gnumake-3.81/bin/make -j1: *** No rule to make target ../coreconf/Linux6.2.mk. Stop.
> make[3]: *** [../coreconf/Linux6.2.mk] 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/builder.sh
:
patchPhase() {
if test -z "$patchPhase" -a -z "$patches"; then return; fi
header "patching sources"
startLog "patch"
patchW
stopLog
stopNest
cp security/coreconf/Linux2.6.mk security/coreconf/Linux6.2.mk
}
“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 127.0.0.1:8080
as the proxy.
I couldn’t access blinry.org, I think the allowed SSL algorithms are too new for Firefox 2.0…
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!
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:
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!
]]>The only instrument I used is the Helm synthesizer.
]]>A grid-based puzzle game about breaking the fourth wall,
Made for Ludum Dare 52, together with Piko! Play here!
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!
]]>Print, cut, and staple your own zine!
The binary message (reconstructed by me from this document): message.txt
]]>You can try the tool I made for interactively exploring the xyY color space here!
There’s a recording on YouTube:
You can play the demo here (works in Chrome, click to start the music).
I remade the framework as an interactive, minimalist creative coding tool! You can try it at https://sliderland.blinry.org!
]]>You can find the current build here:
https://blinry.github.io/everything-exhibition/
If something doesn’t work or looks broken, please let us know! You can describe the issue you’re having in our issue tracker.
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:
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!
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: bb@blinry.org
]]>Here are the slides we used: (Open them in fullscreen)
]]>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!
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!
This doesn’t clear the screen each frame, but instead clears 5000 random pixels before drawing the circle!
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
TIC-80 normally just has a 16-color palette, but it’s possible to change it in each scanline! :)
play in browser – download .tic file – view tweet
Using the palette swap region in the RAM, I swapped all colors to black before drawing a shifted copy of the sprite.
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
Another text effect. We have to split the string into individual characters to do this.
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
I love this retro effect, which separates the color channels more as we get closer to the edge of the screen!
play in browser – download .tic file – view tweet
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:
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
A text animation that pushes away letters that are further from the “focal point”. The things you can do with trigonometry! <3
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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:
The further we progress on the x-axis, the more probable the right color becomes!
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
An effect that helps make games 💦juicy💦! This is really satisfying. :D I’m sorry, Japan. Today’s earthquakes are on me.
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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.
Here, I’m doing a simple recursion with a dash of randomized angles, using a green color gradient.
play in browser – download .tic file – view tweet
Having some fun with TIC-80’s sprite editor, and assembling dynamically-sized objects from tiles!
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
A very rudimentary drawing program. Really wanted to spend more time on this, but I had to move on!
play in browser – download .tic file – view tweet
The same program as #33, but with an additional rule! :D
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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.
A modification of #24, but with two types of particles – raindrops and water splashes!
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
A filter that adds noise, some horizontal lines, and cheap distortion using the SCN()
function.
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
An interference pattern created by two sets of concentric circles.
play in browser – download .tic file – view tweet
For this, I distribute some colored pixels on the plane, and make them grow outwards, like bacteria. Surprisingly effective and cheap!
play in browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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!”
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view tweet
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 browser – download .tic file – view 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?
]]>And here’s a Twitter thread with the individual drawings:
Loading tweet...]]>
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:
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.
]]>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!
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:
That seemed like it all applied to me! So I started collecting evidence.
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].
Google search
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 morr.cc 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”).
Loading tweet...
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.
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!
]]>Here are the slides we used: (Open them in fullscreen)
]]>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+.
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! :)
]]>And here’s a Twitter thread with the individual drawings:
Loading tweet...]]>
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
]]>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:
In the next version, I added snow and an audio jingle, incorporating dial-up modem sounds. :D
… which turned out way too Christmas-y, so I removed the snow again, and changed the instrumentation.
Here, I swapped out the jingle to something more soothing, changed the camera movement to go through two phases, and added a fish friend! 🐟
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! :)
]]>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:
]]>Play it in your browser!
“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:
Loading tweet...
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:
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:
Loading tweet...
Loading tweet...]]>
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.
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:
Loading tweet...
Loading tweet...
We definitely had more ideas than time, so who knows, there might be an extended ersion in the future? :)
]]>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!
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...]]>
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:
Loading tweet...
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.
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.
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.
Make sure to check out “Ihro Mayastät” here:
]]>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!
Thanks to jan Ne for proofreading! (Original version)
Thanks to jan Kiki for proofreading! (Original version)
This was a collaborative translation with jan Kiki. (Original version)
]]>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.
Loading tweet...
Loading tweet...
Loading tweet...]]>
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:
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...]]>
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.
]]>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 media.ccc.de 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)
]]>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
B2_ACCOUNT_ID
to the keyID, and B2_ACCOUNT_KEY
to the keyphrase.restic -r b2:blinry-restic mount directory/to/mount/to
, you’ll need the password of the blinry-restic backup for this step.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 gopass.pw.
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 “morr.cc”. 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/morr.cc/
.
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 sebastian@morr.cc:~/permanent/backups/thinkerbell/
To list the contents of an available snapshot, run a command like this:
borg list \
sebastian@morr.cc:~/permanent/backups/thinkerbell/::thinkerbell-YYYY-MM-DDTHH:MM:SS.mmmmmm
To extract files from an available snapshot, run a command like this, or leave out the filename to extract everything:
borg extract \
sebastian@morr.cc:~/permanent/backups/thinkerbell/::thinkerbell-YYYY-MM-DDTHH:MM:SS.mmmmmm home/seb/wip/cool-project/
To summarize, the passwords you need to access all of my stuff are the following:
In addition, you’ll need the following two files:
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! :)
]]>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 itch.io.
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:
]]>And here’s a Twitter thread with the individual drawings:
Loading tweet...]]>
You can open the slides here, and here’s a recording:
Alternatively, you can find a recording on YouTube.
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.
]]>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.
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
]]>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.
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!
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”.
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.
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? :)
While writing this post, I found Hitchwiki, which is a brilliant, extensive resource. Wikivoyage also has a short site about hitchhiking.
]]>Hey everyone! :green_heart:
Friday:
Bio
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.
Today:
Hello, friends! :recursecenter:
Yesterday:
.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!Today:
Hey :}
Yesterday:
Today:
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
Wednesday
Thursday
Friday
Today
Hey all! :sunflower:
Monday
Tuesday
ssh torus@ascii.town
! We collaborated on making a screen dedicated to RC (southeast of the Red Outpost, if you wanna visit)!
Wednesday
Yo, what’s up? :cat:
Thursday
Friday
Today
(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:
Tuesday
Wednesday
createInput
).Today
Hello! :heart_kiss:
Friday
double x = 2*x
, this works, too: double = (2*)
. Weird!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
Monday
C# D# Bm G
I couldn't understand
F F# C#
How could you forget
F#
I didn't know when they left but I guess
C#
Fucking shit, I didn't know how long I'd been looking for
G
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
F#
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!
Tuesday:
Wednesday:
Today:
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 sebastian@morr.cc, 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! :)
]]>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!
Hey everyone! I really needed some time off :exhausted:, but I’m back, and I feel kind of re-energized at this point. Oof.
Tuesday:
Wednesday:
Yesterday:
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
Everyone at RC
:bell:Today:
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!)
Friday:
Today:
Hey all, how are you today? :sunflower:
Yesterday:
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./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!
Today:
Tuesday:
Yesterday:
Today:
Hello~ everyone! :octopus:
Thursday:
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! :DFriday:
Weekend:
Today:
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:
Monday:
Tuesday:
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:
Wednesday:
Thursday:
Friday:
printf(string_from_user)
can be abused! I might give a presentation about that this week.Good morning! :sunny:
Yesterday:
Today:
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.
Yesterday:
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:/dev
they are connected to!Today:
I’m going to take it easy today. Ideas include:
I’m better today, my headache is almost gone! :fireworks:
Yesterday:
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
Today:
Hey folks! :rainy: :rainbow:
Thursday:
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):
(Censored)
The showcase at the NYU Game Center was fantastic, see this topic! I want to go to one of their usual Thursday events soon!
Friday:
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.
Today:
Moin! (That’s a generic, casual greeting in northern Germany. An appropriate response would be: Moin!)
Tuesday:
Wednesday:
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
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.”
Today:
Hey lovely people! :green_heart:
Yesterday:
Today:
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!
]]>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: https://github.com/blinry/legit. The entry in the Esolang wiki is at https://esolangs.org/wiki/Legit.
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.
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.
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.I/O:
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 valuepop
: pop top stack value and discard itadd
: pop two topmost stack values, add them, push result on the stacksub
: pop two topmost stack values, subtract top one from bottom one, push result on the stackcmp
: pop two topmost stack values, pushes 1 if bottommost one is larger, 0 otherwiseTape operations:
read
: place value of current tape cell on the stackwrite
: pop top stack value and write it to the current tape cellleft
: pop top stack value, move tape head left for that many placesright
: pop top stack value, move tape head right for that many placesI’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
To execute a program, run
ruby interpreter.rb examples/hello/
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
.
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 esoteric.codes!
Another one is by LegionMammal978, you can find the legit program here!
]]>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!
Yesterday:
nasm
assembler, which interactively translates Intel-style assembly instructions to bytes:
minias
, which can compile a tiny subset of x86 operations to bytes – for now, syscall and some very specific immediate-value mov instructions:
Today:
minias
, maybe cmp and jumps?Moin! (In northern Germany, people use that as a casual greeting. A fitting reply would be: “Moin.” :D)
Yesterday:
minias
can now create little programs which… quit and return an exit code! :octopus:
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!Today:
minias
to put them in the ELF binary. At that point, I should be able to compile a simple “hello world” program.Good morning! How are y’all feeling today?
Yesterday:
minias
to understand section properly, so I can now split my programs into sections like “.text” (for code) and “.rodata” (for read-only data).Today:
Have a wonderful Friday, y’all!
Yesterday:
cccppp
.Today:
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 https://faces.recurse.comHey :) 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!
Friday:
Today:
ld
to do the actual relocation and generate a binary!Hey all!
Yesterday:
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:
Today:
minias
improvements in Rust!Hey, how’s your day going? :bunny:
Yesterday:
minias
with @Colin Rothfels (SP1’19), so it can now output Unicode characters and emoji! :Dld
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.Today:
Greetings!
Yesterday:
ld printf.o -o printf -lc --dynamic-linker /usr/lib/ld-linux-x86-64.so.2
), but it still feels very mysterious and I don’t know how it’s implemented.Today:
Hey everyone, I hope your Friday will be really neat!
Yesterday:
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:
-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.condition 3 i == 10
will add a condition to breakpoint #3, and only halt execution when the condition is true.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.gdb
tricks? Let me know in the comments below!Today:
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
Friday:
.vimrc
! blush Some takeaways:
;
to fzf’s :Buffers
seems like a neat idea.Today:
Hej! :)
Yesterday:
strace
I 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!
Today:
Good morning RC!
Yesterday:
Today:
Hey everyone! :cherry_blossom:
Yesterday:
Today:
Hey, what’s up? :)
Yesterday:
git commit --allow-emtpy
, git write-tree
and git commit-tree
.Today:
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
Friday:
Today:
Hi everyone! :sunny:
Yesterday:
Today:
こんにちは、みんなさん!
Yesterday:
Today:
Good… morning! :D
Yesterday:
Today:
Hey everyone!
Yesterday:
Today:
Hi :3
Friday:
Weekend and Monday:
Today:
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.
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.
]]>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? :)
]]>People seem to enjoy it! Check it out here: https://cardgame.morr.cc
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!
]]>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!
]]>Here are the slides we used: (Open them in fullscreen)
]]>And here’s a Twitter thread with the individual drawings:
Loading tweet...]]>
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.
]]>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!
]]>There’s a recording of the talk on media.ccc.de:
(If you prefer, there’s also a copy of the recording on YouTube.)
And here are the slides:
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.
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!
]]>This is the normal version, which can be used in website headers, on stickers, and other merchandise:
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.
This is a reduced version, which looks pretty in a square and a circle, and can be used as all kinds of avatars.
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.
]]>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! :-)
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.
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.
http://dl.acm.org/citation.cfm?id=3039686.3039693
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.
https://doi.org/10.1007/978-3-319-62127-2_32
This article combines the two paper versions. You can read the preprint at arXiv.org, or a view-only version of the published article.
]]>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:
Loading tweet...]]>
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:
Loading tweet...
Loading tweet...
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!
]]>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.
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, …).
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 |
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.)
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.
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!
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:
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.
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!
]]>Here are the interactive slides – you probably want to open them in fullscreen.
]]>You play the web version on the Ludum Dare website.
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
]]>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.
]]>Sollten Sie für andere Zwecke einmal Veränderungen an dem Formular vornehmen wollen, steht die Quelldatei im SVG-Format bereit.
]]>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:
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:
A header for the blog:
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.
]]>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.
]]>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 …
Loading tweet...
… and advanced cooks alike:
Loading tweet...]]>
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.
]]>And here are the slides we used: (Open them in fullscreen)
]]>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 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.
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!
]]>Folien:
]]>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.
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:
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:
wiki
: My personal wiki, based on Vimboyhomepage
: This site, based on nanocnom
: My personal caloric intake tracking and weight loss assistantmail
: All ingoing and outgoing mail, synced with offlineimappkgbuilds
: Software packages for the Arch User Repository.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.
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:
Loading tweet...]]>
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 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:
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. ;-)
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.
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!
]]>It was selected by the GitLab Infrastructure team from my three suggestions:
]]>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.
]]>Here’s a (German) recording of the talk, given at my home hackerspace, Stratum 0:
Games:
]]>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:
]]>Would you like some Möbius bacon on that?
]]>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! :)
]]>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.
]]>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!
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”:
]]>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.
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.
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!)
But really, there’s not much you can do wrong. Go! The world does need more hugs, now more than ever.
]]>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.
]]>Inspired by @nori_wrap’s low poly art.
]]>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.
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:
https://guessr.blinry.org/?Q12280
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!
]]>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!
]]>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.)
]]>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.
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! :)
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.
]]>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!
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.
]]>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.
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:
#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.#introduction
! Include many hashtags so people with similar interests can find you!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!
Drawn when I migrated from Twitter to the open-source alternative Mastodon for a week. See this thread on why I did that:
Loading tweet...]]>
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:
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?
]]>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.
]]>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.
Dies ist die Grundidee:
Jedes Gefühl ruft uns etwas in Erinnerung, das uns wichtig ist.
Zum Beispiel:
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:
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:
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.
Oft scheitern wir daran, die Botschaften unserer Gefühle zu empfangen. Dafür kann es drei Gründe geben:
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ühlen → Wertschätzen → Sich auseinandersetzen → Vereinbaren
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.
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:
In beiden Fällen behob der Übergang von alten zu neuen Werten einen Denkfehler:
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.
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?
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 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.
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.
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:
Viel Glück.
Gibt es eine Person, von deren Gefühlen und Werten du gern mehr hören würdest? Schick ihr diesen Text!
]]>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:
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:
Loading tweet...]]>
This was in parts inspired by Gravity’s marvellous womb scene.
]]>A logo for media.ccc.de, 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:
Loading tweet...]]>
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.
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:
Click to zoom. Middle-click to zoom out.
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!
]]>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!
]]>Just dabbling around a bit with Krita…
]]>Here’s an example tweet:
Loading tweet...]]>
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.
]]>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:
]]>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!
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!
]]>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!
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!
]]>The motivation for this overview is that I’m starting a second season!
The story also inspired a piece of fan art by @lichtfeind:
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...
Loading tweet...]]>
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.
]]>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.
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
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="path/to/jquery.almightree.js"></script>
<script>$(function(){ $("#almightree").almightree({search: "#almightree-search"}); });</script>
<ul>
with the id #almightree
search
option makes the <input>
with the specified id interactive<link rel="stylesheet" href="path/to/almightree.css">
Loading tweet...
Loading tweet...
Loading tweet...
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.
]]>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. |
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.
]]>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!
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.
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.
Jede Wassersorte in einen eigenen Plastikbecher einschenken, auf dessen Unterseite der Name der Sorte steht.
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.
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%
Surf (von Norma, 0.13 EUR/L): 95%
Nestle Pure Life (von Real, 0.33 EUR/L): 93%
Elitess Marinius-Quelle (von Penny, 0.13 EUR/L): 87%
Quellbrunn Claudius-Quelle (von Aldi, 0.13 EUR/L): 85%
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.)
babylove (von dm, 1.67 EUR/L): 83%
ja! (von Sky, 0.13 EUR/L): 83%
Apollinaris Vio (von Penny, 0.33 EUR/L): 83%
Vitalbrunnen Naturalis (von Netto, 0.13 EUR/L): 82%
Gut und Günstig (von Edeka, 0.13 EUR/L): 80%
Vilsa (von Real, 0.46 EUR/L): 78%
Saskia (von Lidl, 0.13 EUR/L): 75%
Unser Norden (von Sky, 0.39 EUR/L): 75%
Urstromtaler Naturell (von Netto, 0.33 EUR/L): 75%
Black Forest (von Real, 0.59 EUR/L): 73%
Vittel (von Penny, 0.39 EUR/L): 73%
Sawell (von Netto, 0.25 EUR/L): 73%
Tip (von Real, 0.13 EUR/L): 72%
Bismarck (von Real, 0.65 EUR/L): 70%
Volvic (von Real, 0.59 EUR/L): 65%
Adelholzener (von Real, 0.65 EUR/L): 62%
Harzer Bergbrunnen extra still (von Real Getränkemarkt, 0.26 EUR/L): 57%
Magnus (von Edeka, 0.56 EUR/L): 57%
Frische Brise Reinbecker Klosterquelle (von Sky, 0.25 EUR/L): 48%
Leitungswasser (aus Schleswig-Holstein, 0.00165 EUR/L): 42%
Contrex (von Penny, 0.49 EUR/L): 37%
Aqua Nordic (von Edeka, 0.33 EUR/L): 37%
evian (von Real, 0.59 EUR/L): 33%
Bleib Gesund (von Rossmann, 0.69 EUR/L): 33%
Vitrex (von Edeka, 0.33 EUR/L): 32%
Real Quality (von Real, 0.23 EUR/L): 28%
Aqua Mia (von REWE, 0.33 EUR/L): 28%
Quellbrunn Werretaler-Quelle (von Aldi, 0.22 EUR/L): 27%
Harzer Bergbrunnen still (von Real Getränkemarkt, 0.48 EUR/L): 27%
Carolinen natur-elle (von Real, 0.46 EUR/L): 22%
Extaler Mineralquell (von Real, 0.34 EUR/L): 22%
Hella (von Real, 0.51 EUR/L): 22%
Vöslauer (von dm, 0.65 EUR/L): 18%
Christinen Naturelle (von dm, 1.10 EUR/L): 15%
Gerolsteiner (von Edeka, 0.59 EUR/L): 12%
Carolinen (von Real, 0.60 EUR/L): 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):
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:
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:
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.
]]>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 arXiv.org (linked below). I also presented the paper at EuroCG 2015 and ESA 2015:
The resulting implementation has become part of the open source Computational Geometry Algorithms Library, starting from version 4.7.
]]>Für den, der hinschaut
Sehen die Berge
Jeden Tag anders aus
— Zufalls-Gedichts-Generator
Nicht durch Zorn, sondern durch Lachen tötet man.
— Nietzsche
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.
— Unbekannt
Ich habe keine Lösung, aber ich bewundere das Problem.
— Unbekannt
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.
— unbekannt
Time flies like a river.
Fruit flies like a banana.
— unknown
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.
— unknown
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.
— Confucius
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.
— via soup.io
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.
— Graffiti
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.
— Osho
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
— unknown
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.
— zinemin
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.
— @pyrtsa
glTexParameteri
…”Helps you lose weight by tracking your energy intake and creating a negative feedback loop.
]]>Granted, this sound like an incredibly boring, bureaucratic topic, but this is a personal story of disentanglement and simplification. Wait and see :-)
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?
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.
I always hated this system. Here’s the workflow to file a new document:
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.
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.
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.
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:
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:
That’s it! Not much room for improvement, and it could hardly get any simpler - mission accomplished!
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 ;-)
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.
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.
]]>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.
]]>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:
Loading tweet...
Loading tweet...]]>
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:
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.
Wenn ihr noch Fragen habt, gerne her damit!
]]>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:
\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.\keys{\ctrl + C}
), es eignet sich auch zum Formatieren von Menüfolgen (\menu{Extras > Settings > General}
).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.
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:
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.
]]>A framework for creating interactive command line tutorials, inspired by text adventures.
]]>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.
]]>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.
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:
Abstract
(Purpose)
(Design + evaluation methods)
(Major results)
(Summary of conclusions)
Introduction
(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)
Overview
(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)
Design
Command line parser
Purpose
(Recognizing parts of command line output)
Background
(How a terminal works)
(Escape characters)
(Readline key combinations)
Architecture
(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
Purpose
(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)
Properties
(String-based)
(Functional)
Lexical elements
(Token types)
(Diagram: State machine)
Syntax
(EBNF of language constructs)
Parsing
(How YACC works)
Semantics
(Specification of language constructs)
Interpreter
(State)
(Function stack)
Automated testing
(Motivation)
(Testing algorithm)
Examples
Implementation
Used technologies
(Go)
(kr/pty for terminal emulation)
High-level design
(Diagram: Package diagram)
Command line tool
Usage
Builtin functions
Application and evaluation
Methods
Setting
(Description of setting: Preparatory course for CS students)
(Previous teaching method)
(Groups)
Tutorial
(Content, examples)
(Best practises in lesson writing)
Survey
(Questions)
Results
(Pretty graphs)
(Statistical evaluation)
Conclusions
(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)
Acknowledgements
(...)
References
(...)
Appendix A: Example lesson
(nutsh source code)
(Execution output)
Appendix B: Table of terminal escape codes
(...)
Affidavit
("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.
]]>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ß!
]]>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 " {
"OMG!"
} else {
"Brav!"
}
Mehrfach verwendete Codeschnipsel kann man in Funktionen auslagern:
def exit_status {
return(run("echo $?"))
}
def say_twice(text) {
say(text)
say(text)
}
prompt {
say_twice("Der Rückgabewert war '"+exit_status+"'")
}
Funktionen ohne Argumente können auch ganz ohne Klammern aufgerufen werden.
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" {
break
}
}
"Zweite Chance..."
prompt {
if command =~ "panic" {
break
}
}
}
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 {
break
}
}
"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" {
break
}
}
"Und wer bist du?"
prompt {
if command == "whoami" {
break
}
}
}
Die Syntax einer solchen “Zustands-Schachtelung” hat mich am längsten aufgehalten, mit dem Ergebnis bin ich aber sehr zufrieden.
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.
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`
davor."
}
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("ROOT=/tmp/nutsh")
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!\""
break
}
}
"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
hat?"
break
}
}
}
"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") {
break
}
}
"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
heraus!"
break
}
}
}
prompt {
if run("pwd") == run("echo $ROOT") {
break
}
}
"Gut! So, das war eine Einführung in `ls` und `cd`. Hier ist das
Tutorial erstmal zu Ende! Danke!"
}
]]>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.
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() {
Spawn("bash")
gotoJail()
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() {
Output()
if Command("^1s\n$") {
Say("Das ist ein kleines L, keine Eins! Probier's
nochmal!")
}
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!\"")
break
}
}
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() {
Output()
if bash.Test("$(pwd) = \"$ROOT/schrank\"") {
if Command("^ls\n$") {
Say("Genau. Hast du bemerkt, wie sich der Prompt
geändert hat?")
break
}
}
}
Say("Und wenn du wieder aus dem Schrank herausmöchtest? Die
Abkürzung für das Verzeichnis oberhalb des aktuellen ist
\"`..`\"!")
for Prompt() {
Output()
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\"") {
break
}
}
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() {
Output()
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!")
break
}
}
}
for Prompt() {
Output()
if bash.Test("$(pwd) = \"$ROOT\"") {
break
}
}
Say("Gut! So, das war eine Einführung in `ls` und `cd`. Hier ist
das Tutorial erstmal zu Ende! Danke!")
}
func gotoJail() {
bash.Execute("ROOT=/tmp/nutsh")
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
rechter_schuh
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! ;-)
]]>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
fmt.Print(output)
} else {
// Otherwise, the output was already printed to the user
}
// Post-output logic
}
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.
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.
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”).
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.
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.
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.
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?
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.
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:
]]>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:
set -x
, um Befehle vor der Ausführung nochmals ganz anzuzeigen, soetwas ist mir aus anderen CLIs aber nicht bekannt.CMD="
End "; echo "$CMD"; eval "$CMD"
” senden. Aua.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 ;-)
]]>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.
]]>To be short: Simplicity, security, speed.
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/index.md
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.
nanoc.ws contains everything you need to know to build your own nanoc powered site. Have fun!
]]>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 donttrack.us for more information about this problem.
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 dontbubble.us.
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!
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.
]]>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
machen."
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
abstellkammer/
schriftrolle
$ 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:
abstellkammer/
schriftrolle
.glaskugel
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
Abstellkammer."
$ echo hilfe
Deine Stimme hallt von den Wänden der Höhle wieder:
hilfe
"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
werden."
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:
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.
]]>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.
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 ™.
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.
]]>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.
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:
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.
In 2010 came two big changes: I migrated to a new domain, morr.cc, 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.
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.
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.
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…
I also designed a website which contains a short summary of the paper.
]]>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:
You can also download and play the app, of course!
]]>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:
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! :)
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!
]]>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 google.de 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 ;-)
]]>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.
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!
]]>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.
]]>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 blau.de 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!
]]>You can move around with your arrow keys. First to get 11 points wins.
Computer 0:0 You
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.
]]>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.
]]>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.
]]>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!)
]]>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!
]]>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.
]]>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.
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.
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.
]]>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…
]]>Another idea: “To enter the apartment, click HERE.”
]]>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:
Hab gerade mein Programm nochmal angepasst und durchlaufen lassen, es gibt sogar 96 verschiedene Lösungen!
]]>Aber eigentlich möchte ich dir einen kleinen Gag zeigen, den Google in diese Funktion eingebaut hat. Geh dazu auf http://google.com (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?
]]>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ß!
]]>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.
]]>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…”
]]>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:
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…
]]>Translation: “To hell with Pisa, it’s not our tower.” Was created for a T-shirt when I finished high school.
]]>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 OpenOffice.org.
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.
]]>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.
Auf www.pidgin.im Pidgin herunterladen (10,9 MB).
Das Programm installieren. Normalerweise reicht es, bei der Installation immer auf “Weiter” zu klicken.
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, blinry@jabber.org) 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!)
]]>Bevor man stirbt, zieht das ganze Leben an einem vorbei. In Echtzeit.
Ich habe auch eine Reflexion über die Entstehung geschrieben.
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.”
]]>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
-=:§ DIE LECKEREN BACKSTEINREZEPTE §:=-
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?!
stümmt
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!!!=)
stimmt.
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
loszuwerden...
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
das?
Etwas aus dem nützlichen Bereich
204 als türstopper benutzen
2e
206 lochen und abheften, dafür, dass man ihn mal irgendwann wieder
brauch
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
mehr!!!!!!!
danke jasper! :D
213 als Erkennungszeichen für einen geheimen Bund benutzen
Kähähä
hey was soll das :'C jetzt bin ich ganz traurig und schreib was da
zu!!
214 bei einer Versteigerung versteigern(ist nicht ebay!!)
kähähähähähä
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:
--------------------------------------------------------------------
DAS GROßE BACKSTEINRÄTSELHEFT
219 Was ist schwer, schmeckt gut, ist leicht zu zerstören und eine
wirksame Waffe?
220 Suchsel
Such das versteckte Wort:
ORAC
WDBX
YAAL
DICÖ
SCKH
MESC
KTTG
UTEP
ESIM
NNNN
CPÜG
MFIP
221 Führe den Backstein zum Mörtelsack!
Tipp: Geh nicht den direktesten Weg!
_W_
_____ ########################################### / \
|\ ____\ # | |
\|_____| ################## # ########### |_____|
# #
################
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.
HÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ????
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 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!
]]>