Bitte Beachten: Dieser Blog wird hier nicht weiter geführt! Kommentare und neue Blogposts gibt es unter http://feitel.indeedgeek.de. Dort bitte auch neue Kommentare zu diesen Beiträge erstellen.

Donnerstag, 19. November 2009

Stopp! Hier gehts nicht weiter

Es hat sich ja schon rum gesprochen. Ich will endlich von blogger.com weg und auf meine eigene Plattform.

Nun ist es endlich so weit! Weiter gehts auf http://feitel.indeedgeek.de/.

Ich würde mich freun wenn ihr alle eure RSS feeds aktualisiert und mit mir umzieht. Sehr gerne würde ich auch ein Ändern meiner Links in euren Kommentaren sehen. Aber natürlich nur wenn es euer Frontend/Datenbank auch hergibt.javascript:void(0)

Freitag, 2. Oktober 2009

vim-Mastery: Up and Down

Wie oft vertippt man sich und schreibt ein Wort klein statt groß oder man möchte eine Variable in Großbuchstaben haben? Mir geht es jedenfalls oft so, dass ich die Groß/Kleinschreibung von Buchstaben oder ganzen Worten ändern möchte. Und wer hätte es gedacht? Vim bietet natürlich auch genau das.

Toggle Case

Um ein Kleinen Buchstaben groß zu machen oder eben umgedreht reicht ein ~. Optional lässt sich das wie gewohnt mit den Bewegungsoperatoren verknüpfen. Dann braucht es ein g~{motion}. So würde zum Beispiel g~w die Groß- und Kleinschreibung eines Wortes ändern. Hilfreich ist auch ein b~w welches zu dem ersten Buchstaben des letzten Wortes springt, diesen entsprechend verändert und dann wieder ein Wort nach vorne geht damit man weiterschreiben kann. Das ganze geht natürlich auch im visuellen Modus. g~~ verändert die gesamte Zeile.

Groß und Klein

Um ein Bereich explizit groß oder klein zu schreiben ist u bzw. U zuständig. Da die Taste im Bewegenmodus allerdings schon belegt ist, muss man ein g davor schreiben. So würde zum Beispiel gUw das gesamte nächste Wort groß schreiben (guw äquivalent für klein). Im visuellen Modus wird das g davor nicht benötigt und es reicht ein u bzw. U. Wie oben beim Toogle schon gesehen, verändert gUU die gesamte Zeile.

Merkzettel

~
Invertieren der Groß-/Kleinschreibung für ein Wort

Der Rest ist gleich für ~-Toggle, u-Klein- und U-Großschreibung

g~{motion}
Invertieren des Textes während der Bewegung
g~~
Invertieren der gesamten Zeile
{Visual}~
Invertieren des selektieren Bereiches

Donnerstag, 1. Oktober 2009

Open Access im Mitmachweb - Teil 2

Open Street Map

Da ich schon im ersten Teil mit Geodaten angefangen habe, mache ich hier gerade weiter. Openstreetmap basiert genau auf dem bereits erwähnten Prinzip. Als Nutzer profitiert man von sehr aktuellem und detailierten Kartenmaterial. Vor allem in großen Städten übertrifft die Aktualität Google Maps bei weitem. Zudem finden sich dort noch viele zusätzliche Informationen wie Briefkästen oder Telefonzellen. Als Programmierer kann man über Abfragen auf die zentrale Datenbank zugreifen und so zum Beispiel alle Kindergärten im Umkreis von 10 km abfragen. Das Einfügen von neuen Daten funktioniert über verschiedene Editoren in die man aufgezeichnete GPS-Tracks einblenden lassen kann und dann dort Bereiche zum Beispiel als Straße oder Feldweg nachzeichnet.

Musicbrainz

Eines meiner liebsten Projekte und gleichzeitig wohl auch eines der unbekannteren ist Musicbrainz. Wer mal versucht hat seine Musiksammlung zu ordnen wir feststellen, dies ist ohne Hilfe fast unmöglich. Künstler veröffentlichen auf verschiedenen Alben und Compilations das selbe Lied in den unterschiedlichsten Variationen. Um also sagen zu können welches Lied man gerade vor sich hat müsste man eine Vielzahl von Parametern mit allen veröffentlichten Versionen vergleichen. Musicbrainz hat hier eine offene Datenbank mit über acht Millionen Tracks aufgebaut. Hier werden von Album Covern, Homepages, Lizenzen bis hin zu Covern der Lieder alle möglichen Metainformationen gespeichert. Bearbeitungen von Infos müssen erst durch ein Review-Verfahren, wodurch eine recht gute Qualität gewährleistet ist. Die Daten können über eine API abgefragt werden. Zusätzlich existiert ein sehr guter Client der sogar ein ganz brauchbares, automatisches Erkennen unterstützt. So lassen sich komfortabel Dateien Tracks zuordnen. Einmal diese Zuordnung erbracht wird eine eindeutige ID in den Metadaten gespeichert (die selbstverständlich auch mit den Daten abgeglichen wird).

Jamendo

Da man ja kommerzielle Musik kaum noch zahlen kann und die Radiosender auch immer schlechter werden, kann ich jedem nur einmal nahe legen sich freie Musik anzuhören. Jamendo bietet unglaublich viel Musik zum online hören und herunterladen. Es gibt dort viel schlechte Musik aber mit ein bisschen Suchen finden sich dort großartige Perlen. Zudem kann man selbstverständlich auch selbst Musik dazu betragen und auf etwas Geld durch Spenden oder zumindest Popularität hoffen.

Projekt Gutenberg

Dieses Projekt versucht Bücher, die aufgrund ihres Alters als Allgemeingut zählen (und somit von keinen Copyright-Ansprüchen betroffen sind), zu digitalisieren und frei zur Verfügung zu stellen. Ich selber habe damit noch nichts gemacht finde aber die Idee dahinter sehr unterstützenswert. Details gibt es bei Aaron, der vor längerem mal darüber berichtet hat.

Openlibrary

Openlibrary versucht die eindeutige Auflistung aller veröffentlichen Bücher mit ihren entsprechenden Metainformationen frei zugänglich zu machen. Dies funktioniert ähnlich wie bei librarything mit dem Unterschied, dass man bei Librarything ein Buch "forked" und dieses dann in seiner eigenen Sammlung editiert (wenn ich das richtig verstanden habe). Openlibrary funktioniert eher wie ein Wiki welches man bearbeiten kann.

Andere Projekte

Neben diesen Projekten, die ich mal beispielhaft herausgegriffen habe, gibt es noch eine Vielzahl von unterstützenswerten Projekten. Allein unter dem Dach der Wikimedia Foundation zu der auch Wikipedia gehört finden sich viele Interessante Ansatzpunkte die sicherlich ein Blick wert sind. Allerdings heißt es aufpassen, da einige Seiten wie zum Beispiel leo.org oder imdb, von denen ich eigentlich dachte sie geben ihre Daten ebenso frei, dies keineswegs tun. Im Zweifel lieber nach offen Alternativen Ausschau halten bevor man seine mühevoll erarbeiteten Daten an ein kommerzielles Unternehmen verschenkt.

Wenn ihr noch erwähnenswerte Projekte kennt, würde ich mich über eine Auflistung in den Kommentaren freuen!

Dienstag, 29. September 2009

Open Access im Mitmachweb - Teil 1

Ja, ich weiß, die meisten von euch können es schon nicht mehr hören. Spätestens seit die die gängigen Buzwords in den Massenmedien ihre Heimat gefunden haben, ist man froh wenn einem nicht ständig jemand Twitter und Co erklären will. Aber das habe ich auch gar nicht vor. Ich denke jeder der mich kennt, weiß das ich sehr viel Wert auf freien Zugang und offene Lizenzen lege. Das Problem ist nur, die meisten der Daten die wir täglich konsumieren sind eben nicht frei. Firmen haben diese Daten mit ausschließlich kommerziellen Hintergedanken gesammelt und verwenden sie auch, mehr oder weniger offensichtlich um damit mehr Geld zu erwirtschaften. Einfache Werbeeinblendungen sind da meist noch das geringere Übel. Zudem erlauben die Nutzungsauflagen nur eine sehr beschränkte Weiterverwendung. Dies kann gerade bei einem Kreativen "Remixen" also sprich aufbereiten, anreichern oder verknüpfen schnell zur unangenehmen Überraschung führen.

Um ein konkretes Beispiel zu nennen: Google Maps. Google Maps hat sich in den letzten Jahren den Platz als Allheilmittel für Geodaten wie Landkarten, Wegbeschreibung, Location Based Services oder Satellitenbilder, erkämpft. Man kann die Karten soweit kostenlos einfach über die Weboberfläche nutzen und es gibt sogar eine Schnittstelle über die man Karten auf der eigenen Seite anzeigen kann. Wo ist nun der Haken? Stellen wir uns einmal vor Google beschließt morgen doch evil zu sein und ändert die Nutzungsbedingungen, was sie ja beliebig tun können. Plötzlich muss man für das Einblenden Geld bezahlen oder man kann die Karten nur noch nach Registrierung einsehen. Nichts könnte man dagegen unternehmen. Google kann somit mit allen Nutzern machen was sie möchten ohne das man sich irgendwie dagegen wehren kann. Gut, Viele werden nun sagen, das macht Google sowieso nicht aber nehmen wir ein anderes Beispiel: Ich bin das nervige Webinterface leid und programmiere einen Desktop Client der Teile der Karten runterlädt und zwischenspeichert. Auch hier kommt mir Google in die Quere da sie mir auferlegen auf die Daten nur über ihre vorgegebenen Nutzungswege zugreifen zu können. Mir sind erneut die Hände gebunden da ich eben mit den Daten nicht das machen kann was ich gerne machen möchte. Zudem wird dem ein oder anderen schon die veralteten Daten aufgefallen sein. Google kauf nur in sehr unregelmäßigen Abständen aktualisierte Daten ein, so das einzelne Karten durchaus ein paar Jahre alt sein können. Nun weiß ich aber genau, dass die Straße vor meinem Haus anders heißt und trotzdem navigiert mich Google jedes mal falsch weil eben der Name nicht passt. Man könnte nun versuchen Google auf den Fehler aufmerksam zu machen aber glaubt mir ihr werdet damit kein Erfolg haben.

Wie schön wäre es wenn es nun neben Google Maps auch Datenbestände gäbe auf die ich frei zugreifen kann. Die ich frei bearbeiten, verteilen und weiterverarbeiten kann ohne das Google oder sonst wer mir vorschreiben kann wie und zu welchen Bedingungen ich diese nutzen darf. Das Problem hierbei ist allerdings der Preis solcher Daten. Gerade Geodaten sind sehr teuer wenn man diese einkaufen möchte. Da wird wohl kaum jemand her gehen und diese, nachdem er sehr viel Geld dafür ausgegeben hat, einfach verschenken. Deshalb geht man einen anderen Weg und nutzt die Masse der Leute. Wenn man jeden bittet seine Straße vor dem Haus in einer Karte einzutragen so hat man anschließend eine aktuelle, weitgehend fehlerfreie Karte die jeder nutzen kann, ohne das jemand sonderlich viel Mühe rein gesteckt hat.

So und hier fängt nun mein eigentliches Anliegen an. Es gibt viele Projekte die ein solches freies Wissen aufbauen. Doch man wird kaum alle überreden können ihre Straße einzutragen. Allerdings reicht es schon wenn sehr viele Leute möglichst viel eintragen. Dann hat man auch schon eine recht brauchbare Karte. Deshalb herrscht bei solch freien Projekten, die durch ihre Mitglieder angetrieben werden, ein notorischer Mangel an Arbeitskräften. Ich möchte deshalb an dieser Stelle einige mehr oder weniger bekannte Projekte vorstellen die meiner Meinung eine aktive Beteiligung verdient haben.

Da die Überlänge meiner Artikel allerdings langsam zu einem notorischen Problem wird und die Einleitung nun schon wieder den Rahmen Sprengt, gibt es die eigentliche Vorstellung der Projekte erst in den nächsten Tagen.

Sonntag, 27. September 2009

Wählen mit Bleistift

Ich habe heute zum ersten mal in Heilbronn gewählt und war doch schwer verwundert. Ich habe nur ein Faber Castell Bleistift vorgefunden, mit dem ich meine Kreuzchen machen sollte. Empört hab ich natürlich gleich mal gefragt wie das sein kann. Die Aufsicht hat mich mit den Worten "Wir haben sowieso keine Radiergummis hier" versucht zu beschwichtigen.

Anscheinend muss ich ein etwas entsetztes Gesicht gemacht haben denn die Frau neben ihm ist gleich eingesprungen und erklärte mir das es sich um einen Kopierstift handelt. Ich wusste gar nicht das es so etwas überhaupt gibt.

Immer noch etwas skeptisch über die Farbe, die aussah wie ein Bleistiftstrich, habe ich zuhause gleich nachgeforscht und tatsächlich gibt es Kopierstifte die trocken aussehen wie Bleistifte und erst wenn man sie nass macht ändern sie ihre Farbe in violett. Schade, dass ich das nicht schon beim wählen wusste. Den Selbstversuch hätte ich mir nicht entgehen lassen.

Ist das normal? Ich hatte bisher immer Briefwahl gemacht, von daher weiß ich nicht ob dies überall so ist. Nächstes mal spendiere ich denen ein Kulli (nachdem ich den Stift nass gemacht habe um zu testen ob die mich nicht angelogen haben).

Und wenn der Beitrag sowieso schon Off-Topic ist leg ich doch glatt noch eins darauf. Aktuelle Hochrechnung: Piraten 2%!! Sogar auf der Tagesschau-Webseite als eigene Partei gelistet und nicht unter "Andere" geführt! ... Nur das mit Schwarz-Gelb scheint wohl sicher :(

Samstag, 26. September 2009

vim-Mastery: Eingerückt

Tabs, Space (oder beides)?

Es ist ja ein längerer Streitpunkt zwischen Entwicklern, mit welchem Zeichen eingerückt wird. Vim bietet an dieser Stelle drei verschiedene Möglichkeiten:

  • Einrückung mit Tabs - Jede Einrückung wird einfach durch ein Tab-Zeichen ersetzt. Dies ist die Standardmethode in den meisten Editoren so auch in vim. Steuern lässt sich dies mit der Option noexpandtab
  • Einrückung mit Leerzeichen und Tabs - Da Tabs sehr schell sehr hässlich werden, wenn man sie nicht konsequent umsetzt gibt es die Möglichkeit die Breite eines Tabs konstant (default: acht Zeichen) zu lassen aber nur mit weniger einzurücken (shiftwidth). Also zum Beispiel Einrückung vier Zeichen, Tabbreite acht Zeichen: Einmal Tab bedeutet vier Leerzeichen werden eingefügt. Zweimal Tab machen ein wirkliches Tab. Und bei drei wären es ein Tab und 4 Leerzeichen. Setzen lässt sich das über smarttab.
  • Einrückung nur mit Leerzeichen - Jeder Tab wird einfach durch die angegebene Anzahl von Leerzeichen ersetzt. Dies ist auch die von mir favorisierte Methode da nichts irgendwie verhauen wird wenn jemand anderes eine andere Breite von Tabs verwendet. Einstellen lässt sich die Option einfach durch expandtab.

Breite der Einrückung

Hierfür gibt es zwei Optionen. Einmal tabstop und dann noch shiftwidth. Üblicherweise sollte man beides auf den selben Wert lassen. Nur wenn man, wie oben beschrieben, Tabs und Leerzeichen mischen möchte, dann gibt tabstop an wie viele Leerzeichen durch ein Tab ersetzt werden und shiftwidth setzt die Breite einer Einrückungsstufe

Automatische Einrückung

Vim unterstützt selbstverständlich auch eine automatische Einrückung. Hierfür gibt es verschiedene Mods. Einmal gibt es autoindent welches einfach die Einrückung der letzten Zeile in die nächste übernimmt. Etwas Schlauer ist da smartindent. Hierbei werden einige Keywords und geschweifte Klammern beachtet. Diese beiden Methoden bilden die Basis und können immer aktiviert bleiben.

Unabhängig davon gibt es spezielle Einrückungen für eine große Anzahl von Sprachen. Einmal wäre da das eingebaute cindent welches sich auf Einrückung für c spezialisiert. Da man meistens aber doch an anderen Sprachen als c arbeitet gibt es die Möglichkeit einige Einrückungs-Schematas, die in den meisten vim Installationen mitgeliefert werden, zu aktivieren. Hierzu reicht ein einfaches filetype plugin indent on. Hierdurch versucht vim beim laden der Datei durch die Dateiendung oder Shee-Bang-Zeile zu erkennen um welche Art von Datei es sich handelt und lädt das entsprechende Profil. Die installierten Profile liegen in einzelnen Dateien im indent Ordner von vim.

Für die vimrc

Merken wir uns also folgende Optionen für unsere vimrc:

" use only Spaces
set expandtab
" indent with two spaces
set tabstop=2
set shiftwidth=2
" nativ indent detection
set autoindent
set smartindent
" activate language detection
filetype plugin indent on

Commands

Kommen wir nun zu der Anwendung.

Ein-/Ausrücken

Ist man gerade im Einfügemodus kann man einfach mit strg+T eine Stufe einrücken bzw. mit strg+D eine Stufe wieder ausrücken. Viel flexibler ist man allerdings im Befehlsmodus. Hier lassen sich < und > verwenden um entsprechend die Einrückung zu verändern. Am einfachsten über << und >>. Dies verrückt einfach die aktuelle Zeile um eine Stufe. Möchte man nun mehrere Zeilen verrücken dann kann man auch <{motion} verwenden. Motion ist hier jede beliebige Bewegung wie man sie in vim kennt. (G = bis zum Ende des Dokumentes, 35G = bis zur Zeile 35, 3j = 3 Zeilen nach unten, etc...) Interessant ist hierbei das man auch wie gewohnt den letzten Befehl mit . wiederholen kann. Also würde >4.. vier Zeilen drei mal einrücken. Wer sich da noch etwas unsicher ist kann auch erstmal im visuellen Modus alles markieren und dann einfach die markierten Zeilen mit > einrücken. Beispiel: V2j3> rückt die nächsten zwei Zeilen drei mal ein.

Und zum Schluss noch der Kommandozeilenmodus: Hier kann man mittels :left X angeben, dass die Einrückung der aktuellen Zeile (mittels angegebenem Bereich auch mehr als nur die aktuelle Zeile) auf X gesetzt wird.

Für den Spickzettel:

Sorry aber ich habe mal das mehr oder weniger aus der vim Hilfe übernommen. Ich glaub übersichtlicher hätte ich es nicht ausdrücken können.

<{motion}
Shift {motion} lines one shiftwidth leftwards.
<<
Shift [count] lines one shiftwidth leftwards.
{Visual}[count]<
Shift the highlighted lines [count] shiftwidth leftwards.
:[range]<
Shift [range] lines one shiftwidth left. Repeat '<' for shifting multiple shiftwidths.
:[range]< {count}
Shift {count} lines one shiftwidth left, starting with [range] (default current line). Repeat '<' for shifting multiple shiftwidths.
:[range]le[ft] [indent]
left align lines in [range]. Sets the indent in the lines to [indent] (default 0).

Automatisch Einrücken

Und jetzt das Beste. Wer sich ärgert, dass seine Einrückung nicht mehr stimmt soll einfach mal ={motion} ausprobieren. == korrigiert die aktuelle Zeile und wie gewohnt lässt sich dies mit dem visuellen Modus etc kombinieren (siehe oben < Operator). So rückt zum Beispiel ein gg=G den kompletten Text ein.

Misc

Eigentlich wollte ich ja mit diesem Beitrag die komplette Einrückung in vim erschlagen aber irgendwie ist es schon wieder viel zu lange geworden und ich bin immer noch nicht fertig. Es gibt noch Plugins die bei der Einrückung unterstützen und Einstellungen die ein detailiertes Konfigurieren ermöglichen. Was man aber auf jeden Fall noch kurz erwähnen sollte ist einmal :retab welches hilft die Einrückung von Text zu ändern. Und ganz wichtig die Option paste welche, wenn aktiviert einige Optionen so verändert, dass der eingefügt Text nicht durch automatische Einrückung verunstaltet wird. Einfach das nächste mal testen, wenn ihr Text vom Browser in vim einfügt.

Sonntag, 13. September 2009

VPN Schmerzlos

Jedes mal wenn man es verwenden muss ärgert man sich erneut: Immer dann wen man es am wenigsten brauchen kann bricht die VPN Verbindung zusammen und der laufende Download, die SSH Verbindung oder was auch immer grade wichtig war, bricht zusammen. Oder anders herum: Man scheut das Einwählen da man ein Wechseln der IP Adresse grade nicht gebrauchen kann. Viele Applikationen reagieren darauf sehr ärgerlich.

Heute hat es mich einmal zu viel aufgeregt und ich habe beschlossen etwas dagegen zu tun!

Wo ist das Problem?

Schaut man sich ohne VPN seine Routing Table an schaut alles wunderbar aus. Netzinterner Verkehr (192.168.188.0/24) wird direkt ohne Router über das wlan0 Interface gerouted. 127.0.0.0/8 geht über das loopback Device und alles andere wird über wlan0 an den Router bei 192.168.188.1 geschickt.

# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Wählt man sich nun ins VPN ein bekommt man folgendes Bild zu sehen:

# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
193.197.62.114  192.168.188.1   255.255.255.255 UGH   0      0        0 wlan0
141.7.73.73     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 tun0
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Was ist nun passiert? Zum einen wurde ein neues Device hinzugefügt (tun0). Alles zu der IP Adresse 192.197.62.144 geht über wlan0. Ich nehme mal an dies ist der Eintrittspunkt ins Netz. 141.7.73.73 geht über das tun0 Device. Dies ist der VPN Server auf dem man sich anmeldet. Nun kommen die bereits gekannten Regeln mit einer Ausnahme: Vor der default Route über meinen Router kommt eine andere Route die alles über das tun0 Device leitet. Das heißt so viel wie alles was nicht an 193.197.62.114, 192.168.188.0/24 oder 127.0.0.0/8 geht wird auf tun0 geleitet und geht somit nicht mehr über meinen Router raus. Möchte ich nun eine Webseite wie indeedgeek.de anschauen muss ich erst über VPN ins Hochschulnetzt gehen und dann von dort wieder raus zu indeedgeek.de. Als Beweis ein Traceroute (wer sich wundert: Das Tool heißt tcptraceroute und geht einfach auf Port 80 da ein normaler traceroute geblockt wird).

# tcptraceroute indeedgeek.de
Selected device tun0, address 141.7.73.73, port 34815 for outgoing packets
Tracing the path to indeedgeek.de (92.51.129.99) on TCP port 80 (http), 30 hops max
1  141.7.75.254  57.261 ms  56.569 ms  56.535 ms
2  FH-Heilbronn1.belwue.de (129.143.124.33)  57.533 ms  56.640 ms  56.714 ms
3  Ulm1.belwue.de (129.143.1.70)  63.486 ms  62.116 ms  61.594 ms
4  Stuttgart1.belwue.de (129.143.1.161)  64.684 ms  73.933 ms  62.531 ms
5  Stuttgart2.belwue.de (129.143.1.25)  62.430 ms  63.443 ms  64.647 ms
6  Frankfurt1.belwue.de (129.143.1.130)  68.713 ms  68.232 ms  70.087 ms
7  xe-0-3-0.cr-merak.fra2.hosteurope.de (80.81.193.239)  78.019 ms  74.123 ms  71.746 ms
8  * xe-0-1-0.cr-altair.cgn2.hosteurope.de (80.237.129.86) 74.100 ms  74.901 ms
9  xe-0-3-0.cr-pollux.cgn3.hosteurope.de (80.237.129.65)  74.367 ms  72.913 ms  75.388 ms
10  xe-16-1.cs-master.r1.cgn3.hosteurope.de (80.237.129.118)  80.181 ms  81.041 ms  74.501 ms
11  * * *
12  indeedgeek.de (92.51.129.99) [open]  81.123 ms  80.154 ms  82.230 ms

Das heißt ich habe von außen nicht mehr die IP Adresse meines DSL-Anschlusses sondern die IP Adresse des Hochschulnetzes. Dieser Wechsel der IP wird von den meisten Programmen sehr übel genommen. Vor allem da er zwei mal auftritt: Einmal beim Einwählen und dann wieder beim Trennen der Verbindung.

Die Lösung

Wenn man sich innerhalb des Hochschulnetzes befindet (z.B. Wlan) dann hat man keine andere Wahl: Wenn Internet dann nur über VPN. Da ist das Einwählen nicht so tragisch da zuvor ja noch keine Internetverbindung bestanden hat. Möchte man aber von Außen auf Dienste innerhalb der Hochschule zugreifen kommt mein Kritikpunkt ins Spiel. Dann hat bereits eine Verbindung bestanden die nun im Grunde getrennt wird und von einer anderen IP erneut aufgebaut werden muss.

Und genau dagegen möchte ich etwas tun. Die Lösung ist einfach. Wir lenken einfach nur den Verkehr über tun0 der auch darüber fließen muss. Der Rest nutzt einfach weiter wie vorher meinen Router. Erreichen kann man dies über zwei kleine Befehle:

route del default dev tun0
route add -net 141.7.0.0 netmask 255.255.0.0 dev tun0

Der erste Befehl löscht die default Route über tun0 und der zweite fügt eine neue Route ein. Diese soll jeden Verkehr an 141.7.0.0/16 über tun0 routen. Schauen wir uns nun die Routingtable an sieht man schön die Änderungen.

route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
193.197.62.114  192.168.188.1   255.255.255.255 UGH   0      0        0 wlan0
141.7.73.73     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
141.7.0.0       0.0.0.0         255.255.0.0     U     0      0        0 tun0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Zur Vollständigkeit noch der funktionierende traceroute:

tcptraceroute indeedgeek.de
Selected device wlan0, address 192.168.188.22, port 35522 for outgoing packets
Tracing the path to indeedgeek.de (92.51.129.99) on TCP port 80 (http), 30 hops max
1  192.168.188.1  1.855 ms  6.856 ms  1.530 ms
2  lo1.br63.dus.de.hansenet.net (213.191.64.107)  39.948 ms  47.024 ms  39.611 ms
3  ae0-101.cr02.dus.de.hansenet.net (62.109.110.62)  39.143 ms  38.726 ms  38.570 ms
4  so-0-1-0-0.cr02.fra.de.hansenet.net (213.191.66.34)  42.411 ms  51.295 ms  44.529 ms
5  ae1-0.pr03.decix.de.hansenet.net (62.109.109.236)  48.808 ms * 42.657 ms
6  xe-0-3-0.cr-polaris.fra1.hosteurope.de (80.81.192.239)  43.630 ms  43.009 ms  43.116 ms
7  xe-0-2-0.cr-nashira.cgn4.hosteurope.de (80.237.129.109)  45.807 ms  47.210 ms  72.683 ms
8  xe-2-1-0.cr-pollux.cgn3.hosteurope.de (80.237.129.10)  45.310 ms  45.984 ms  45.996 ms
9  xe-16-1.cs-master.r1.cgn3.hosteurope.de (80.237.129.118)  48.070 ms  46.861 ms  51.865 ms
10  * * *
11  indeedgeek.de (92.51.129.99) [open]  45.604 ms  46.741 ms  47.159 ms

Wie erreicht man nun dies am einfachsten? Zwei Möglichkeiten: Entweder man hindert vpnc daran die default Route zu ändern oder man gibt nach dem Verbindungsaufbau die beiden Befehle ein. Die erste Möglichkeit ist zwar die Elegantere da gar kein Abbruch statt findet. Allerdings war es mir zu nervig in der 530 Zeilen langen Bash Datei (/etc/vpnc/vpnc-script) herumzufummeln. (Zeile 467 ist der Verbrecher). Man müsste ein Schalter einbauen der die default Route im Hochschulnetz setzt und außerhalb eben nicht. Wer sich versuchen möchte nur zu, ich würde mich freuen!

Deshalb die zweite Lösung: Die beiden Zeilen einfach nach Verbindungsaufbau eingeben. Die Programme verkraften meistens eine kurze Trennung und so sollte diese Methode ausreichen.

vpnc in gentoo

Um die Pause möglichst kurz zu halten habe ich die Ausführung automatisiert. Ich glaube so funktioniert es nur in Gentoo aber andere Distributionen werden sich wohl ähnlich verhalten.

Ich habe zwei vpnc Profile angelegt einmal fhhn und einmal fhhn-int (intern). Unter gentoo reicht es einfach die Startscripte und Konfigdateien zu verlinken:

cd /etc/init.d/
ln -s vpnc vpnc.fhhn-int
ln -s vpnc vpnc.fhhn
cd /etc/vpnc/
ln -s default.conf fhhn.conf
ln -s default.conf fhhn-int.conf

Anschließend kann man über /etc/init.d/vpnc.fhhn und /etc/init.d/vpnc.fhhn-int vpnc starten. Es wird automatisch die korrekte Konfigdatei genutz (wobei beide sowieso identisch sind). Nun hat man zwei identische Verbindungen und jetzt kommt das Beste: Wir legen einfach die Datei /etc/vpnc/scripts.d/fhhn-postup.sh an. Diese wird nur bei fhhn aufgerufen (sonst müsste sie fhhn-int-postup.sh heißen). Dort scheiben wir nun unsere beiden route Befehle rein und machen sie ausführbar.

Nun kann ich einfach entscheiden ob ich die Routen umgeschrieben haben möchte (fhhn-int) oder eben nicht (fhhn). Leider bleibt immer noch das Problem, dass die Verbindung ab und zu abbricht. Daran kann ich leider nichts tun aber zumindest sind so nicht mehr alle Dienste davon betroffen.

Vielleicht konnte euch etwas helfen und auch Klaus kann nun Baseline testen ;-).

Disclaimer: Ich hoffe mal ich habe keine geheimen IP Adressen verraten. Ich denke an die Infos kommt jeder mit etwas motivation ran.

Samstag, 5. September 2009

vim-Mastery: Visualisiert

vim bietet viele Möglichkeiten einen bestimmten Bereich zu selektieren und darauf einen Befehl anzuwenden. Beispielsweise würde g~f? den Befehl g~ (Groß-/ Kleinschreibung umdrehen) auf alle Zeichen von der Cursor Position bis zum nächsten ? in der Zeile anwenden oder <3j würde die nächsten drei Zeilen ausrücken.

Aber manchmal ist man eben doch zu faul sich ein Konstrukt zusammen zu basteln welches genau den erforderlichen Text bearbeitet. Oder man möchte auf eine Selektion mehrere Befehle anwenden. Genau dann kommt der visuelle Modus ins Spiel.

Zu erst einmal gibt es drei unterschiedliche Möglichkeiten um Text zu selektieren. Einmal v welches wie man es von anderen Editoren gewöhnt ist Zeichen für Zeichen selektiert. V kann nur komplette Zeilen selektieren. Es ist somit nicht möglich nur halbe Zeilen zu bearbeiten. Und zu letzt noch strg+v welches blockweise selektiert.

Hat man nun angefangen zu selektieren und man merkt, dass am Anfang noch eine Zeile fehlt so kann man mit O zum Anfang der Selektion springen und mit o zum Ende.

Sobald man einmal seinen gewünschten Bereich selektiert kann man darauf dann den entsprechenden Befehl anzuwenden. Somit verschwindet aber der selektierte Bereich wieder. Mit gv ist es möglich die letzte Selektierung wieder herzustellen.

Notiz auf dem CheatSheet:

v
Zeichenweise selektieren
V
Zeilenweise selektieren
strg+v
Blockweise selektieren
gv
Selektierung wieder herstellen

Dienstag, 18. August 2009

HTML ist nutzlos!

Wofür brauchen wir überhaupt HTML? Mal ganz nüchtern betrachtet ist HTML doch nur ein gravierender Einschnitt in die Freiheit die XML uns bietet. Man muss ich plötzlich in eine Welt hinein zwängen, in der man zwar Videos abspielen kann aber maximal sechs Ordnungen von Überschriften haben darf. In der man zwar zwischen einem Akronym und einer Abkürzung unterscheiden kann aber nicht mal Überschriften automatisch numeriert werden.

Status Quo

Ok, ich bin nicht ganz fair mit meinen Beispielen. Aber mit welchem Grund machen wir diese Einschränkungen? Wäre es nicht einfach möglich XML frei Schnauze hinzuschreiben?

Betrachten wir doch erst einmal HTML. HTML gibt es im Grunde schon so lange wie es Webserver gibt (1987 - Tim Berners-Lee). Am Anfang eigentlich nur zur Textformatierung gedacht entwickelte sich später eher eine semantische Markup Sprache daraus. Mit der Entwicklung von CSS ging man immer mehr zu einer Trennung zwischen Aussehen (CSS) und Auszeichnung (HTML) über. In HTML sollte seit dem nicht mehr ein <b> (für bold - fett) stehen sondern ein <em> (für emphasized - hervorgehoben). Da so die Bedeutung und nicht das Aussehen definiert wird.

Da CSS lange Zeit (bedauerlicherweise bis heute noch) von vielen Browsern unterschiedlich implementiert (oder gar ignoriert) wurde, ist es schwer ein komplettes Layout in CSS abzubilden. Zudem hat bei Vielen nie ein Umdenken statt gefunden, so dass sich heute immer noch Webseiten mit <b> oder <font>-Tags finden. Auch Tabellen werden heute immer noch gerne für ein Layout missbraucht da man sich mit einer alternativen CSS Implementierung sehr schwer tut.

Eigentlich sollte man erst einmal jede Webseite komplett in HTML schreiben. Im HTML den Inhalt entsprechend auszeichnen (Zitate in <blockquote>, Abkürzungen mit <abbr>, etc) und erst anschließend das Ergebnis mit CSS formatieren. Dabei kann man dann auch entsprechend auf den Medientyp wie Bildschirm, Handy oder Screenreader eingehen. Aber leider sind wir wohl in der Praxis davon noch ein ganzes Stück entfernt.

Wo hilft mir nun also mein XML?

Der erste Punkt ist sicher die bereits erwähnte Freiheit. Ich kann jeden TAG den ich brauche einfach selbst definieren. Somit kann ich mein Text auch viel flexibler auszeichnen. Zusätzlich ist im Browser auch kein Standardverhalten (wie kursiv für <em>) vordefiniert. Ich kann sozusagen auf einer leeren Tafel anfangen zu malen und muss nicht jedes mal erst ein CSS-Reset implementieren. Zusätzlich erhält man eine klarere Struktur zwischen Semantik und Design da man erst gar nicht auf die Idee kommt eine Tabelle zum Positionieren zu missbrauchen - schließlich müsste man das Aussehen für ein table-Tag sowieso selbst in CSS implementieren.

Fassen wir zusammen: Formatieren muss ich mit CSS sowieso und durch XML wird die die semantische Aussagekraft ins Unendliche katapultiert. Wer sich noch nicht so ganz vorstellen kann wie ich mir das denke, für den habe ich mal ein kleines Beispiel erstellt.

Wo ist der Haken?

Also erstmal die beiden simpelsten Hindernisse: Zu erst einmal sind die meisten Webseitenbetreiber weder gewillt noch im Stande diese Änderung nachzuvollziehen. Wenn ihr euch die Verbreitung von Tabellenlayouts anschaut wisst ihr was ich meine. Zum anderen dürfte es an der ein oder anderen Browserunterstütung scheitern (Früher oder später bekommt der IE doch in jedem Webdesignartikel sein Fett weg).

Aber gut lassen wir einmal solche trivialen Hindernisse außer acht. Das Hauptproblem was ich sehe ist das durch zuviel Semantikfreiheit jegliche Semantik verloren geht. Zwar kann der Entwickler jeden Tag nennen wie er will aber der Browser versteht trotzdem nicht das "Kontakt" für einen Kontakt steht so lange bis man es ihm sagt. Wenn ich also völlige Freiheit in der Benennung habe kann der Browser daraus auch keine Schlüsse mehr ziehen. Man müsste dazu der Maschine erst denken beibringen damit sie versteht was ich mit Kontakt meine (und auch checkt das "Contact" und ein falsch geschriebenes "Gondagde" das selbe meint).

Der einzige Ausweg wird es wohl sein nicht ein HTML zu haben sondern in sich abgeschlossene Semantikbereiche. Diese müssten dann in irgend einer Metasprache definiert werden so damit der Browser damit etwas anfangen kann. Diese übergeordnete Definition müsste einmal das Aussehen definieren aber im weiteren auch die Bedeutung welche die entsprechenden Tags mit sich bringen. Nehmen wir mal als Beispiel SVG, MathML oder was ganz anderes. Diese beschreiben für ein entsprechendes Themengebiet eine Auszeichnungssprache. Möchte ich nun Formeln darstellen kann ich MathML einfach "includen" und kann dann meine Formeln schreiben. Das Problem daran ist: Es kann wieder kein Browser anständig darstellen und selbst wenn versteht er trotzdem nicht den Sinn dahinter (solange man es ihm nicht explizit erklärt). Deshalb meine ich es müsste eine Art Metasprache geben (konsequenterweise wieder XML) in der man beschreibt wie zum Beispiel SVG oder MathML auszusehen hat. Bisher gibt es das soweit ich weiß nur eine Sprache zur Festlegung von Schemata die allerdings nur zur Validierung von XML verwendet werden.

Mein Fazit, was ich aus der Überlegung mitnehme: Eigentlich verwenden wir die gesamte Zeit schon XML denn eigentlich ist HTML ja auch nur ein Teil von XML welcher sich um die Auszeichnung von Text kümmert. Schön wäre es allerdings wenn man den vollem Umfang, der von XML geboten wird, auch nutzen kann. Bisher muss jede Erweiterung erst in jeden Browser implementiert werden was annähernd unmöglich ist. Schön wäre es wenn man einfach auf verschiedene "Libraries" zugreifen, bzw. selbst erstellen, kann. Diese muss man einfach nur einbinden und schon versteht der Browser meine Erweiterungen und kann Formeln darstellen und Überschriften nummerieren.

Was haltet ihr davon? Wäre XML eine brauchbare Alternative? Kennt ihr schon Ansätze um die Semantik von XML wieder in XML zu beschreiben? Und ganz wichtig: Verwendet ihr noch Tabellenlayouts? ;-)