The Mediocre Machine

In my first article, I looked at Generative AI delivering the Plausible Looking Answer. I did not go into the mechanisms of how Large-Language-Models work. This time I’d like to layout how understanding their technology also helps understanding their short-comings and reduces anthropomorphizing them over and over. Let’s try and have a look into the machine.

Two phases, two layers

To talk effectively about it, we have to look at two phases of working with the Large-Language-Model.

The first is the training phase in which LLM providers feed as much data as they could get their hands on into the model. The training takes months, a-hell-of-a-lot of (copyrighted) data, energy and cooling water. Once training finished, the model is frozen and made available to use by in or by other services.

Once the model is running, you have the first layer of your AI-service – its foundation, hence “foundational AI model”.

The model itself is frozen and state-less. You send it an request and it will generate an answer. It will not learn on or store your input, your prompt. It will not “remember” what you did a minute ago. To achieve something like short-term-memory, we need to build something on top in the application layer. This layer orchestrates between user inputs, access to additional resources, prompting the LLM. receiving and displaying its response. Much of what happens in an AI-services is not in the actual LLM, but happens in the application layer. We will go deeper here at a different time.

The orchestration also makes the model start generating.

Wakey wakey

The lifecycle of an AI request goes through the same three steps continuous steps: the LLM is state-less program running on a server. The server idles waiting for a request, upon receiving a prompt, the server asks the LLM to generate a response – streaming it piece by piece. Upon finish, the server goes back into idle – the LLM not performing any action. Why is it streamed piece by piece? In an attempt to make waiting times of slower models feel shorter.

If you don’t prompt it, the server sits on stand-by. Without a prompt, the LLM is not neither “thinking” nor “resting”. It will not have a spontaneous idea and “wake up”. The LLM behaves like any other server, waiting to be called. The prompt-response-pattern is at the core of every AI service.

Averaging the human knowledge

The process of creating and training a Large-Language-Model is complex and my explanations will be simplified to get the gist.

Training can be [split into more steps](https://magazine.sebastianraschka.com/p/new-llm-pre-training-and-post-training) (Pre-training, Post-Training, Finetuning, etc) but for us the *Pre-Training* is the most important.

What is this Pre-training? It’s the GPT in ChatGPT (Generative Pretrained Transformer). Today’s LLMs are trained over months on all text, books, websites, movie scripts and movies. These have been broken down into Tokens. Instead of “Daniel” or each letter “D”, “A”, “N”, “I”, “E”, “L”, my name has been tokenized to “Dan” & “iel” and during pre-training the algorithm found, that after the token combination “Dan” and “iel” the tokens “Rad”, “cli” & “ff” are slightly more likely than “Sen” & “ff”. The same, but technically more complex happens when building models for audio or video, which are trained on audio, images and video as well.

Remember when I said in part 1 “No words have meanings to LLMs. To an LLM it’s all just symbols”? These tokens are the symbols. They hold no semantic meaning, they are the pieces for computation and for the statistical analysis.

Nothing the model was trained on is actually stored. It is one giant fuzzy database of parameters encoding the statistical relations between tokens and approximating the original data.

I just said approximation, because during training the original input has been compressed into these parameters with losses. It’s more like a vending machine: you select a product, the machine translates your input into the row and column of your choice, but you don’t know which exact article you will get. When selecting Cola, you may get regular Coke, or Diet Coke, or Cola Zero, or Pepsi. It all fits the original request, but something got lost on the way.

It’s not easy to imagine a multidimensional space of parameters describing an approximation of language and knowledge, so we won’t. We’ll stick with two dimension and look at an example.

Hallucinations is the mechanism

So you have your fully-trained LLM. When prompting it with a request. you basically ask the LLM “hey, here is this half of a thing, how would the second half look like?”. If you ask it a question, it will create an answer. If you give it an image and ask it to extend the edges, it will create a plausible looking scene, fitting with the original image.

This is fundamental to all LLMs, you pass the initial prompt and it responds with a plausible extension. What’s happening is that your prompt basically draws a path through the model’s billions of parameters and based on this path, it begins generating a response, that itself can go down many different paths.

By changing your prompt, you implicitly describe which parameters get activated in your response. If you ask “Which cars are red?” it may draw a very straight-forward path between the statistics of the word “which” and the word “car”, with a detour through “English language” and may return a response like “Fire engines are commonly of red color.”. Change the prompt to “You are a sports commentator, what is the red car on the circuit of Monza?” the path will also lead though the topics “sports commentating”, “motorsports”, “Monza circuit” and you get a high likely how that “red car” gets related to “Ferrari” in the resulting response “Red cars on the race track of Monza are often Ferraris.”.

Based on this behavior many prompting-strategies have been developed, where providing very specific context can direct the LLM through topics that vastly improve the quality of the response. However no matter the prompting strategy, the LLM will always generate the most plausible path through its data. The generated answer is always an hallucination – just sometimes more correct than other times. It produces text without intent, without interpretation, without malice, without “understanding”. It’s only statistics. The machine is always guesses a text without understanding its meaning, it sees the tokens and attempts to guess an answer from statistics. And sometimes, its guess is right.

Personally, I prefer to avoid the term “hallucination” as it is a euphemism for LLMs producing text which does not stand fact-checking. It’s a machine doing what it is supposed to do, but it is sold by AI providers as more than it can fulfill.

Think harder!

Some LLMs have been extended to work as “Reasoning models”. These add another processing step when generating answers. This is called “thinking”, and can be thought of as an extension to Train-of-Thought. The model will first generate itself a new prompt, that is then being used to fulfill the task. By thus covering a wider context and laying a more detailed path through its data, the hope is to cover more ground and improve the final generated result. This comes at the price of lower response times as the model has to generate even more text, using more tokens and spending more energy.

When addressing these criticisms of wrong responses being hallucinated AI-fans often respond, that this will be fixed in the future and it will get better. The truth so far is is: It will not, as it’s not possible by design with the current technology. Hallucinations are inherit to the design and for the past two years AI providers worked hard to circumvent the most obvious ones on the application layer through moderation. They can’t fix every specific cases on training in the model. Models have mostly grown through data size and scaling, with lower return-of-investment, the bigger they get. Some people already ask, if they have become as good as they can get.

Summary

Whatever you ask your LLM to generate. It will always generate its response from its training data, its corpus. It will recombine, but is it creative? It will not remember, have meaning or understanding. In training any creativity and heart will be averaged out into a statistically plausible response. It will not have creative new “thoughts”. It will walk paths many people before already walked on. It will respond to the next person prompting a similar question with a similar result.

Recombination can bring new ideas and creativity is often a recombination of familiar elements in a new context. To achieve this, you need an understanding of its meaning. Good prompting can lead the model to be a helpful tool, but recognizing creative ideas requires judgement by a human being in front of the keyboard. LLMs produce language, not content. This is where slop is born. I’m reminded of a quote by Kevin Sands, “It is never the tool that decides. It’s the hands-and the heart-of the one who wields it.”.

As such AI can serve as a multiplicator. If you are creative, AI can be one more tool in your toolbox to achieve cool things. If you don’t bring the initial skills, it will make your work look like everyone else’s. If you feed your text into a generative AI to have it reworked, you are literally asking it to remove your personal touch and make it more average and less yours.

Using AI does not make you stand-out, it makes you blend in with everyone else using it.

A Plausible Looking Answer

Generative AI based on Large-Language-Model (LLM) is here, but most people have a vague understanding on what this black box is – how it works, what to expect. This is fine, you don’t have to understand how a solar panel works for getting electricity. However it is important to have an idea of the technology with certain expectation. Generative AI seems like magic when in reality it is all statistics. It looks like human thinking, sensing and feeling, when it is playing pretend. Explaining how LLMs work technically is interesting and also tough, but you can still find some mental images that help to set expectations of what this technology can do and how it operates.

My fallible friend

Your generative AI is like an eager friend. You can ask them any question. They will always have an answer. They will rarely say, “I don’t know” and will bullshit or even gaslight you into thinking, they do have the answer. Oftentimes they are right, but being right yesterday is not indication they will be correct today. Whether they are correct or wrong, or whatever, you only know once you check or question their response. Until it is checked, the response is only plausible.

Sentence completion turned to 11

We all have used the keyboards on our Smartphones. Above the virtual keys, you get a word prediction, where the system tries to anticipate your next word, so you don’t have to type it out. This is partially trained by your typing and reflects common word combinations you may have used. For years, on social media people played with predictive texts. You’d start a sentence and have the word prediction on your phone keyboard complete it. Generative AI and Large-Language-Models just like this, but on steroids.
The interaction is always a call & response. You pass a prompt and the LLM will auto-complete your prompt with a plausible looking response.

Plausible looking responses

Much discussion is about LLM responses being correct or false, but these are words, that have no meaning to LLMs. No words have meanings to LLMS. To the LLM it’s just symbols. LLMS have no thinking, no sensing, no concept of reality, of right or wrong, of fiction and non-fiction. LLMs are statistics trained on the internet with all biases, short-comings, copyright-infringements, and grammatical mistakes, there are. The more context you provide, the better its calculation may pass an answer that not only looks plausible, but is actually correct. You can ask an LLM, what the name of the first city on the moon is. If it says “New Berlin”, it gave you the answer from Star Trek. Technically not wrong, not totally correct either.

Similar when you ask for sources. The LLM will always try to create a plausible looking answer. In the answer, you’d expect a list of book titles. Having book titles makes it look more plausible than saying “I don’t know any books of that topic.” Thus it invents book titles, to make a more plausible looking answer.

On a limited scale, you can influence this with your prompt and the AI providers try ensure good looking answers, but this is a fundamental characteristic of the technology. It will generate plausible looking answers.

Hallucinations

When marketing departments companies pushing AI found that too many would generate garbage or fudge details, the term “hallucination” was coined. “Ah, the model is just hallucinating, it’ll improve in the next version”

Hallucination is not the failure of Generative AI, it’s the mechanism by how it works. It’s the statistical recombination that creates a plausible looking answer, given the initial prompt.

It looks like thinking

“But look the train of thought, it’s thinking, it’s reasoning!”

Train of thought is the method of asking the LLM to write down “what are the steps you would do to solve X”. Again, the result will be a plausible looking sequence of steps, but it’s not “thinking” and it’s not the steps the model will actually perform. It’s a generated answer describing the steps. Similarly, when you posed a question to an LLM and ask it “how did you do this”? It will generate a plausible looking answer, describing what a thinking process may have looked liked, but it didn’t think this process, neither has it memory. Apple recently published a paper going into more detail. If you ask a model “how do you feel, what do you want”, it will either respond with a plausible looking answer about being self-conscious and may sound very human doing that, but it’s still only a plausible looking answer. Many AI providers also tweaked their models, to respond to these kind of questions with template answers as too many – even experts – fell into the whole of believing to have found sentient AI. This is Pareidolia.

Doing Chain of Thought when prompting LLMs, it did show improved results by the AI’s response. What it does do is asking the LLM to cast a slightly wider net in it’s training data, thus getting a bit more context from the prompt, extending the level of detail to a degree where the generated response has more context based on fetched trained data and a higher chance of being correct.

How this breaks down can be nicely seen when asking math questions, or counting letters in a word. It doesn’t think, it generates plausible text. “How many letters are in strawberry?” A structurally plausible answer is “There are 5 r in strawberry” – there is no model of a letter, there is no model of a word or of the process of counting. It just knows, that in its billions of training data, statistics show, that a plausible answer looks like this. Applying train of thought, will have the LLM describe how letters are counted, but since it does not actually perform the steps it describes, it may still fail.

The strawberry example has been around long enough, that newer models were trained on articles describing this behavior. They may now return the correct number for strawberry, but now ask for blueberry and they may fail again. Similarly, when you ask to “generate a sentence of exactly 25 words” or “count the elements in this list”.

Summarize all the things

A common generative AI use case often presented are summaries. “Have this e-mail summarized for you!”. Unfortunately it doesn’t summarize. When you ask LLM for a summary, or a transcript, you will have one of two situations.

If the document you want to get summarized is about a topic, that is well documented and included in the pre-trained corpus of your model, when generating the summary it will draw heavily from this trained data and add “outside” knowledge to the document. It may add points not included in the original document, but which may be “plausible” to add. It’s like asking an intern to summarize a document and they will give you the Wikipedia summary.

If the document is on a topic not reflected in the corpus of your model, it can not draw from the training data, so it has to work with what you have given it. In this case, it will analyse the source document and make a statistical guess on what is imported in the document. This would be your intern counting how often the word “opportunity” was mentioned in the document and thus only mention the opportunity, while leaving out the risks because the word “risk” was only mentioned once. Can’t be that important, right?

And of course, a model may deliver a good summary, and still completely miss the point.

“Human-level” AI

To wrap it up, LLMs generate plausible looking answers by being a glorified word completion. It may be correct, but the more important the answer is, the more you need to critically review it. Humans are bad at review. I didn’t even touch on inherit biases and the devastating environmental footprint of AI.

Your AI friend can help you, or it can fail. Depending on the quality of the model, it can fail hard and invent everything in the quest for the most plausible answer. I know people talking about “human-level AI” to address this. AI is not infallible, it’s only “human-level”. I gave my sister the same explanation, on how LLM don’t do summaries. Her response was “still better than my colleagues”, mine “Get better colleagues”.

Solving Tailscale DNS issues

As I mentioned the other day, I fell in love using Tailscale for making my local private network accessible remotely. I’m also using this in my company, but with one colleague, had an issue, I didn’t find any documented solution online. So here is mine.

I have a Tailscale network with multiple self-hosted services running in Docker and made available with Tailscale. If you have an account and your account is invited to the network, you can access them. This worked for 2 of 3 colleagues. The third had the Tailscale client running on their Windows, it showed up as active in the Tailscale admin console and the list of machines. It looks like it runs perfectly, but when you try access the the service within the network, it fails in Firefox with the error PR_END_OF_FILE_ERROR or SSL_ERROR_INTERNAL_ERROR_ALERT. In other browsers the error would just show as a connection error.

If you put the service in a public Tailscale tunnel, access is possible.
if you go on their machine, open Powershell and call tailscale status it would show all status just fine. Calling tailscale ping <service-name> shows success ping to the service.

I tested Windows defender and firewall settings, but could not find anything that could explain the issues.

Calling tailscale dns status provides on the machine provides an overview of the dns options Tailscale is using. Here it showed this:

=== 'Use Tailscale DNS' status ===

Tailscale DNS: disabled.

Tailscale is configured to handle DNS queries on this device.
Run 'tailscale set --accept-dns=false' to revert to your system default DNS resolver.

So I switched this on:

tailscale set --accept-dns=true

Et voila, calling the service work again!

So now I’m in this half-satisfactory space of having a solution, but not knowing the root cause. My guess is that this colleague hasn’t updated Tailscale since them installed it initially in October and when they installed the latest version, it did not install the latest default configurations properly.

My expectation would be that turn Tailscale DNS off again, would lead to the same issue, but it didn’t.

tailscale set --accept-dns=false

So something is weird, is resetted when activated DNS and stays good when deactivating it again.
Well it works, for now and I hope it’s a permanent solution.

Next steps in Self-Hosting (pt 2)

In part one I spoke about the start of my journey, which was driven by playing with my smart home playground on topics of energy saving. My home servers have been in place since 2018 – yet, one thing I could never fully solve was how to make it available outside of my home network. For people into DevOps there will be little new here, but I’m no DevOps guy, so I had new things to discover I’d like to share.

So my challenge was to make my home server available via the internet, without making it public.

I was toying with a DynDNS setup at one point, but I never felt comfortable with exposing the full device to the internet. I know my way around Linux, but server security can become a bigger beast. I also didn’t want to invest in a virtual private server setup for this.

This is where Tailscale was a small revelation to me.
Tailscale is a service provider for virtual private networks. Basically, you install client apps on your devices building a virtual network and making machines available even when they are physically apart.
For example, I’m traveling and by flipping a switch on my phone, I see my PCs, my home server, my second phone, and I can access them as if they were in the same room with me. Each device gets a fixed IP and URL in the network and becomes way easier to access than remembering IPs and ports. I could add the Tailscale client to my Home Assistant OS running Raspberry and can access it from everywhere, as long as the Tailscale client is running on my device.
This was straight forward.

Schema of a Tailscale network. You have your home network at … home. This runs different services and has different devices. The home network is made available in your tailscale network either by having clients on your devices, or by inviting other people and their tailscale clients.
Anyone who is not explicitely invited has no access.

What took me some time to learn was integrating not only physical devices, but also virtual containers. What is a virtual container? Basically, systems like Docker or Podman simulate a very slim computer environment specifically set-up and optimized to run one particular software stack. For example I can set up a web blog with the client frontend, backend server and database – each running isolated in their own Docker containers – easy to scale. Here you can find more about the basics of Docker and how to get into it step by step.
I had my first contact with Docker in 2018, but never got around to fully embrace it until now, but grew to love docker-compose quickly. This allows you to create and find recipes to quickly set up full tool stacks easily and self-host your own software infrastructure.

So I was playing and eventually fell into the sweet hole of self-hostable apps, extending my personal toolchain – especially for services for which I never found a good replacement. Now I run my Commafeed RSS reader, a gitea for my most private git projects, Jellyfin as a small media server and netflix alternative, Invidous giving an alternative frontend to Youtube and finally Immich.

What is Immich? I wanted to get rid of Google Fotos. I used the service for a long time with much appreciation, but eventually wanted to have more control over my data on the eve of Google using its foto database for AI training, I wanted to withdraw my pictures and also have better organized backups.
The easiest alternative I can recommend is ente.io which also comes with more tools around data security and multifactor-authentication (MFA). This option is simple to switch to, but still your data is not in your own infrastructure.

Immich has very similar functionality to Google Fotos and quick to set-up with Docker.
You can import your existing fotos either as an external library (very straight forward and simple, but at the cost of small limitations around cleanup options) or by importing all pictures via the API by uploading through the the web interface, the Mobile API, command-line scripts or additional tools like Immich-Go. My photo library has been growing in my filesystem since 2002 and while it is generally well maintained, it slowly became messy, incomplete, metadata was lacking and suffered from duplications. These were all topics Immich and its extended toolchain helped to address.
That is, if the photographs are imported in the “right way”. For me it involved three attempts on my side as image duplications on upload, mistaken metadata and lack of testing my own cleanup scripts (xD) caused several broken attempts with Immich. The software is stable and good, but my ambition in cleaning my library was just too big. May the backups be thanked – these setbacks did not cause any data loss – just wasted time. On the third attempt it worked well.up. I picked Immich as one example, but there are plenty more tools available to self-host and especially play nice with Tailscale.

Immich runs on my NUC 11 in a Docker-Compose setup and thus was now available in my home network, but again I wanted it accessible when I’m away from home. This is where we come back to Tailscale.
Above we only added physical machines to Tailscale, but it is also possible to add virtual containers to the private network. Each container becomes available as its own machine which now becomes available to everyone in your network to access.

Everyone? Oh, yes, I forgot. You can share your private applications in two ways.
You can invite up to 3 people (in the personal free account) to your network and they can have access to all machines if you allow it. Alternative you can share access to single machines to people who already run their own Tailscale network. This way you and your peers are building their own private little part of the internet hosted on your own infrastructure. You can also define machines as exit nodes and thus create your own little distributed VPN. Invite trusted friends over the world and you can run traffic through each other’s exit nodes and now I can watch German Netflix and my friends in Germany can watch Austrian ORF.

Tailscale is providing a good bundle to start your DevOps networking journey. All it offers can be done in other ways with less reliance on a central service orchestrating this network as Tailscale does. However doing this this manually is difficult, complex with a high risk of mistakes that compromises data security – these are factors I’d like to entrust to experts. Tailscale also has a learning curve, but one that is much faster to handle to get into the basics.

Through Tailscale and Docker I have a new toolchain that runs at home, that I have a lot of control over including full ability and responsibility to backup. I picked Immich as one example, but there are plenty more tools available to self-host and especially play nice with Tailscale.

In my next article, I will look into another example, that grew out of Docker and Tailscale at work and that describes a self-hosted alternative approach to a Data Intelligence pipeline in the context of a non-technical company.

My first steps in home automation (Pt1)

I have not been writing code for a year, but my current job is still about providing and choosing technical solutions based on requirements and context. While the company I work for has a strong direction towards GenAI and Microsoft solutions (who doesn’t…), in my private projects I look into the other direction of Small Web, Decentralisation, Self-Hosting and the Rot economy of Tech these days. This also proofed a good opportunity to dive deeper into Home Automation and Docker. It’s an ongoing process, but here I’d like to talk about a few pet projects I did in the last year.

It started back in early summer 2023, I got myself some Shelly smart plugs , installed [Home Assistant]() and began to measure my energy consumption. This ran on my mini-pc – a small Intel NUC 11 Performance – I had been using for a year for backups, but little else. The NUC was an upgrade from a RaspberryPi 3 running dietpi I used for the same purpose. For convenience sake I kept using dietpi also on the NUC 11.

By measuring energy consumption, replacing inefficient devices (ffs get rid of old light bulbs!) I was able to reduce my already low energy consumption by another 20%. Having this visually not only helped reducing total consumption, but also shifting consumption to times windows which are either cheaper by having a lower hourly price or by optimizing for lowest CO2 usage by consuming when most renewable energy is in the grid. Often this coincides with low prices, but not always.

Since working on energy projects professionally and switching to a dynamic energy tariff in February I have been looking more into energy topics. In between I tried to build a predictor that could guesstimate the energy prices for upcoming days based on weather and other factors, but eventually I realized, that this is fruitless as the prices is a negotiated market price based on consumption expectation across all of Europe. To say it simple: the price is not only caused by weather, it’s set to provoke and steer market reaction. I have not the data to predict that.

What is more helpful is experience. On average daily energy is cheapest during the week between 3-4am and 11-2pm. Avoid the 6-8pm evening peak. On the weekend, consume between 11-4pm – sometimes you are lucky and zero to negatives prices. By timing dishwasher and washing machine accordingly, 50% of my consumption falls into the cheapest times.
On a regular day, I have 2kWh consumption split with laundry, kettle and dishwasher each at about 1kWh per run being the most hungry devices. Another 1kWh falls to my Tech and I can see in my consumption, when I run the gaming PC with VR. Despite my below-average consumption, I have been dancing around getting a balcony solar-installation for almost a year. At 300€ these have become sooo cheap… story for another day.

I managed all smart home devices in Home Assistant. in the beginning, this ran on the NUC managed by dietpi. Eventually in Spring this year I reactivated the raspberry after all, to run Home Assistant OS on it instead. This offers some more customization and supervising options, necessary to install more custom plugins and integrations.
Add the Home Assistant App to this and you have a neat remote for your home.
I stopped tinkering here with Home Assistant at this point, although topics like MQTT data broadcasting are still on the list of things I’d like to checkout one day.

Home Assistant at this point was in my local network and only accessible at home. How to make it available remotely and what other infrastructure I started hosting at home, I’ll cover in part two.

In the heavens

Mittwoch, das Telefon klingelt und eine halbe Stunde später sitze ich mit Pizza, Bier und lieber Person in Gesprächen vertieft in nahe liegender Parkfläche. In kurzer Gedankenpause gucke ich in den Himmel – das ist in Berlin eher langweilig, da durch viel zu viel Lichtverschmutzung nur wenig Sterne zu sehen sind. Manchmal hat man aber Glück und es passiert was tolles. Es fliegt was vorbei.

Die Internationale Raumstation ISS umrundet in ~400km Höhe die Erde alle 90 min. Dabei zieht sie immer ein bisschen weiter nach Osten. Aufgrund der großen Fläche an Solarpanelen, reflektiert die ISS sehr viel Sonnenlicht und ist daher auffällig hell am Himmel zu erkennen und merklich schneller als ein normales Flugzeug. Ein Überflug dauert etwa 5-6 min und wenn man es einmal gesehen hat, erkennt man es immer wieder. Neben der ISS gibt es noch Iridium Flares. Iridium ist eine Serie von Satelliten, die ebenfalls stark reflektieren, aber aufgrund ihrer Bahn meist nur ein kurzes Aufleuchten von ~30sek darstellen. Sie können genauso hell werden wie die ISS sein, erscheinen plötzlich am Himmel, ziehen kurz und hell über diesen und verschwinden wieder plötzlich. Ein ganz eigenes Schauspiel. Daneben gibt es noch mehrere tausende andere Satelliten, die aufgrund ihrer Größe, jedoch nicht hell genug zu sehen sind. An klaren Nächten auf dem Land ist die Chance in den Himmel zu gucken und etwas extraterrestrisches am Himmel vorbei ziehen zu sehen sehr hoch. In der Stadt quasi null. Berlin bietet nur ISS oder Iridium Flares und die muss man genau abpassen.

Let’s do some science, let’s spoil some magic. Das Coole, aus den Bahnen der ISS, der Iridiums, Erdposition, Sonnenposition, Ort und Zeit auf der Erde kann man vor bestimmen, wann und wo die ISS oder ein Iridium Flare zu sehen ist. Dafür gibt es Hilfsmittel, mein liebstes ist die App ISS Navigator. Sie zeigt für die folgenden 10 Tage eine Vorschau an überflügen, inklusive prognostizierter Bahn und Helligkeit. Das ist eine kleine feine App, mit der man überall auf er Welt, egal ob in Berlin oder auf Reisen Menschen eine kleine Freunde machen kann, weil – verdammt, ISS, it’s space! Wann hat man schon die Chance mal persönliche Erfahrungen aufzubauen und die Vorstellung, dass dieser kleine wandernde leuchtende Punkt von uns Menschen dort hingeworfen wurde und oben gerade 6 Mensch über uns fliegen, hat fast schon etwas romantisches.
Die ISS hab ich inzwischen so oft gesehen, ich erkenn sie auch betrunken wieder, zeige in den Himmel und freu mich nen Ast.

Mittwoch war seltsam.
Was aussah wie die ISS, passte nicht. Meine App, zeigte keinen Überflug an, die Flugbahn wirkte zu stark Süd-Nord als sonst Nordwest-Südost um diese Zeit. Ebenso für einen Iridium Flare, der erst eine gute Stunde später hätte kommen sollen. Unsicher ob ISS, oder was anderes spannendes, genossen wir einfach den Augenblick.

Am nächsten Tag ließ es mich aber nicht in Ruhe und ich begann die Suche.
Ein Paar Fakten am Rande. Es geht um einen Park in Berlin am 4. Juni 2014, 22:33, Blick Ost-Südost.
Ich fragte etwas rum und bekam einige gute Seiten empfohlen.
Eigentlich hätte mit Heavens-Above schluss sein können, da hier bereits der Überflug für den 4. Juni gelistet ist.
Egal ich suchte weiter Bestätigung. Lange gespielt habe ich mit In-The-Sky, wo man sehr schön Ort und Zeit einstellen und die Bewegung der Objekte am Himmel simulieren kann. Leider nur mit einer Auflösung von einem Schritt pro Minute, was bei 4 Minuten Überflug etwas ungenau ist. Und man kann nur maximal 4 Tage zurück. Aber auch hier wird klar, ja es war die ISS, die wir gesehen haben.

Und noch etwas, was wir hätten sehen können – an dieser Stelle möchte ich noch einmal die Berliner Lichtverschmutzung anprangern (#faustwedel) – zu der Zeit war noch eine Soyus-Kapsel im Parallelflug mit der ISS. Leider ist die verglichen mit dem Fussballfeld der ISS sehr klein und leuchtschwach und war daher nicht durch die Berliner Lichtglocke zu sehen. Sehr schade!

ISS gucken mit Freunden ist bestes ISS-gucken.

Endoskop

Hinter meiner Spüle trat Wasser aus.
Da, das dahin klettern eher beschwerlich ist und ich mir einen Blick der Lage vorab verschaffen wollte hab ich einige Geräte zusammengeschaltet, was in einem Living-the-future-Moment mündete.

Ich hab einen Google-Hangout-Videochat auf dem Rechner angeworfen und mein Nexus7-Tablet und mein Nexus-Phone eingeladen. Das Phone wurde der Kamerakopf, auf dem Tablet konnte ich bequem das Videobild verfolgen.
Out of body experience!

Google Hangout lief, aber es war nicht wirklich flüssig genug. Ich machte mich daher auf die Suche nach Kamera-Streaming-Lösungen, die im lokalen Netzwerk bleiben und damit weniger Bandbreite-Probleme haben.
Es gibt einige Kamera-Streaming Apps, die die ich getestet habe, waren leider keine große Verbesserung, der Feed hat teils zu große Delays und den Videostream dann nicht nur auf dem Rechner, sondern auch auf dem Tablet flüssig zu bekommen, war nicht so einfach wie mal eben Hangout anzuwerfen. Schon ne geile Software!

Wenn ich jetzt mein Smartphone am Stück verschlucke und der WLAN-Empfang gut genug ist könnte ich es als Endoskop benutzen. 8)

Und an der Spüle war nur eine Schraube fest zu drehen.

Fahrstuhlachterbahn

Neulich bin ich das erste Mal Paternoster gefahren.

Das kam eher spontan, nachdem ich erfuhr, dass in einem der Nebengebäude meiner Hochschule ein solcher ist. Rüber, gesucht und sofort ohne zu zögern rein gegangen. Drin stand ich dann so, kicherte in mich rein, als wenn ich in der Achterbahn säße und auf dem Weg nach oben wäre. Es ging nach oben. Viele haben ja schon spekuliert, was am oberen/unteren Ende eines Paternosters passiert, ich aber kann euch nun die Wahrheitâ„¢ erzählen, wenn ihr denn instantane Desintegration und Rematerialisierung ertragen würdet. Daher lasst mich von einem anderen Fnord erzählen. Auf dem Weg nach oben hing zwischen der vorletzten und letzten Etage ein Warnschild. Klassisch rot auf weiß in bedrohlich aussehenden Lettern.

 Achtung, letzte Möglichkeit auszusteigen! Weiterfahrt ungefährlich!

Ein gefährlich aussehendes Schild, dass dir gleichzeitig rät jetzt sofort auszusteigen und gleichzeitig beschwichtigt, dir keine Sorgen zu machen und weiter zu fahren. Du weißt nicht welcher Aussage du vertrauen solltest und du hast eine Sekunde Zeit ehe das Fenster zum Ausstieg weg ist und du mit deiner Entscheidung einem dubiosen zweideutigen Schild zu vertrauen leben musst.
Ich wagte es, naja und den Rest der Geschichte erwähnte ich ja schon… Desintegration, Remateralisierung etc

Kurz um, ein schöner diskordischer Ansatz. Und wenn ich das nächste Mal Achterbahn fahre suche ich an der höchsten Stelle nach dem Schild:

Kann Spuren von Schwerkraft enthalten.

FutureMe

Wenn ich über das Jahr Dinge finde, die ich mir merken will weil ich sie lustig finde und denke “hach das is was für den Dezember!” dann schreib ich mir über FutureMe.org gerne selber eMails in die Zukunft. Dabei kamen bisher 2 Probleme zum tragen.

1. Dieses Mistinternet ist nicht verlässlich und viele Links gehen schon ein halbes Jahr später nicht mehr. Von Youtube will ich gar nicht reden…

2. Ich versteh mein Ich in der Vergangenheit nicht. Dessen Humor muss ja abartig und seltsam sein, wenn ich mir so angucke, was der mir so schickt…

Dies zeigt schon im Kleinen warum Zeitreisen eine schlechte Idee sind.

Aber manchmal schickt er mir auch gutes Zeug: Frohe Weihnacht

Multiple Rubies on one server

I had the ‘joy’ of upgrading to Rails3 recently. The Rails application wasn’t the problem, but making it work alongside another Rails 2.3 application on my server was tough and gave me many headaches. Having multiple ruby- and rails versions proofed to be tricky. There is documentation, but I just couldn’t get my head around it, so I just want to sum up some of my pitfalls and give pointers.

Few words about my setup. I have a Debian server running apache2 with Passenger 3. My system Ruby is 1.8 and my goal was to have one application run on Ruby 1.8.2 (and Rails 2.3) and one on 1.9.2 (and Rails 3.0)

RVM

Ruby Version Management is cool for development and also nice for running multiple environments of Ruby. In my case one with the old Ruby 1.8.7 and a new one for Ruby 1.9.2. You can use rvm on your server, however it does not work as smooth with Passenger as you’d hope. RVM has some very good documentation, but the bit about Passenger failed to tell me what I need. In essence my misconception was, that you’d tell the system-wide Passenger configured in apache to switch to the rvm gemset. It tries to do this, but fails, as it’s still executed by the system-ruby-binary, not the ruby-binary within the rvm set. This means, you have just one rvm gemset from which you can run your app via Passenger within apache. For more Rails applications with different rvm gemset, you need to start them as Passenger Standalone and add them as ProxyPass in the apache2 virtualhosts. This is well described in the Phusion Passenger blog and untangled the knot in my brain!

ProxyPass

So I set up my Rails app as Passenger standalone as described in the article above. I used RAILS_ENV=production to pass the correct environment:

I got a few apache errors as my ProxyPass was not configured correctly. Nothing a good search engine and a look at /var/log/apache2/error.log couldn’t help.

With one exception. My resources, stylesheets, pictures weren’t loaded. The log gave this message:

proxy: DNS lookup failure for: localhost:3000stylesheets returned by /stylesheets/screen.css

This one was nasty, and there weren’t many helpful answers on the net, probably because the solution is so simple when you know whats wrong. My hint: It’s a missing / in the virtualhosts config of the ProxyPass.

Die MSISDN

In der Informatik und besonders wenn es um Datenschutz geht versuche ich mit offenen Ohren durch die Welt zu gehen. Die technischen Möglichkeiten heutzutage Benutzerdaten auszuwerten sind leicht zu unterschätzen und das Missbrauchspotential schnell erschütternd. Gerade spezielle, technische Lösungen zeigen, einfach Erhebung, Auswertung, Weitergabe und Remix der Daten ist.

Ich arbeite seit einigen Monaten in einer Firma in der ich mich mit Web-Entwicklung für Mobiltelefone beschäftige. Dabei konnte ich lernen was die MSIDSN ist. Da ich im Zuge einiger Webrecherche wenig zu dem Thema fand will ich hier kurz was dazu schreiben. Dank an dieser Stelle an Leo, durch seine Reccherche noch gut weiterhelfen konnte.

Konkret wurde ich kürzlich vor die Aufgabe gestellt für einen mobiles Webkatalog Möglichkeiten zu recherchieren, wie von einem mobilen Webseitenbesucher die Handy-Nummer ausgelesen werden kann. Dies sollte den Registrierprozess für das Portal auf Handys vereinfachen. Eigentlich sollte man sich hier schon an den Kopf fassen, dass überhaupt die Möglichkeit in Betracht gezogen wird automatisiert diese Verkehrsdaten abzufragen. Ich meine man stelle es sich vor, man schaltet eine einfache Webseite und von jedem Besucher der sie über ein Mobiltelefon besucht wird die Mobilfunknummer in einer Datenbank gesammelt. Zwar nicht identifiert und signiert, aber immerhin echt und korrekt. Perfekt um sie einfach mal an Werbespammer weiter zuleiten.
Ich war nicht sehr begeistert auf die Aussicht so eine Technik – so vorhanden – zu benutzen, begann aber meine Recherche.

Das Stichwort unter dem das ganze läuft ist “MSISDN”, der Mobile Station ISDN Number.
Jeder mobile Besucher, der eine Webseite laden will, sendet vom Browser einen HTTP-Request ab, der beschreibt, welche Webseite vom Server zurück geliefert werden soll. Kurz gesagt geht es bei der MSISDN nun darum diesen HTTP-Request des mobilen Browsers zu analysieren und zu gucken, ob die MSISDN im Request mitgegeben wird. Die MSIDSN wird nicht vom Browser in den Request geschrieben, der weiß selber nicht auf welchem Gerät, mit welcher Nummer er ist. Die MSIDSN wird auf dem Weg zu Server vom Provider eingefügt. Der vom Browser abgesetzte Request wird über ein Mobilfunkprotokoll (UMTS/3G, GRPS etc) übertragen und vom Mobilfunkprovider über Gateways ins Internet geleitet. An diesen Gateways wird die MSISDN-Nummer zugeordnet, von der der Request abgesetzt wurde.
Auf Serverseite kann der HTTP-Request einfach ausgewertet und die darin enthaltenen Daten (ie die Handynummer) gelesen werden. Hier ist die einzige Frage unter welchem Schlüsselwort die MSIDSN zu finden ist. Dies kann sich je nach Provider unterscheiden, in den Yellow-Pages für mobile HTTP-Requests kann man dies jedoch nachschlagen.

Also prinzipiell gibt es diese Technik und es ist sehr verwunderlich, dass sie außerhalb von Mobiltechnologiekreisen nicht weiter bekannt ist.
Die gute Nachricht ist, dass zumindest in Deutschland die Provider die MSISDN nicht mitschicken. Das oben beschriebene Szenario des automatischen Auslesens ist also zunächst nicht möglich.
Die schlechte Nachricht ist, dass die Technik trotzdem existiert und vorallem, dass Provider Zugriff auf diese Daten vermarkten.

Ich könnte nun als beliebter Handy-Abo-Verramscher an die Mobilfunkprovider herantreten, mit Geld wedeln und meine Webseite für die weitergabe der MSISDN freischalten lassen. Ich würde damit von allen Besuchern, die über diesen Provider kommen die Handynummer an meinem Portal geschickt bekommen und schön mitspeichern können.

Dies alles natürlich ohne, dass der Nutzer etwas davon mitbekommt und ohne, dass er es abschalten kann.
Schöne neue Mobilfunkwelt.

Das tägliche Was-zur-Hölle

Fluchen geht einfach nicht so schön auf deutsch.
TheDailyWTF ist ein Blog, das täglich die schlimmsten Programmierergeschichten erzählt. Geschichten die unsereins die Nackenhaare aufrichten und die wir alle in der einen oder anderen Form schon erlebt haben.

Sehr schön finde ich die Kategorie CodeSOD, die Quellextschnipsel präsentiert, die grottenschlecht bis fremdschämidiotisch sind. Kürzlich hab ich einen solchen Schnipsel eingeschickt, den ich in einer Bildkonvertierungsbibliothek gefunden habe. Es ging darum, dass die Funktion einem zurückgeben soll, ob der Wert x eine Potenz von 2 ist.

/*
=============
checkSizeMake sure its a power of 2.
=============
*/
int checkSize(int x) {
if (x == 2 || x == 4 || x == 8 || x == 16 || x == 32 || x == 64 || x == 128 || x == 256 || x == 512)
return 1;
else
return 0;
}Den Schnipsel hab ich im Februar bei TheDailyWTF eingeschickt und wie ich gerade feststelle wurde er letzte Woche gepostet. Yeah! :)

Re: Was ist weiß?

Dies ist eine Antwort auf Mediocres Frage: Was ist weiß?

Um das zubeantworten muss man sich einige Dinge klar machen. Weiß ist per se keine Farbe, sondern man kann es in einen Farbanteil(Chrominanz) und einen Helligkeitsanteil(Luminanz) aufteilen. Mit diesen beiden Werten kannst du zunächst mal jede Farbe in einem bestimmten Farbraum beschreiben (Achtung, nicht jede Farbe). Weiß ist hierin der Punkt mit höchster Luminanz und gar keiner Chrominanz.
Dies Definiert allerdings nicht WELCHES weiß das ist. Die Luminanz ist in den Farbsystemen nicht definiert. Praktisch kann man sich das so denken: weiß auf einem dunklen Bildschirm ist bekanntlich trotzdem ein anderes weiß als auf einem Hellen.

Was für unsere weitere Betrachtung relevant ist, ist die Beleuchtungsstärke Lux (lässt sich für Fotografen auch in Lumen umrechnen). Die Beleuchtungsstärke beschreibt die Helligkeit des Lichtemitters. Das heißt für unser weiß ist relevant, wie hell die Lichtquelle ist.

Fotografien sind hierbei nicht zu gebrauchen zum finden von weiß in der Realität zu gebrauchen. In der Fotografie wird eine Fläche lichtempfindlichen Materials für einen kurzen Moment dem eindringenden Licht der Linse ausgesetzt. In der Digitalfotografie funktioniert das über CCD-Lichtsensoren. Alleine die Menge an Licht, die dabei aufgefangen wird bestimmt die Helligkeit des Bildes und damit auch die Menge an weiß. Wichtig ist dabei auch die Belichtungszeit, die angibt, wie lange Licht auf dem Träger gesammelt werden soll, ehe sich die Lucke wieder schließt. Schon aus den zwei Gründen, kann man bei Bildern nicht von einer Objektiven Darstellung der Realtität ausgehen.

Dazu kommt, dass technische Geräte größere Limitierungen haben als wir Menschen. Um, dass kurz zu erläutern gehe ich kurz in die Audiotechnik. Ein Mikrofon ist für eine bestimmte Anzahl an Frequenzen und Lautstärken ausgelegt. Wenn du versuchst in ein nicht dafür gemachtest Mikro zu schreien, dann wird das aufgenommene Resultat schrecklich klingen. Was eigentlich passiert ist, dass das aufgenommene Signal in den gegebenen Wertebereich gedrückt und an den Spitzen abgeschnitten wird. Um mal wahrlos Zahlen zu benutzen. Wenn du mit 25 schreist, aber dein Mikro nur 10 kann, dann wird auch der Wert nur 10 haben. In der Fotografie ist es das gleiche, so das bei zuviel Licht das Bild überbelichtet ist und du keine Werte mehr drauß nehmen kannst. Und letztlich, wenn du das geschossene Bild dann auf dem Rechner oder ausgedruckt auf Papier anguckst, dann gibts noch das Problem, dass auch jedes Ausgabe gerät einen eigenen Farbraum hat und damit nicht alle existierenden Farben darstellen kann.

Für den Menschen ist eine andere Betrachtung wichtig. Wir haben die Möglichkeit einen weitaus größeren Helligkeitsbereich wahrzunehmen als die gemeine Kamera. Unsere Iris kann jederzeit die Helligkeit so regulieren, dass wir perfekte Sicht haben und nichts überbelichtet ist. Was für unsere weiß-wahrnehmung noch eine Bedeutung hat ist unser enormes Kontrast vermögen. Je stärker ein Weiß im Kontrast zu einer anderen Farbe steht umso heller/dunkler werden beide Farben wahrgenommen.

Um Kameras mit besseren Lichteigenschaften zu bekommen, die näher an unser sehen herankommen wurde HDR entwickelt. High-Dynamic-Range beschreibt eine Aufnahmetechnik samt Bildformat, um Bilder mit höheren Kontrasten und besserer Farbdarstellung zu erreichen.

Nun bleibt die Frage “Was ist denn nun das Weißeste?” Und die richtige Antwort ist: Kommt drauf an. Es geht immer noch heller, wenn du nur die Lichtquelle heller machst, damit gibt es keine Obergrenze, höchstens eine der Toleranz, weil helle Lichtquellen in den Augen wehtun. Wie können wir aber dann etwas möglichst weißes herausfinden? Wenn es doch bloß eine Einheit gäbe um die Grad der diffusen Helligkeitsreflektion einer Oberfläche zu bestimmen. Man könnte sie Albedo nennen und damit feststellen, dass frischer Schnee mit dem größten Rückstrahlvermögen ist und damit die beste Chance bietet einem das weißeste Weiß zu geben. Darum tragen Skifahrer auch Sonnenbrillen im Winter, nicht ausschließlich weil sie cool sein wollen.

Man merkt, bei Farben ist vieles relativ und eigentlich isses ein wunder, dass wir uns drauf einigen können das Pflanzen grün sind.

Alles so einfach

Achtung, technisch!

Hmpf, da sucht man ne halbe Stunde nach nem einfachen Beispiel wie man in Ruby-on-Rails Slide-Effekte mit JavaScript hinkriegt und findet nur komplizierte Low-Level-Erklärungen und Erläuterung warum Ajax in Rails so geil sei, in die länge gezerrt auf 5 Seiten und ohne eine helfende Zeile Code.

Das prangere ich an! So geht das:

Ins Layout der View der Rails-Seite füge ich die Standard Prototype-Bibliotheken ein, die mit Rails mitkommen.

<% = javascript_include_tag :defaults %>

Mittels Rails-Helper erzeuge ich mir einen Link der die toggle_slide Methode, die in Prototype definiert ist aufruft und auf die div#container anwendet.

<?= link_to_function "Slide me", visual_effect(:toggle_slide, "container", :duration => 0.5) ?>
<div id="container">mein slidender Inhalt</div>

Das wars schon. Mensch is das so schwer, das so einfach zu schreiben. Nungut, mehr Beispiele und weitaus detailierter gibts im Introduction to AJAX in Ruby on Rails with Prototype, Script.aculo.us

Selbstexperiment

Seit knapp 2 Monaten bin ich bei einem Selbstexperiment anderer Art. Eins das auch dieses Blog betrifft: ich twitter.

Ich hab die längste Zeit nicht verstanden wie das geht. Rein technisch betrachtet natürlich einfach: Du hast ein Feld mit 140 Zeichen und schreibst rein. Leute die dir folgen bekommen diese Nachricht zu sehen und wenn du andere leute folgst, dann bekommst du in Echtzeit die Nachrichten, die sie schreiben. In der Theorie einfach, allerdings ist hinter dem Phänomen mehr, besonders in hinsicht auf die Gesellschaftliche Selbstorganisation im System. Twitter ist eigentlich nur ein Dienst ohne Zweck. Der Zweck, der Sinn und die Art und Weise wie man es benutzen kann hat sich komplett in der Gemeinschaft entwickelt und entwickelt sich fortwährend weiter. Ich wollte gerne verstehen wie das läuft, weil ich den Eindruck bekam von draußen sieht man nichts.

Nach draußen hin siehst du nur einen Microblog, eine Liste eines Nutzers. Viele Einträge sind in sich abgeschlossen, die kann man verstehen, jedoch fehlt bei den meisten der Kontext und noch schlimmer, du siehst praktisch nur eine Hälfte einer angehenden Unterhaltung des Schreibers mit seinem Netzwerk. Erst in dem Moment wo man sich registriert, jemanden folgt und damit teil dieses Netzwerks wird began ich zu begreifen wie diese Kommunikation funktioniert. Man bekommt sofort mit wenn etwas geschrieben wird und kann drauf antworten. Je nach Leuten, die man verfolgt kann man mitverfolgen wie Nachrichten wandern. Auf einmal erschließt sich der Kontext und die kurzen Informationshäppchen machen sinn.

Ich hatte etwas erwartet, von fremden unwichtigen Nachrichten erschlagen zu werden. Defakto wirds man aber nicht, weil man selber Einfluss drauf hat, wen man folgt und wievielen. Dabei wählt man natürlich entweder Leute, bei denen man meint, dass sie etwas zu sagen haben, Menschen mit ähnlichen Weltanschauungen, oder auch gern mal ganz anderen. Dadurch das man diese selber wählt kann man auch regulieren mit wievielen Nachrichten man konfrontiert werden möchte. Mit dem richtigen Twitter-Programm ist einer Nachricht ein kurzes Einblenden in der Ecke des Bildschirms. 140 Zeichen sind schnell überflogen und innerhalb einer Sekunden entscheidet sich schon die Relevanz der Nachricht und im Zweifelsfall ist sie weg und man kann weitermachen wo auch immer man war. Ich empfinde es nicht als Störung.

Zum Sozialen aspekt. Dadurch, dass man selber leuten folgt, gleichzeitig Leute hat, die einen selbst folgen ergeben sich zwei Netzwerke. Anders als bei Social-Networks liegt der Fokus aber anders. Man folgt nicht jemandem, weil man ihn kennt (ok, vielleicht auch), sondern weil er relevant erscheint. Wenn man bloß Leute folgt, die man Persönlich kennt, dann wird das Netzwerk sehr homogen und entweder belanglos und langweilig oder sehr repetitiv. Spannder ist es quer Vernetzungen zu finden zu Leuten mit den gleichen oder auch anderen Hobbies, Einstellungen, was auch immer. Dies hilft sehr auf neue Ideen, neue Texte gebracht zu werden, über die man sonst vielleicht nicht stolpern würde. Letztendlich geht es um eine Verbreitung von Ideen und Informationen. Einerseits als Rezipient, andererseits als Sender.

Ich bin 2 Monate dabei und habe 40 Follower, ich lege es nicht darauf an viele Leute als Gefolgschaft zu haben, auch wenn es durchaus noch Ziele gibt, die ich hätte. Man liest von Leuten, die Twitter als antwortende Wolke betrachten können. Hat man eine Frage, fragt man sein Netzwerk und kriegt eine Antwort. Dies erfordert viele Follower, aus sehr vielen verschiedenen Kreisen. Da bin ich noch nicht angekommen und das mag vielleicht noch dauern. Bis dahin geht mein Selbstexperiment weiter. In Echtzeit zu verfolgen.

Diverse Projekte

Heute, Kategorie “Projekte, die in irgendeiner Form eine Notiz verdienen”

Ich hab vor nem Jahr an einigen DDS-Utilities für Java geschrieben. Nen Jahr lang wusste ich nicht was ich mit denen anfangen soll, veröffentlichen? Waren aber noch nicht fertig. Ich hab se jetz Open Source gestellt und den Code kann man bei Github einsetzen und runterladen. Mehr dazu hab ich im Development Blog bei CTDP geschrieben. Fertige Versionen, die auch Menschen benutzen können, die nicht wissen wie ein Compiler geht kommen vielleicht demnächst. Hängt wie immer von der Zeit und der Anzahl der langweiligen Meetings/Vorlesungen ab.

Mein Praktikum bei Tudor in Luxemburg ist sogut wie rum. 4 Monate konnte ich an dem Projekt meiner ehemaligen Bachelor-Arbeit weiterarbeiten und die neue Version ist dieser Tage erschienen. Ebenfalls gilt man schaue ins entsprechendes Devblog.

Bei CTDP gibts eigentlich auch einiges zu erzählen, aber das zu geeigneter Stunde.

Das Lese-Oktett #24

Politik

Verglichen mit dem Netz ist das Leben ein rechtsfreier Raum

Das Theater darf kein brechtfreier Raum sein!

Wissenschaft

7 Man-Made Substances that Laugh in the Face of Physics

Nasa: Moondust and duct tape

2D- Programming language

The Baloney Detection Kit: Entdecke die Pseudo-Wissenschaften

Study about the effectiveness of tinfoil-heads against radio signals: Überwacht die Paranoiden, es ist zu ihrem eigenen Besten!

Codename “Teddybär”: Langwellenradarsender unter Tempelhof vermutet. Würden Tinfoil-hats was bringen würde ich jetzt empfehlen sie aufzusetzen.

Sonstiges

Willkommen bei den Lumen: Immer wieder einhämmern…

Showbashing in Berlin

Amazing long exposure  pictures

Hollywood at war

Lasst euch nicht verarschen: Studiert doch was ihr wollt! Pro-Gesellschaftswissenschaften …

Informatiker – Potentielle Täter: Habt Angst vor mir!

Falscher Planet, Falsches Jahrtausend: Ein Informatiker reminisziert über 20 Jahre Interneterfahrung und den aktuellen Generationenkonflik

Video

Inside Ursula Hitler’s Head

import org.jagatoo.loaders.textures.
formats.TextureImageFormatLoaderImageIOImageInputStream;

Gnihihihihi!