User Awesomeness

This is more or less a reblog from Joel on Software:

Kathy Sierra at Business of Software 2009


She explains how businesses get successful. Nothing more, nothing less. And I think she is right.

Humans (aren’t that bad) after all.

… as even economists (the scientists, not the practicioneers) find/found out:
Ernst Fehr: How I found what’s wrong with economics.

Fehr studies the outcomes of economic experiments. He finds that the theoretical hard-core “homo economicus” model produces completly different (and often worse) outcomes than the emprical real-life experiments. People seem to put a certain value at fairness.

StarTrek for the masses

The people at CERN who run LHC, probably are more bright than anyone of us. So they are even bright enough to show pretty pictures for those who are not so bright: StarTrek@CERN.

I don’t want to know how many demos they needed to create to get the money for the LHC. I bet they still have more than one 3D artist on board ;)

Science isn’t all flashy and colored. But it’s worth it, anyhow.

Active Pen-Testing

Heute mal eine Idee, die schon länger in meiner Schublade steckt und die nun endlich, aus gegebenem Anlass, mal aufgeschrieben gehört:

Wie wir alle wissen gehört zu Datenschutz (die Wahrung der Informationellen Selbstbestimmungsrechte) auch Datensicherheit (Vertraulichkeit, Verfügbarkeit und Integrität von Daten). Ohne Datensicherheit kann eine Organisation keinen Datenschutz gewährleisten (vermutlich deshalb werden die beiden verschiedenen Aufgaben von den Medien auch so oft in einen Hut geworfen). Wenn Unternehmen nun zu wenig bzw. nicht genug in Datensicherheit investieren, kommt es vor, dass die Daten von vielen Benutzern in die Öffentlichkeit gelangen. Ein Vorgang der immer mal wieder vorkommt, so z.B. bei studiVZ, schülerVZ, haefft.de oder nun aktuell ruf-jugendreisen.de. Auf den ersten richtig großen Skandal bei Bundesbehörden dürfen wir noch warten (Elektronischer Personalausweis, ELSTER, Gesundheistkarte anyone?), bei Landes- oder Lokalbehörden kommt das ja hin und wieder schon mal vor. Den betroffenen Kunden der jeweiligen Unternehmen entsteht dabei ein Schaden der nicht von den Unternehmen beglichen werden muss (die Bußgelder der Datenschutzbeauftragten sind lächerlich, wenn sie überhaupt verhängt werden), obwohl Sie mit genau diesen Daten vermutlich jahrelang Gewinn gemacht haben. Dieser Vorgang, dass eine Organisation auf Kosten anderer Gewinn macht, nennt man unter Ökonomen eine Externalität. Zur Lösung des Problems ist die Internalisierung der Kosten, die bei einem Datenverlust im Moment noch bei den betroffenen Nutzern anfallen, in der Kostenrechnung des Unternehmens oder der Behörde. Dies kann auf verschiedenen Wegen geschehen. Ein Weg der im Moment schon beschritten wird, ist eine staatliche Regel: Wenn du keine ausreichenden technischen und organisatorischen Maßnahmen ergreifst um Datenschutz sicherzustellen, musst du X Bußgeld bezahlten (BDSG, §9).

Nun, Regeln sind eine eigene Sache. Sie funktionieren ungefähr so: Entdeckungswahrscheinlichkeit * Strafhöhe = Risiko (Kosten). Wenn der Gewinn aus der Handlung nun größer ist als das Risiko durch die Strafe, dann sagt die Theorie, dass man gegen die Regel vernünftigerweise verstoßen wird (wer hat z.B. noch nie mal kurz im Halteverbot gehalten). Wenn die Bußgelder der Datenschutzbeauftragten also sehr niedrig sind, ist es ökonomisch sehr sinnvoll für die Firmen gegen die Regel zu verstoßen. Ein Weg in die richtige Richtung wäre also zum einen die Bußgelder zu erhöhen. Es gibt jedoch noch einen zweiten Faktor in der Gleichung: die Entdeckungswahrscheinlichkeit. Würden wir sie erhöhen, würde der gleiche Effekt eintreten. Nun ist mir nicht bekannt, dass sich irgendjemand diesen Effekt aktiv zu Nutze macht. Kein Unternehmen und keine Behörde muss befürchten, dass der Bundesdatenschutzbeauftragte bei ihnen unangemeldet an die Tür klopft und mal fragt wie es so um die technischen und organisatorischen Maßnahmen steht. Würde er das tun können, so würde auch noch ein weiterer Effekt im Kontext von Regeln in Kraft treten: Risikoaversität. Dieses Prinzip besagt, dass Menschen beim Einschätzen von Risiken (wie dem Risiko, einen Datenskandal zu erleiden) dazu tendieren die Eintrittswahrscheinlichkeit von negativen Ereignissen zu überschätzen, gegeben Schadenshöhe und Eintrittswahrscheinlichkeit sind in einem bestimmten kritischen Bereich, denn es gibt umgekehrt auch Situationen in denen wir risikoaffin handeln (z.B. wenn wir Lotto spielen) und das Risiko unterschätzen. Die Aufgabe des Staates ist es nun, Strafmaß und Eintrittswahrscheinlichkeit in einen effizienten Bereich zu verschieben.

Und nun zur Conclusio: Warum tut er dies nicht für den Datenschutz? Zum Beispiel durch aktive Überprüfung der technischen und organisatorischen Sicherheitsmaßnahmen nach §9 BDSG. Oder noch provokativer: Warum haben wir keine aktive Pen-Testing Behörde, die:

  1. private Unternehmen überprüft
  2. staatliche Behörden überprüft

Ich fordere staatliches Pentesting gegen Behörden und Unternehmen!

(man beachte dabei das Grundrecht auf Gewährleistung der Vertraulichkeit und Integrität informationstechnischer Systeme)

Jobpy released (pp is good, jobpy is more special)

Hello world Jobpy!

As part of my diploma thesis I needed a multithreaded job producer/consumer architecture implementation with at-least-once semantics. To make testing easier I implemented the architecture and semantics part in a seperate framework and made sure it worked well. The code is pretty java-ish which I’m not all that happy about, but I thought that maybe it could be of use for someone anyway. So I created a little sourceforge.net project for jobpy.

You may ask yourself now why the hell to use jobpy when there is also parallelpython (aka pp). Well, there are some problems with pp - E.g. it’s pretty hard to share ressources like a socket or a database among the consumer threads because the jobs have to be serializable. But sometimes data structures cannot be serialized and you would have to code around this limitation. Jobpy is not designed to replace pp, it’s just a solution for the special case of multithreaded producer/consumer job processing with optionally shared ressources.

How many cities has the world?

So this is what I did this weekend: For my diploma thesis I needed a list of all the cities of the world (to filter text collections). There already exist corpora like the “Getty Thesaurus of Geographic Names” but they are not free and way over my needs - I just want a list.

Who could have such a list? First try: IATA airport list from wikipedia. Parsed. Erroneous (typos, problems with parsing…). Second try: openstreetmap.org.

And here is where the story begins. Openstreetmap.org collects geographical knowledge in a huge database and publishes it under a free license (CC-BY-SA). The database dump can be downloaded as a huge XML file which currently is about 5GB in bzip2 compression. The expected ratio for decompression is 10:1 so this is a fricking 50GB XML file. The structure is fairly simple. There are nodes, ways and relations and these can have tags. The tags then encode information like “this is a place of the kind city” or “its name is Footown”. To get this information I wrote a little python script that iterates over every line and extracts the relevant parts with some regular expressions. A run on the 5MB bzip2ed relations file took 17s. Well … that was to slow. So I removed the regexps and did some dirty by-hand parsing. 8s. Better. But still to slow.

So, next step: C.
The evil thing!


But, you have to admit - there’s nothing else when it comes to performance. About six hours of coding later I got the first results: 3.5s for a 1,170,000 lines XML file. Good. After some further improvements I got it down to 2.6s. Yeah! :)

On a 1.6GHz Core2 Duo the combination of bzcat and grepplaces.c (both running on one core) gives around 1.2MB/s reading speed on the bzip2ed planet-file. So a complete scan over the planet-file now takes about 70 minutes.

So, here’s the code: http://cleeus.de/grepplaces/

The extracted corpus will follow, as soon as it’s ready.

So long, some statistics:


$ grep “^city” places_planet.txt | wc -l
4179
$ grep “^town” places_planet.txt | wc -l
29401
$ grep “^village” places_planet.txt | wc -l
249716