WLAN an der Uni Karlsruhe (DUKATH) mit Ubuntu 8.10

Ubuntu hat inzwischen eine ziemlich gute WLAN-Unterstützung. Lange Zeit konnte DUKATH nur[1] mit einem VPN-Client genutzt werden, inzwischen geht das auch per WPA. Laut Anleitung des Microbit [PDF] soll man ein Skript schreiben um den Zugang zu nutzen. Unter Ubuntu geht es aber auch etwas einfacher:

Auf das Symbol des Netzwerk-Manager-Applet klicken:

Das Netzwerk dukath-??x auswählen.

?? hängt vom Standort ab. Beim RZ gibt es eine Übersicht über die verwendeten SSIDs.

Auswahl DUKATH-Accesspoint

Auswahl DUKATH-Accesspoint

Im darauf folgenden Dialog die richtigen Werte eintragen:

Einstellungen DUKATH

Einstellungen DUKATH

Bei Zertifikat sollte das Deutsche Telekom Root CA 2 Zertifikat ausgewählt werden.

Benutzername und Passwort entsprechen denen bei der Verwendung von VPN.

Fertig!

[1] Der Zugang über das DUKATH Web-Interface sollte nur in Notfällen genutzt werden, da die Verbindung nicht verschlüsselt wird und deshalb einfach abgehört werden kann.

Features are not key to success

At least not for social networks. A blog by Robert Basic about new features at blepper, a German Twitter alternative, got me thinking.

What is the main feature of a social network? Connecting people! And to enable connections between people, you have to reach a critical mass of people first.

There is already a million ways to connect to other people. Facebook, Myspace, LinkedIn, Twitter, and German services like StudiVZ, WKW, XING…

Most of them are not perfect. But just providing a more feature-rich service than an established competitor is a recipe for disaster. Pownce had to learn this the hard way. Facebook never really took off in Germany, because StudiVZ took the German market first. My experience is that almost every German you find on Facebook, met people abroad. She didn’t sign up for the better photo gallery, but for people.

StudiVZ grew big fast and then sucked for a long period of time. Lots of performance and privacy issues. People stayed.

Twitter grew big fast and then sucked for a long period of time. Lots of performance issues. People stayed.

I simply can’t think of one example where a new social network overtook an established competitor due to features.

How 52 words can cost you your job

With some trolling on a blog, some poor guy causes an incredible shitstorm that changed his life. That’s a story only the blogosphere can write. In this case, the German speaking blogosphere*.

  1. It all starts with astupid anonymous comment on a blog, concerning the authors weight.
  2. The author** grabs the commentors IP adress from the logs and posts the matching domain name, revealing that the commentor didn’t give his real name.
  3. The commentor has the balls (or is stupid enough) to reveil his real name and asks for absolution.
  4. Now, the author could have forgotten about the whole thing. Instead, he posts an open letter to the commentors employer (a PR agency) on his blog.
  5. Two days later, the employer raises his voice, announcing that the commentor will be fired.

52 inconsiderate words made the commentor unemployed and probably ruined his name on Google forever*

And this is where the real discussion starts. Don’t get me wrong, nobody likes trolls. And it’s unfair to pick on inferior people. In this case, inferior meaning the fit guy holding a degree in sports picking on an overweight guy. Trolls, let this be your warning.

Still, the consequences seem a bit harsh. As far as I understand the author wasn’t as much upset about the comment itself as about the fact that it was posted under a false name. But where do you draw the line between posting under a false name and posting anonymously? Sure, the mistake of the commentor was to specify a URL. Posting as John Smith is not the same as posting as John Smith, www.smith.com.

But if somebody is clueless enough to post such a comment from his workplace, can’t you assume that it didn’t come to his mind that somebody might think he really is, in fact, the one John Smith from Smith Consulting at smith.com? In dubio pro reo, I’d say the commentors intention was anonymity, not identity theft.

And this is where the pendulum swings back. Just as it is inappropriate for the athlete to pick on the fattie, it is inappropriate for the internet pro to hunt down the troll. Not feeding a troll is not the same as ruining his life.

(via)

* All links in German, sorry.

** Please excuse the whole author/commentor/JohnSmith thing, I didn’t want to make the Google bomb bigger stigmatize the commentor more than it he already is.

Gmail CSRF vulnerability explained

There has been the claim on the blog Geek Condition of a CSRF vulnerability in Gmail. The idea was that an attacker can automatically create a filter in the victims Gmail account to forward sensitive mail to the attackers email. A detailed proof of concept walks you through the steps of exploiting the alleged vulnerability. This attack was supposed to be linked to recent cases of domain theft. The story was picked up by various site, e.g. Heise. Today, Google denied the security hole. So who is wrong?

Indeed, if you follow the detailed instructions, you can craft a URL, which creates a filter upon visit, as long as you are logged into Gmail. This seems scary, but let’s have a closer look.

To create the URL, you have to obtain valid values for a number of parameters. The error of reasoning lies in this paragraph:

Obtaining the at variable on the other hand can be done by tricking a user into visiting a page that contains malicious code that subsequently steals a cookie from the user called GMAIL_AT which is the same as the at variable, just named differently. Once the cookie is stolen the malicious code creates a hidden iframe with a url containing the variables that authorize Gmail to create a filter for your account.

In other words, to create the filter, the attacker has to get the session id from the cookie. As the content of the cookie is only known to you and Gmail, that is not really a fair prerequisite. Once the cookie is stolen, you are pwned anyway. With a valid session id, an attacker can completely control your Gmail account. The creation of a filter doesn’t make much of a difference.

Indeed, Gmail had a CSRF vulnerability in September 2007. Google was upfront enough to note that fact in their post, but it has been fixed a long time ago. It seems that someone barked up the wrong tree in this case.

Don’t get me wrong, there are ways to steal the cookie. But complaining that you can create a filter with a valid Gmail session id is like complaining that you are able to open the trunk of a car if you can get hold of the keys. You could just as easily drive away with it.

Building a site with Django? Start with Pinax!

Some time ago, I watched James Tauber’s talk at DjangoCon about Pinax, a collection of re-usable Django applications. If you are thinking of a collection as a bunch of apps carelessly thrown together, you could not be more mistaken. Pinax is the foundation for a complete social networking site which covers most features you can imagine, the whole nine yards.

Forget django-admin.py startproject! Just do cp pinax myproject, remove some stuff you don’t need, adjust the templates and you are done!

Ok, I might be exagerating a bit, but watch the talk to build your own opinion.

Harald Schmidt dankt ab!

Das war mein erster Gedanke als ich das Schlusslicht des heutigen Tagesschau-Newsletters gelesen habe:

Auf Platzhirsch machen, machomäßig rumtönen – viel mehr braucht es heute nicht, um in  deutschen Medien Karriere zu machen. Allerdings kann es passieren, dass einem ein Olli zur Seite gestellt wird, sollte man einmal schwächeln. Und das kann dann schnell tödlich werden.

Aber wie sich im dazugehörigen Artikel herausstellt, war “Platzhirsch” durchaus wörtlich gemeint.

BarCamp Stuttgart

Dieses Wochenende fand das erste BarCamp Stuttgart statt. Gestern war ich auch dabei, bei meinem ersten BarCamp überhaupt. Ohne allzu genaue Vorstellung was mich eigentlich erwartet, habe ich mich auf den Weg nach Stuttgart gemacht.

Los gings mit einer großen Vorstellungsrunde, bei über 200 Teilnehmer hat das ne ganze Weile gedauert. Danach wurde die Sessions geplant, insgesamt standen 30 Sessions zur Auswahl.

Um 11:30 starteten die erste Sessions, ich entschied mich für Internationalisierung von Webservices mit Mario von kindo. kindo hat eine Strategie der frühzeitigen und umfassenden Internationalisierung verfolgt (Launch mit 6 Sprachen, am Schluss 17, wenn ich mich richtig erinnere). Diese Strategie war wohl mit ein Erfolgsfaktor, mit nur einer Sprache hätte die Plattform wahrscheinlich nur ein Drittel ihrer Nutzer. Interessant war der Punkt, dass man mit den Sprachen Englisch, Spanisch und Chinesisch über die Hälfte der Internetnutzer erreicht. Die Übersetzung von Rechtsdokumenten und die Befolgung von internationalen Rechtsvorschriften ist wohl ein großes Problem. Als StartUp kommt man vielleicht damit durch, wenn man sich zuerst mal um die lokalen Gesetze kümmert.

Nach dem Mittagessen gab’s die Session “Ideen im Social Commerce am Praxisbeispiel” mit Markus und Stephan. Über das vorgestellte Projekt codeME gab es geteilte Ansichten. Die Grundidee, ein Produkt zu erschaffen, das eine Brücke zwischen einer Online-Community und dem Real-Life schlägt, fand ich aber sehr interessant. Es wurde unter anderem die These aufgestellt, dass Produkte nicht nur wegen ihrer Eigenschaften, sondern auch wegen ihrer vermittelten Werte und Gruppenzugehörigkeit gekauft werden. Beispiel Harley-Davidson, technisch vielleicht nicht das beste Motorrad, aber ein Kult. Für einen Marketing-Menschen sicher ein alter Hut, aber trotzdem gut sich das nochmal bewusst zu machen.

Wie bei einem guten Event üblich, hat man die Qual der Wahl zwischen mehreren parallel laufenden Veranstaltungen. So auch bei Session #3 und #4. Zwei Sessions über Recht oder ein zweiteiliger SEO-Workshop? Ich endschied mich für “Neue Gesellschaftsform. Unternehmergesellschaft” mit Malte und “Web 2.0 und Recht. User Generated Content – Chance oder Risiken?” mit Carsten Ulbricht. Hier mal ein paar Stichpunkte:

  • Die neue Gesellschaftsform “Unternehmergesellschaft (haftungsbeschränkt)” kommt wohl (endlich) im November und hat einige Vorteile gegenüber der unter StartUps beliebten englischen Limited.
  • Haftung für User Generated Content: es gibt Pflichten für einen Diensteanbieter (Forenanbieter, Blogger, etc.) gibt, aber es durchaus möglich ist denen nachzukommen.
  • Verwendung von User Generated Content: eine AGB ist kein Persilschein, Vorsicht auf bei der Verwendung von Werken unter Creative Commons (Stichwort Persönlichkeitsrecht)

Zum Abschluss gabs noch eine Session “Gründungszuschuss und finnzielle Unterstützung vom Staat” mit Sascha Konietzke. Der Gründungszuschuss wird für eine Gründung aus der Arbeitslosigkeit gewährt, die Höhe richtet sich nach dem Arbeitslosengeld. Wenn ich es richtig verstanden habe, bedeutet “kein Anspruch auf ALG” automatisch “kein Anspruch auf Gründungszuschuss”. Doof für Studenten, allerdings gibt es für die andere Möglichkeiten zur Förderung, z.B. das Exist Gründerstipendium.

Alles in allem sehr interessante Sessions. Es ergaben sich auch eine Menge interessante Gespräche, besonders beim Abendessen. Apropos Abendessen: Für das leibliche Wohl war während der gesamten Veranstaltung bestens gesorgt. Überhaupt war ich positiv von der phantastischen Organisation überrascht, danke hierfür an Jan, Markus und Carsten und an die Sponsoren.

Mein Fazit: BarCamp ist ne tolle Sache! Das nächste Mal werde ich auch selbst eine Session zu halten und bin auf jeden Fall beide Tage dabei.

Dynamic paths for lazy people

Once your Django project has to run on multiple machines, the absolute paths in settings.py will drive you nuts.

A suggested solution to enhance portability (in German) is to define a PROJECT_ROOT.

import os
PROJECT_ROOT = os.path.dirname(__file__)

And then define absolute paths like this:

MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'site_media')
TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, 'templates'),
)

The downside is, typing os.path.join(PROJECT_ROOT,'foo') twice over and over again, will probably incur the wrath of the DRY gods. But don’t despair, we can do better:

import os
PROJECT_ROOT = os.path.dirname(__file__)
p = lambda *x: os.path.join(PROJECT_ROOT,*x)

Use it like this:

MEDIA_ROOT = p('static')
TEMPLATE_DIRS = (
    p('templates'),
)
MY_NESTED_PATH = p('x','y')

Pitfalls in Django unittests

I’m currently rewriting dwidder [1] and I just spent way to much time on a unit test for the registration view. These are the things that made me stumble:

  1. Write fixtures. Unit tests run on an empty database. Somewhere deep in your code might be a reference to one of the default applications, like django.contrib.sites, which will fail, because there is no default site object in your database.
  2. Don’t subclass unittest.TestCase. Use Django’s TestCase class instead. Otherwise you will miss all the fancy stuff, like automatic fixture loading.
  3. Import mail, not outbox. Django provides a dummy email outbox. But to make it work as expected, you have to import the mail module. If you import the outbox directly, it will always be empty.

[1] a now defunct site where you could tweet by sending an SMS to a German mobile phone number