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 centimeters. Thatâd make the whole antenna a bit shorter than half of the wavelength.
For example, this is what the configuration looked like for frequencies around 100 MHz:
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!
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.
A number of people kindly translated the cheat sheet! More translations very welcome!
]]>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!
]]>