<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2germanfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8174057653907946583</atom:id><lastBuildDate>Sat, 31 Oct 2009 00:06:27 +0000</lastBuildDate><title>Schokopapier</title><description /><link>http://nougad.blogspot.com/</link><managingEditor>noreply@blogger.com (nougad)</managingEditor><generator>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Schokopapier" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3692162081543476421</guid><pubDate>Fri, 02 Oct 2009 14:05:00 +0000</pubDate><atom:updated>2009-10-02T16:05:46.224+02:00</atom:updated><title>vim-Mastery: Up and Down</title><description>&lt;p&gt;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.&lt;/p&gt;

  &lt;h2&gt;Toggle Case&lt;/h2&gt;

  &lt;p&gt;Um ein Kleinen Buchstaben groß zu machen oder eben umgedreht reicht ein &lt;a
    href="http://vimdoc.sourceforge.net/htmldoc/change.html#~"&gt;~&lt;/a&gt;. Optional lässt sich das wie
  gewohnt mit den Bewegungsoperatoren verknüpfen. Dann braucht es ein &lt;code&gt;g~{motion}&lt;/code&gt;. So
  würde zum Beispiel &lt;code&gt;g~w&lt;/code&gt; die Groß- und Kleinschreibung eines Wortes ändern. Hilfreich
  ist auch ein &lt;code&gt;b~w&lt;/code&gt;  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. &lt;code&gt;g~~&lt;/code&gt; verändert die gesamte
  Zeile.&lt;/p&gt;

  &lt;h2&gt;Groß und Klein&lt;/h2&gt;

  &lt;p&gt;Um ein Bereich explizit groß oder klein zu schreiben ist &lt;code&gt;u&lt;/code&gt;
  bzw. &lt;code&gt;U&lt;/code&gt; zuständig. Da die Taste im Bewegenmodus allerdings schon
  belegt ist, muss man ein &lt;code&gt;g&lt;/code&gt; davor schreiben. So würde zum
  Beispiel &lt;code&gt;gUw&lt;/code&gt; das gesamte nächste Wort groß schreiben
  (&lt;code&gt;guw&lt;/code&gt; äquivalent für klein). Im visuellen Modus wird das
  &lt;code&gt;g&lt;/code&gt; davor nicht benötigt und es reicht ein &lt;code&gt;u&lt;/code&gt; bzw.
  &lt;code&gt;U&lt;/code&gt;. Wie oben beim Toogle schon gesehen, verändert
  &lt;code&gt;gUU&lt;/code&gt; die gesamte Zeile.&lt;/p&gt;

  &lt;h2&gt;Merkzettel&lt;/h2&gt;

  &lt;dl&gt;
    &lt;dt&gt;&lt;code&gt;~&lt;/code&gt;&lt;dt&gt;

    &lt;dd&gt;Invertieren der Groß-/Kleinschreibung für ein Wort&lt;/dd&gt;
  &lt;/dl&gt;

  &lt;p&gt;Der Rest ist gleich für &lt;code&gt;~&lt;/code&gt;-Toggle, &lt;code&gt;u&lt;/code&gt;-Klein- und
  &lt;code&gt;U&lt;/code&gt;-Großschreibung&lt;/p&gt;

  &lt;dl&gt;
    &lt;dt&gt;&lt;code&gt;g~{motion}&lt;/code&gt;&lt;dt&gt;

    &lt;dd&gt;Invertieren des Textes während der Bewegung&lt;/dd&gt;

    &lt;dt&gt;&lt;code&gt;g~~&lt;/code&gt;&lt;dt&gt;

    &lt;dd&gt;Invertieren der gesamten Zeile&lt;/dd&gt;

    &lt;dt&gt;&lt;code&gt;{Visual}~&lt;/code&gt;&lt;dt&gt;

    &lt;dd&gt;Invertieren des selektieren Bereiches&lt;/dd&gt;
  &lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3692162081543476421?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=GF_nqF92Qw8:q0pMGZ7wLIg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/GF_nqF92Qw8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/GF_nqF92Qw8/vim-mastery-up-and-down.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/10/vim-mastery-up-and-down.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3764170924541090291</guid><pubDate>Thu, 01 Oct 2009 16:02:00 +0000</pubDate><atom:updated>2009-10-01T18:04:33.502+02:00</atom:updated><title>Open Access im Mitmachweb - Teil 2</title><description>&lt;h2&gt;Open Street Map&lt;/h2&gt;

&lt;p&gt;Da ich schon im ersten Teil mit Geodaten angefangen habe, mache ich hier gerade weiter. &lt;a
 href="http://www.openstreetmap.org/"&gt;Openstreetmap&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2&gt;Musicbrainz&lt;/h2&gt;

&lt;p&gt;Eines meiner liebsten Projekte und gleichzeitig wohl auch eines der unbekannteren ist &lt;a
 href="http://musicbrainz.org/"&gt;Musicbrainz&lt;/a&gt;. 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 &lt;a
   href="http://musicbrainz.org/doc/How_To_Tag_Files_With_Picard"&gt;sehr guter Client&lt;/a&gt; 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).&lt;/p&gt; 

&lt;h2&gt;Jamendo&lt;/h2&gt;

&lt;p&gt;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. &lt;a
 href="http://www.jamendo.com/"&gt;Jamendo&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2&gt;Projekt Gutenberg&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="http://aaron-mueller.de"&gt;Aaron&lt;/a&gt;, der vor längerem mal &lt;a
 href="http://aaron-mueller.de/blog/distributed-proovereader"&gt;darüber berichtet&lt;/a&gt; hat.&lt;/p&gt;

&lt;h2&gt;Openlibrary&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://openlibrary.org/"&gt;Openlibrary&lt;/a&gt; versucht die eindeutige Auflistung aller
veröffentlichen Bücher mit ihren entsprechenden Metainformationen frei zugänglich zu machen. Dies
funktioniert ähnlich wie bei &lt;a href="http://www.librarything.com/"&gt;librarything&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2&gt;Andere Projekte&lt;/h2&gt;

&lt;p&gt;Neben diesen Projekten, die ich mal beispielhaft herausgegriffen habe, gibt es noch eine Vielzahl
von unterstützenswerten Projekten. Allein unter dem Dach der &lt;a
  href="http://wikimediafoundation.org/wiki/Our_projects"&gt;Wikimedia Foundation&lt;/a&gt; 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 &lt;a
  href="http://leo.org"&gt;leo.org&lt;/a&gt; oder &lt;a href="http://imdb.com"&gt;imdb&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;Wenn ihr noch erwähnenswerte Projekte kennt, würde ich mich über eine Auflistung in den
Kommentaren freuen!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3764170924541090291?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=5EwzOLYQgNU:zs-1LnYBzoA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/5EwzOLYQgNU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/5EwzOLYQgNU/open-access-im-mitmachweb-teil-2.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/10/open-access-im-mitmachweb-teil-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-9002348342224010036</guid><pubDate>Tue, 29 Sep 2009 21:47:00 +0000</pubDate><atom:updated>2009-09-29T23:48:31.551+02:00</atom:updated><title>Open Access im Mitmachweb - Teil 1</title><description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-9002348342224010036?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=QYGSYMces-s:BBapQRH_q8M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/QYGSYMces-s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/QYGSYMces-s/open-access-im-mitmachweb-teil-1.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/09/open-access-im-mitmachweb-teil-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-1424014046554647415</guid><pubDate>Sun, 27 Sep 2009 17:51:00 +0000</pubDate><atom:updated>2009-09-27T21:57:42.240+02:00</atom:updated><title>Wählen mit Bleistift</title><description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;a
href="http://de.wikipedia.org/wiki/Kopierstift"&gt;Kopierstift&lt;/a&gt; handelt. Ich wusste gar nicht
das es so etwas überhaupt gibt.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;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 :(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-1424014046554647415?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=esI1_NpXnj0:BiVcQEee6Y0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/esI1_NpXnj0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/esI1_NpXnj0/wahlen-mit-bleistift.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/09/wahlen-mit-bleistift.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-2969446846749251505</guid><pubDate>Sat, 26 Sep 2009 14:45:00 +0000</pubDate><atom:updated>2009-09-26T16:47:27.798+02:00</atom:updated><title>vim-Mastery: Eingerückt</title><description>&lt;h2&gt;Tabs, Space (oder beides)?&lt;/h2&gt;

&lt;p&gt;Es ist ja ein längerer Streitpunkt zwischen Entwicklern, mit welchem Zeichen eingerückt wird.  Vim bietet an dieser Stelle drei verschiedene
Möglichkeiten:&lt;/p&gt;

&lt;ul&gt;

  &lt;li&gt;&lt;em&gt;Einrückung mit Tabs&lt;/em&gt; - 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 &lt;a href="http://www.vim.org/htmldoc/options.html#'expandtab'"&gt;noexpandtab&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;em&gt;Einrückung mit Leerzeichen und Tabs&lt;/em&gt; - 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 (&lt;a
    href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt;). 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 &lt;a
    href="http://www.vim.org/htmldoc/options.html#'smarttab'"&gt;smarttab&lt;/a&gt;.&lt;/li&gt;

  &lt;li&gt;&lt;em&gt;Einrückung nur mit Leerzeichen&lt;/em&gt; - 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 &lt;a href="http://www.vim.org/htmldoc/options.html#'expandtab'"&gt;expandtab&lt;/a&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;Breite der Einrückung&lt;/h2&gt;

&lt;p&gt;Hierfür gibt es zwei Optionen. Einmal &lt;a href="http://www.vim.org/htmldoc/options.html#'tabstop'"&gt;tabstop&lt;/a&gt; und dann noch &lt;a
href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt;. Üblicherweise sollte man beides auf den selben Wert lassen. Nur wenn
man, wie oben beschrieben, Tabs und Leerzeichen mischen möchte, dann gibt &lt;a href="http://www.vim.org/htmldoc/options.html#'tabstop'"&gt;tabstop&lt;/a&gt;
an wie viele Leerzeichen durch ein Tab ersetzt werden und &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; setzt
die Breite einer Einrückungsstufe&lt;/p&gt;

&lt;h2&gt;Automatische Einrückung&lt;/h2&gt;

&lt;p&gt;Vim unterstützt selbstverständlich auch eine automatische Einrückung. Hierfür gibt es verschiedene Mods. Einmal gibt es &lt;a
href="http://www.vim.org/htmldoc/options.html#'autoindent'"&gt;autoindent&lt;/a&gt; welches einfach die Einrückung der letzten Zeile in die nächste
übernimmt. Etwas Schlauer ist da &lt;a href="http://www.vim.org/htmldoc/options.html#'smartindent'"&gt;smartindent&lt;/a&gt;. Hierbei werden einige &lt;a
href="http://www.vim.org/htmldoc/options.html#'cinwords'"&gt;Keywords&lt;/a&gt; und geschweifte Klammern beachtet. Diese beiden Methoden bilden die
Basis und können immer aktiviert bleiben.&lt;/p&gt;

&lt;p&gt;Unabhängig davon gibt es spezielle Einrückungen für eine große Anzahl von Sprachen. Einmal wäre da das eingebaute &lt;a
href="http://www.vim.org/htmldoc/options.html#'cindent'"&gt;cindent&lt;/a&gt; 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 &lt;code&gt;filetype plugin indent on&lt;/code&gt;. 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.&lt;/p&gt;

&lt;h2&gt;Für die vimrc&lt;/h2&gt;

&lt;p&gt;Merken wir uns also folgende Optionen für unsere vimrc:&lt;/p&gt;

&lt;pre&gt;
" 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
&lt;/pre&gt;

&lt;h2&gt;Commands&lt;/h2&gt;

&lt;p&gt;Kommen wir nun zu der Anwendung.&lt;/p&gt;

&lt;h3&gt;Ein-/Ausrücken&lt;/h3&gt;

&lt;p&gt;Ist man gerade im Einfügemodus kann man einfach mit &lt;code&gt;strg+T&lt;/code&gt; eine Stufe einrücken bzw. mit &lt;code&gt;strg+D&lt;/code&gt; eine Stufe
wieder ausrücken. Viel flexibler ist man allerdings im Befehlsmodus. Hier lassen sich &lt;code&gt;&amp;lt;&lt;/code&gt; und &lt;code&gt;&amp;gt;&lt;/code&gt; verwenden
um entsprechend die Einrückung zu verändern. Am einfachsten über &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; und &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;. Dies verrückt einfach
die aktuelle Zeile um eine Stufe. Möchte man nun mehrere Zeilen verrücken dann kann man auch &lt;code&gt;&amp;lt;{motion}&lt;/code&gt; verwenden. Motion
ist hier jede beliebige Bewegung wie man sie in vim kennt. (&lt;code&gt;G&lt;/code&gt; = bis zum Ende des Dokumentes, &lt;code&gt;35G&lt;/code&gt; = bis zur Zeile
&lt;code&gt;35&lt;/code&gt;, &lt;code&gt;3j&lt;/code&gt; = 3 Zeilen nach unten, etc...) Interessant ist hierbei das man auch wie gewohnt den letzten Befehl mit
&lt;code&gt;.&lt;/code&gt; wiederholen kann. Also würde &lt;code&gt;&amp;gt;4..&lt;/code&gt; 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 &lt;code&gt;&amp;gt;&lt;/code&gt; einrücken. Beispiel:
&lt;code&gt;V2j3&amp;gt;&lt;/code&gt; rückt die nächsten zwei Zeilen drei mal ein.&lt;/p&gt;

&lt;p&gt;Und zum Schluss noch der Kommandozeilenmodus: Hier kann man mittels &lt;code&gt;:left X&lt;/code&gt;
angeben, dass die Einrückung der aktuellen Zeile (mittels angegebenem Bereich auch mehr als
nur die aktuelle Zeile) auf X gesetzt wird.&lt;/p&gt;

&lt;h4&gt;Für den Spickzettel:&lt;/h4&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;&amp;lt;{motion}&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;Shift &lt;code&gt;{motion}&lt;/code&gt; lines one &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; leftwards.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;Shift &lt;code&gt;[count]&lt;/code&gt; lines one &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; leftwards.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;{Visual}[count]&amp;lt;&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;Shift the highlighted lines &lt;code&gt;[count]&lt;/code&gt; &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; leftwards.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;:[range]&amp;lt;&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;Shift &lt;code&gt;[range]&lt;/code&gt; lines one &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; left.  Repeat &lt;code&gt;'&amp;lt;'&lt;/code&gt; for shifting
  multiple &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt;s.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;:[range]&amp;lt; {count}&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;Shift &lt;code&gt;{count}&lt;/code&gt; lines one &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt; left, starting with &lt;code&gt;[range]&lt;/code&gt;
(default current line). Repeat &lt;code&gt;'&amp;lt;'&lt;/code&gt; for shifting multiple &lt;a href="http://www.vim.org/htmldoc/options.html#'shiftwidth'"&gt;shiftwidth&lt;/a&gt;s.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;:[range]le[ft] [indent]&lt;/code&gt;&lt;/dt&gt;

  &lt;dd&gt;left align lines in &lt;code&gt;[range]&lt;/code&gt;.  Sets the indent in the lines to &lt;code&gt;[indent]&lt;/code&gt; (default 0).&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3&gt;Automatisch Einrücken&lt;/h3&gt;

&lt;p&gt;Und jetzt das Beste. Wer sich ärgert, dass seine Einrückung nicht mehr stimmt soll einfach mal &lt;code&gt;={motion}&lt;/code&gt; ausprobieren. &lt;code&gt;==&lt;/code&gt; korrigiert die aktuelle Zeile und
wie gewohnt lässt sich dies mit dem visuellen Modus etc kombinieren (siehe oben &lt;code&gt;&amp;lt;&lt;/code&gt; Operator). So rückt zum Beispiel ein &lt;code&gt;gg=G&lt;/code&gt; den kompletten
Text ein.&lt;/p&gt;

&lt;h2&gt;Misc&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="http://www.vim.org/htmldoc/change.html#:retab"&gt;:retab&lt;/a&gt;
welches hilft die Einrückung von Text zu ändern. Und ganz wichtig die Option &lt;a
href="http://www.vim.org/htmldoc/options.html#'paste'"&gt;paste&lt;/a&gt; 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.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-2969446846749251505?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=vIEQ2FB958U:FcOuvmaHOCs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/vIEQ2FB958U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/vIEQ2FB958U/vim-mastery-eingeruckt.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/09/vim-mastery-eingeruckt.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-7275530839954270722</guid><pubDate>Sun, 13 Sep 2009 20:55:00 +0000</pubDate><atom:updated>2009-09-13T22:57:25.599+02:00</atom:updated><title>VPN Schmerzlos</title><description>&lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;Heute hat es mich einmal zu viel aufgeregt und ich habe beschlossen etwas dagegen zu tun!&lt;/p&gt;

  &lt;h2&gt;Wo ist das Problem?&lt;/h2&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;pre&gt;
# 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
&lt;/pre&gt;

  &lt;p&gt;Wählt man sich nun ins VPN ein bekommt man folgendes Bild zu sehen:&lt;/p&gt;

&lt;pre&gt;
# 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
&lt;/pre&gt;


  &lt;p&gt;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).&lt;/p&gt;

&lt;pre&gt;
# 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
&lt;/pre&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;h2&gt;Die Lösung&lt;/h2&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;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:&lt;/p&gt;

&lt;pre&gt;
route del default dev tun0
route add -net 141.7.0.0 netmask 255.255.0.0 dev tun0
&lt;/pre&gt;

  &lt;p&gt;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.&lt;/p&gt;

&lt;pre&gt;
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
&lt;/pre&gt;

  &lt;p&gt;Zur Vollständigkeit noch der funktionierende traceroute:&lt;/p&gt;

&lt;pre&gt;
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
&lt;/pre&gt;

  &lt;p&gt;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!&lt;/p&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;h2&gt;vpnc in gentoo&lt;/h2&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;Ich habe zwei vpnc Profile angelegt einmal fhhn und einmal fhhn-int (intern). Unter gentoo
  reicht es einfach die Startscripte und Konfigdateien zu verlinken:&lt;/p&gt;

&lt;pre&gt;
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
&lt;/pre&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;Vielleicht konnte euch etwas helfen und auch Klaus kann nun Baseline testen ;-).&lt;/p&gt;

  &lt;p&gt;Disclaimer: Ich hoffe mal ich habe keine geheimen IP Adressen verraten. Ich denke an die
  Infos kommt jeder mit etwas motivation ran.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-7275530839954270722?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=2bzfqWbWyPQ:4SB5IqYMloU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/2bzfqWbWyPQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/2bzfqWbWyPQ/vpn-schmerzlos.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/09/vpn-schmerzlos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-5693143327958052769</guid><pubDate>Sat, 05 Sep 2009 17:36:00 +0000</pubDate><atom:updated>2009-09-05T19:46:14.295+02:00</atom:updated><title>vim-Mastery: Visualisiert</title><description>&lt;p&gt;vim bietet viele Möglichkeiten einen bestimmten Bereich zu selektieren und darauf
  einen Befehl anzuwenden. Beispielsweise würde &lt;code&gt;g~f?&lt;/code&gt; den Befehl &lt;code&gt;g~&lt;/code&gt;
  (Groß-/ Kleinschreibung umdrehen) auf alle Zeichen von der Cursor Position bis zum nächsten
  &lt;code&gt;?&lt;/code&gt; in der Zeile anwenden oder &lt;code&gt;&amp;lt;3j&lt;/code&gt; würde die nächsten drei
  Zeilen ausrücken.&lt;/p&gt;

  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;Zu erst einmal gibt es drei unterschiedliche Möglichkeiten um Text zu selektieren. Einmal
  &lt;code&gt;v&lt;/code&gt; welches wie man es von anderen Editoren gewöhnt ist Zeichen für Zeichen
  selektiert. &lt;code&gt;V&lt;/code&gt; kann nur komplette Zeilen selektieren. Es ist somit nicht möglich
  nur halbe Zeilen zu bearbeiten. Und zu letzt noch &lt;code&gt;strg+v&lt;/code&gt; welches blockweise
  selektiert.&lt;/p&gt;

  &lt;p&gt;Hat man nun angefangen zu selektieren und man merkt, dass am Anfang noch eine Zeile fehlt
  so kann man mit &lt;code&gt;O&lt;/code&gt; zum Anfang der Selektion springen und mit &lt;code&gt;o&lt;/code&gt;
  zum Ende.&lt;/p&gt;

  &lt;p&gt;Sobald man einmal seinen gewünschten Bereich selektiert kann man darauf dann den
  entsprechenden Befehl anzuwenden. Somit verschwindet aber der selektierte Bereich wieder. Mit
  &lt;code&gt;gv&lt;/code&gt; ist es möglich die letzte Selektierung wieder herzustellen.&lt;/p&gt;

  &lt;h2&gt;Notiz auf dem CheatSheet:&lt;/h2&gt;

  &lt;dl&gt;
    &lt;dt&gt;&lt;code&gt;v&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Zeichenweise selektieren&lt;/dd&gt; &lt;dt&gt;&lt;code&gt;V&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Zeilenweise
    selektieren&lt;/dd&gt; &lt;dt&gt;&lt;code&gt;strg+v&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Blockweise selektieren&lt;/dd&gt;
    &lt;dt&gt;&lt;code&gt;gv&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Selektierung wieder herstellen&lt;/dd&gt;
  &lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-5693143327958052769?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=PljraQz0X7o:mV0fKpTQqns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/PljraQz0X7o" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/PljraQz0X7o/vim-mastery-visualisiert.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/09/vim-mastery-visualisiert.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-6074021721908222774</guid><pubDate>Mon, 17 Aug 2009 22:34:00 +0000</pubDate><atom:updated>2009-08-18T00:37:51.256+02:00</atom:updated><title>HTML ist nutzlos!</title><description>&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;Status Quo&lt;/h2&gt;

&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;Betrachten wir doch erst einmal HTML. HTML gibt es im Grunde schon so lange wie es Webserver
gibt (&lt;a href="http://de.wikipedia.org/wiki/Tim_Berners-Lee"&gt;1987 - Tim Berners-Lee&lt;/a&gt;).
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 &amp;lt;b&amp;gt; (für bold - fett) stehen sondern ein &amp;lt;em&amp;gt; (für emphasized -
hervorgehoben). Da so die Bedeutung und nicht das Aussehen definiert wird.&lt;/p&gt;

&lt;p&gt;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 &amp;lt;b&amp;gt; oder &amp;lt;font&amp;gt;-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.&lt;/p&gt;

&lt;p&gt;Eigentlich sollte man erst einmal jede Webseite komplett in HTML schreiben. Im HTML den Inhalt
entsprechend auszeichnen (Zitate in &amp;lt;blockquote&amp;gt;, Abkürzungen mit &amp;lt;abbr&amp;gt;, 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.&lt;/p&gt;

&lt;h2&gt;Wo hilft mir nun also mein XML?&lt;/h2&gt;

&lt;p&gt;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 &amp;lt;em&amp;gt;) 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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href="http://indeedgeek.de/%7Efeitel/public/shared/blog-20090818-html_ist_nutzlos-example.xml"&gt;kleines
Beispiel&lt;/a&gt; erstellt.&lt;/p&gt;

&lt;h2&gt;Wo ist der Haken?&lt;/h2&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;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 &lt;a href="http://de.wikipedia.org/wiki/Svg%22"&gt;SVG&lt;/a&gt;,
&lt;a href="http://de.wikipedia.org/wiki/Mathematical_Markup_Language"&gt;MathML&lt;/a&gt; oder &lt;a href="http://www.musicmarkup.info/scope/markuplanguages.html"&gt;was ganz anderes&lt;/a&gt;. 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 &lt;a href="http://de.wikipedia.org/wiki/XML_Schema"&gt;Schemata&lt;/a&gt;
die allerdings nur zur Validierung von XML verwendet werden.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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? ;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-6074021721908222774?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Schokopapier?a=5ECTh1rfkJQ:bwRXslMAZrU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Schokopapier?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/5ECTh1rfkJQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/5ECTh1rfkJQ/html-ist-nutzlos.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2009/08/html-ist-nutzlos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-7904857152897432146</guid><pubDate>Mon, 10 Nov 2008 21:25:00 +0000</pubDate><atom:updated>2008-11-10T22:35:23.917+01:00</atom:updated><title>ID3-Cover von Kopf bis Fuß</title><description>&lt;p&gt;&lt;a href="http://www.id3.org/Home"&gt;ID3&lt;/a&gt; steht für &lt;b&gt;Id&lt;/b&gt;entify an &lt;b&gt;M&lt;/b&gt;P3 wobei die
aktuellen Versionen weit über das bloße Identifizieren hinaus gehen. In der Version 2.4 sind 
83 Verschiedene Tags definiert die von "Internet radio station owner" bis "Original album/movie/show
title" reichen. (Daneben kochen noch einige Player wie ITunes ihr eigenes Süppchen).&lt;/p&gt;

&lt;h2&gt;Versionen&lt;/h2&gt;

&lt;p&gt; In Version 1 gab es nur wenige Tags die auf eine fixe Größe begrenzt waren. (Zudem noch
ein Haufen anderer Nachteile...)  In Version 2 wurde vieles verbessert so ist zum Beispiel die
Länge nicht mehr Fix und es gibt haufenweise neue Tag-Felder. Alle Versionen bis 2.3 gelten
als veraltet. Und werden nur von wenigen Programmen und Geräten noch geschrieben. Die aktuelle
Version ist 2.4 wobei man am häufigsten noch 2.3 antrifft.&lt;/p&gt;

&lt;p&gt;Der Größte Unterschied zwischen 2.3 und 2.4 ist die Möglichkeit Tags nun auch als
UFT-8 abzuspeichern (vorher nur ISO 8859-1 und UTF-16).  Außerdem ist nun die Platzierung der Tags anpassbar. Bisher musste es immer am Anfang der Datei stehen was
vor allem bei Streaming Probleme machen kann. Weiterführendes zu den Änderungen: &lt;a href="http://www.id3.org/id3v2.4.0-changes"&gt;in der offiziellen Doku&lt;/a&gt;.  &lt;/p&gt;

&lt;h2&gt;Technische Umsetzung&lt;/h2&gt;

&lt;p&gt;Die gesamten ID3 Informationen beginnen immer mit einem Header. Dort ist gekennzeichnet, dass
es sich um einen ID3 Tag mit der entsprechenden Version handelt außerdem sind dort noch Flags
und die Größe angegeben.&lt;/p&gt;

&lt;p&gt;Je nach dem wie es in den Flags angegeben wurde folgt danach ein extended Header. Dort lassen
sich unter anderem einige Restriktionen machen die auch für das Cover interessant ist. So
kann hier das Format (PNG oder JPEG) angegeben werden oder auch die maximale Auflösung wie
zum Beispiel (256x256 oder kleiner).&lt;/p&gt;

&lt;p&gt;Anschließend folgen die Tags auch Frames genannt. Der Header eines Frames besteht aus
einer zum Teil kryptischen, eindeutigen Kennung wie TDEN für "Encoding time", der Länge
der Daten und einigen Flags.  Flags können zum Beispiel die Kodierung, ein Read-Only-Flag,
Compression oder Verschlüsselung sein. Anschließend folgen die Daten selbst. Weiterführendes zu den Frames
&lt;a href="http://www.id3.org/id3v2.4.0-frames"&gt;in der offiziellen Doku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zuletzt kann noch ein Buffer oder ein Footer kommen.&lt;/p&gt;

&lt;h2&gt;Image-Tag&lt;/h2&gt;

&lt;p&gt;Nun zum eigentlichen Image-Tag: Nicht erst seit ITunes Cover-Flow möchte man gerne die Cover
eines Albums mit abspeichern.  Ist das Cover einfach in einer Datei enthalten hat man wieder die
Probleme wie man die Datei benennt und außerdem muss man aufpassen das sie nicht mal verloren
geht. (So macht es glaub ich der Windows Media Player indem er eine Folder.jpg anlegt. (die
nebenbei auch von meinem N95 erkannt wird (Siehe unten (fast wie LISP :D)))) Deshalb geht man dazu
über die Cover-Informationen im Track selber zu speichern. Dazu gibt es ein extra Frame mit
der Kennung APIC. Hier kann man allerdings nicht nur das Cover abspeichern sondern eine Vielzahl
weiterer Bilder die den Track betreffen. Hier die Komplette Auflistung aus Version 2.4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Other&lt;/li&gt;
&lt;li&gt;32x32 pixels 'file icon' (PNG only)&lt;/li&gt;
&lt;li&gt;Other file icon&lt;/li&gt;
&lt;li&gt;Cover (front)&lt;/li&gt;
&lt;li&gt;Cover (back)&lt;/li&gt;
&lt;li&gt;Leaflet page&lt;/li&gt;
&lt;li&gt;Media (e.g. label side of CD)&lt;/li&gt;
&lt;li&gt;Lead artist/lead performer/soloist&lt;/li&gt;
&lt;li&gt;Artist/performer&lt;/li&gt;
&lt;li&gt;Conductor&lt;/li&gt;
&lt;li&gt;Band/Orchestra&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;Lyricist/text writer&lt;/li&gt;
&lt;li&gt;Recording Location&lt;/li&gt;                                                                                                                                           
&lt;li&gt;During recording&lt;/li&gt;
&lt;li&gt;During performance&lt;/li&gt;                                                                                                                                           
&lt;li&gt;Movie/video screen capture&lt;/li&gt;
&lt;li&gt;A bright coloured fish&lt;/li&gt;                                                                                                                                       
&lt;li&gt;Illustration&lt;/li&gt;
&lt;li&gt;Band/artist logotype&lt;/li&gt;                                                                                                                                         
&lt;li&gt;Publisher/Studio logotype&lt;/li&gt;
&lt;/ul&gt;                                                                                                                                                                 

&lt;p&gt;Es können auch mehrere Bilder pro Datei mit unterschiedlichen Typen angegeben werden. Zu
Jedem Eintrag kann dann noch eine Beschreibung eingetragen werden (Kodierung hier nicht vergessen
einzutragen). Das Bild selbst sollte entweder ein PNG oder ein JPEG-Format haben kann aber auch alles
andere sein da man den MIME-Type sowieso angeben muss.&lt;/p&gt;

&lt;p&gt;Außerdem besteht noch die Möglichkeit als MIME-Type "--&gt;" anzugeben und dann als
Bild nur den Verweis auf eine Bilddatei zu speichern.  Beispiel wäre: "../cover.png" oder
"http://example.com/cover.jpg". Aber ob das ein Player unterstützt??&lt;/p&gt;

&lt;h2&gt;Test-Script&lt;/h2&gt;

&lt;p&gt;Die Kompatibilität ist sowieso der Grund warum ich mich mit der Thematik beschäftigt habe. Mein
neues Handy (Nokia N95) wollte nur ein Teil meiner Covers erkennen. Um zu Testen was es kann
habe ich mir folgendes Skript gebastelt was MP3-Dateien in allen möglichen Kombinationen erstellt.&lt;/p&gt;

&lt;p&gt;Also zum Beispiel das Bild als "Cover (front)" im PNG-Format und ID3v2.4 wäre eine denkbare
Kombination.&lt;/p&gt;

&lt;p&gt;Das Script benötigt Python und die &lt;a href="http://eyed3.nicfit.net/"&gt;eyeD3&lt;/a&gt; Library. Zudem wird ein Soundfile benötigt
(ich hatte complete.mp3 mit 4 Sekunden Länge) und ein Bild in den entsprechenden Formaten
(ich hatte ok.{png,bmp,jpg,gif}). In dem Download-Package ist beides vorhanden.&lt;/p&gt;

&lt;pre&gt;
import eyeD3
from shutil import copy

filename = "complete.mp3"
imagefile = "ok."
versions = [eyeD3.ID3_V2_3, eyeD3.ID3_V2_4]
formats = ["bmp", "gif", "jpg", "png"] 
id = 0 

for type in range(eyeD3.frames.ImageFrame.MIN_TYPE, eyeD3.frames.ImageFrame.MAX_TYPE + 1): 
  for version in versions:
    for format in formats:
      str = { 
            "id"      : id
          , "type"    : eyeD3.frames.ImageFrame.picTypeToString(type)
          , "version" : eyeD3.utils.versionToString(version)
          , "format"  : format
      }   
      newFilename  = "test-%(id)03d-%(type)s-%(version)s-%(format)s.mp3" % str 
      copy(filename, newFilename)
      tag = eyeD3.Tag(newFilename)
      tag.remove(eyeD3.ID3_ANY_VERSION)
      tag.header.setVersion(version)
      tag.addImage(type, imagefile+format, u"")
      tag.update()
      id+=1
&lt;/pre&gt;

&lt;p&gt;Es werden so 167 Dateien erstellt die entsprechend benamt sind. Nun kann man damit sein
Player füllen und sehen was er alles unterstützt. In meinem Fall konnte das Nokia N95 nur
JPEG im korrekten "Cover (Front)"-Feld wobei ihm die Version (ID3v2.{3,4}) egal war.&lt;/p&gt;

&lt;h2&gt;Testen, Testen, Testen&lt;/h2&gt;
&lt;p&gt;Ich musste das ganze natürlich gleich mit ein paar Programmen ausprobieren. Amarok konnte
natürlich alles darstellen ebenso ITunes. Der Windows-Explorer hingegen schafft unter Vista
leider nur ID3v2 dafür aber auch alle Formate. Winamp schafft mit Plugin grade einmal JPEG-Formate.&lt;/p&gt;

&lt;p&gt;Wenn ihr noch etwas testet dann lasst mir doch die Ergebnisse zukommen. Ich werde sie hier auch noch rein stellen.
Dazu habe ich kein Archiv mit den benötigten Dateien gepackt welches hier runtergeladen werden kann: &lt;a href="/~feitel/id3APIC.tar.gz"&gt;download&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Der Fisch&lt;/h2&gt;

&lt;p&gt;Aufmerksamen Lesern wir das Feld "A bright coloured fish" aufgefallen sein. Ich habe echt kein Plan für was das gut sein soll. Ich finds ein sehr
lustiges Easteregg :D. Wenn jemand den Fisch in freier Wildbahn findet muss er mir unbedingt Bescheid sagen!&lt;/p&gt;

&lt;p&gt;eye3D kommentiert es nur folgendermaßen: &lt;code&gt;BRIGHT_COLORED_FISH = 0x11; # There's always room for porno.&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-7904857152897432146?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=nsd9vJkN"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/FQGnj4J6mb4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/FQGnj4J6mb4/id3-cover-von-kopf-bis-fu.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/11/id3-cover-von-kopf-bis-fu.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-1849299859486895576</guid><pubDate>Mon, 04 Aug 2008 18:19:00 +0000</pubDate><atom:updated>2008-08-04T20:19:48.906+02:00</atom:updated><title>Backups</title><description>&lt;p&gt;Für eine anständige Backup-Strategie bin ich schon fast so lange am überlegen wie für meine
Groupware-Verwaltung. Nachdem ich mir extra dafür eine externe 500 GB Festplatte gekauft hatte,
fehlte nur noch die passende Softwarelösung. Neidisch schaut man im ersten Moment auf Apple's
&lt;a href="http://www.apple.com/macosx/features/timemachine.html"&gt;TimeMachine&lt;/a&gt;. Rein Objektiv
ist dies aber auch nichts anderes als ein Inkrementelles Backup mit kurzen Iterationszeiten und
einer netten GUI. Alternativen für Linux wie &lt;a href="http://flyback-project.org/"&gt;Flyback&lt;/a&gt;
sind vorhanden. Allerdings ist dies nicht die einzige Möglichkeit eines sinnvollen Backups.&lt;/p&gt;

&lt;p&gt;Fakt ist wohl, ein Backup sollte möglichst nicht jedes mal eine eins-zu-eins Kopie anlegen, da
so viel zu viel Speicher verbraucht wird. Lösung sind Inkrementelle oder Differenzielle Backups.
So werden nur die Änderungen gespeichert die sich verändert haben. Fast jede Lösung bietet
dieses Konzept mittlerweile an. Außerdem wollte ich ein Backup auf Datei-Ebene und nicht
auf Partitionsebenen wie es zum Beispiel das Tool dd anbietet. Da ich denke so Flexibler bin und
außerdem glaube ich nicht das Inkrementelle Backups auf Partitionsebene möglich ist.&lt;/p&gt;

&lt;p&gt;Zuerst plante ich ein Backup mit einem Selbstgeschriebenden Skriptes. Über die
Linux-Boardmittel lassen sich eine Vielzahl der der Anforderungen wie Verschlüsselung und
Komprimierung recht einfach implementieren. Allerdings wenn man alle Möglichkeiten mit allen
kombinieren möchte so wird es irgendwann richtig komplex. So habe ich meine ersten Versuche
verworfen und plante mit einem umfangreichen Backup-Programm wie BoxBackup oder Bacula. Hier
habe ich aber auch recht schnell erkannt das diese für große Netzwerke ausgelegt sind und
für meinen kleinen Laptop etwas überdimensioniert sind. Etwas einfaches musste her!&lt;/p&gt;

&lt;p&gt;Über Chaosradio bin ich auf &lt;a href="http://chaosradio.ccc.de/cre049.html"&gt;ZFS&lt;/a&gt;
gestoßen. Ein Filesystem mit einer unglaublichen Feature-Liste. Angefangen von automatischer
Größen-Anpassung von Partitionen über automatische Komprimierung bis hin zu gesicherter
Konsistenz des Dateisystems bietet es alles was man sich wünschen kann.  ZFS bietet auch die
Möglichkeit von Snapshots auf Block-Ebene an. Man kann die Daten, die sich geändert haben,
einfach über die alten drüber kopieren und anschließend ein Snapshot machen. So hat man im
Grunde jedes mal ein Vollbackup obwohl man nur die geänderten Blöcke speichern muss. Leider
kommt ZFS aus der Solaris-Welt und kann in den Linux-Kernel im Moment wegen Lizenzproblemen
nicht integriert werden. Es existiert zwar eine FUSE-Erweiterung, aber alles noch recht Beta.
Das Risiko wollte ich leider nicht beim Backup eingehen und musste mich so nach Alternativen
umschauen.&lt;/p&gt;

&lt;p&gt;Das System mit den Snapshots hat mir aber gefallen und so bin ich auf das recht populäre
Tool rsnapshot gestoßen. Das Programm setzt auf Hardlinks auf. Bei normalen (Soft-)Links
hat man eine Datei und erstellt dann Referenzen auf diese Datei. Löscht man eine Referenz
interessiert das niemanden. Löscht man die ursprüngliche Datei werden alle Referenzen ungültig.
Bei Hardlinks referenziert man nicht auf eine Datei sondern auf ein INode-Eintrag. Also sozusagen
eine Ebene Tiefer. Der Vorteil ist, alle Hardlinks sind gleichberechtigt. Die eigentlichen Daten
werden erst gelöscht, wenn kein Hardlink mehr darauf verweist.  Das Prinzip von rsnapshot ist
dadurch recht einfach: Man kopiert das letzte Backup mittels Hardlinks in ein neues Verzeichnis
und ändert dann über rsync die veränderten Dateien. So erhält man jeden Tag ein Vollbackup
welches nur den Speicherplatz der Änderungen verbraucht.&lt;/p&gt;

&lt;p&gt;Ein weiters sehr nützliches Feature ist die Möglichkeit eigene Scripte (z.B. um ein Datenbankdump zu erstellen) in das Backup einzubinden. Und wenn man zum Beispiel einen zweiten Computer mit sichern will, 
so ist es möglich Daten von diesem über ssh+rsync zu hohlen. Somit sichere ich mein Laptop mein Server und die Datenbank auf meinem Server recht einfach mit nur einem Programm&lt;/p&gt;

&lt;p&gt;Leider kann rsnapshot, anders wie ZFS nur auf Datei-Ebene arbeiten. So wird eine Datei in
der sich nur ein Buchstabe ändert komplett neu übertragen. Auch wird es nicht erkannt
wenn man ein Verzeichnis oder eine Datei umbenennt. Auch in diesem Fall wird die Datei neu
abgespeichert. Aber wenn man sich der Problematik bewusst ist, stört sie kaum.&lt;/p&gt;

&lt;p&gt;Programme wie Storebackup umgehen das Problem indem sie zu jeder Datei Prüfsummen anlegen
und diese vergleichen. Allerdings ergibt sich so ein worst-case-Aufwand von O(n^2) da ja jede
Checksumme erst einmal erstellt, und dann mit jeder Datei verglichen werden muss. Man sieht
schon, diese Lösung braucht um einiges länger als mein rsnapshot. (180 GB in ca 10 Minuten
täglich bei einem diff von gerade mal einigen hundert MB).  Außerdem wollte ich auch ein gut
getestetes Konzept und habe mich so für das weit verbreitete rsnapshot entschieden satt das
(evtl gar nicht mehr weiter entwickelte) Storebackup.&lt;/p&gt;

&lt;p&gt;Und nun die Zuschauerfrage: Wie macht ihr eure Backups? Ich denke jeder der am Computer arbeitet
braucht ein Backup, da Datenverlust nur eine Frage des Wann ist. Und wenn die Dateien nur einmal
pro Woche auf DVD gebrannt werden. Auf jeden Fall würde mich euer Setup interessieren. Gerne auch
in einem eigenen Blog-Post bei euch. Verlinkt euch einfach in den Kommentaren!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-1849299859486895576?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=rE7sGIS7"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/OQou3AvJuqA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/OQou3AvJuqA/backups.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/08/backups.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-4389887337768811452</guid><pubDate>Fri, 01 Aug 2008 16:16:00 +0000</pubDate><atom:updated>2008-08-01T18:24:10.674+02:00</atom:updated><title>Groupware Protokolle</title><description>&lt;p&gt;Wer träumt nicht von einer zentralen Verwaltung seiner PIM-Informationen? Groupware-Systeme
unterstützten diesen Prozess indem sie die Daten zentral verwaltet und verschiedene Schnittstellen
anbietet. In vielen Fällen wird eine Groupware nach ihrem Web-Frontend bewertet. Leider spielt
diese eigentlich nur eine sehr untergeordnete Rolle. Das Hauptproblem konzentriert sich darauf,
möglichst viele Clients mit dem System verbinden zu können. Deshalb möchte ich kurz einige
interessante Techniken auflisten um den Austausch der Daten zu Realisieren.&lt;/p&gt;

&lt;h2&gt;Formate&lt;/h2&gt;

&lt;p&gt;Zumindest hier zeichnet sich langsam ein Standard ab. Für Termine hat &lt;a
href="http://de.wikipedia.org/wiki/ICalendar"&gt;iCalendar&lt;/a&gt; (oder kurz ical) langsam den älteren
Konkurrenten &lt;a href="http://de.wikipedia.org/wiki/ICalendar"&gt;vCalendar&lt;/a&gt; abgelöst. Mit
iCalendar lassen sich allerdings nicht nur Termine sondern auch todo's oder Journaleinträge
damit verwalten. Leider ist das Format nicht ganz so schön (man ist ja langsam überall XML gewohnt)
aber zumindest die meisten Datenfelder werden überall verstanden. Da man aber auch selbst
Erweiterungen definieren kann, ist es doch möglich das Details in verschiedenen Anwendungen
anders verstanden werden. Bei Kontakten hat sich vCard durchgesetzt, wofür weitgehend das selbe wie bei
iCalendar gilt.&lt;/p&gt;

&lt;h2&gt;Protokolle&lt;/h2&gt;

&lt;p&gt;Leider sind dies ja nur Dateiformate. Meistens möchte man ja aber diese Daten zentral
hinterlegen und mit verschiedenen Clients darauf zugreifen. Dazu sind einige Protokolle nötig,
die diesen Transport realisieren. Hier möchte ich auch mein eigentliches Hauptaugenmerk legen.&lt;/p&gt;

&lt;h3&gt;Email&lt;/h3&gt;

&lt;p&gt;Hier ist es noch am einfachsten. &lt;a href="http://de.wikipedia.org/wiki/Pop3"&gt;POP&lt;/a&gt; ist Tot. &lt;a
href="http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol"&gt;IMAP&lt;/a&gt; ist Standard. Viel
mehr muss man dazu nicht sagen.  Interessant sind allerdings einige Erweiterungen für IMAP. Einmal
wäre da &lt;a href="http://en.wikipedia.org/wiki/IMAP_IDLE"&gt;IMAP-IDLE&lt;/a&gt;. Dabei meldet sich der
Client am Server an und senden anschließend nur ab und zu keep-alive-Pakete. Der Server hingegen
antwortet sobald eine neue Mail eintrifft. So hat man ein wunderbaren Mail-PUSH ohne jeden Aufwand.
Erwähnenswert ist noch &lt;a href="http://de.wikipedia.org/wiki/Sieve"&gt;Sieve&lt;/a&gt;. Sieve. Stieve ist eine
Programmiersprache in der sich Regeln wie zum Beispiel Abwesenheitsnachrichten, oder Spamregeln
definieren lassen. Außerdem ist meistens nicht bekannt das man mit IMAP auch komplexe ACL's
definieren kann. So ist es möglich ein Postfach auch mehreren Personen zugänglich zu machen.&lt;/p&gt;

&lt;h3&gt;Kalender und Kontakte&lt;/h3&gt;

&lt;h4&gt;XML-RPC&lt;/h4&gt;

&lt;p&gt;Einige Projekte wie eGroupware oder PHProject setzten auf XML-RPC zur Synchronisation. Zwar
lässt sich so sehr einfach dagegen programmieren aber leider ist dies immer sehr Spezifisch
auf die einzelne Anwendung. Deshalb finde ich diese Idee nicht sonderlich toll. Lieber ein
standardisiertes Protokoll für alle!&lt;/p&gt;

&lt;h4&gt;WebDav&lt;/h4&gt;

&lt;p&gt;Eine sehr einfache Möglichkeit ist der Einsatz von &lt;a
href="http://de.wikipedia.org/wiki/WebDAV"&gt;WebDav&lt;/a&gt; wie er auch von subversion benutzt wird.
WebDav ist eine Erweiterung zu HTTP, die es ermöglicht Dateien auch hochzuladen. So kann man
einfach die jeweilige Datei (ical oder vcard) auf dem Server plazieren und diese herunter
laden oder eben wieder schreiben. Das Problem ist nur: Jedes mal muss die gesamte Datei mit
allen Einträgen heruntergeladen werden und bei Änderungen auf dem Server übertragen. Das
kostet Zeit und macht verteiltes Arbeiten recht schwierig.&lt;/p&gt;

&lt;h4&gt;GroupDAV&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://de.wikipedia.org/wiki/Groupdav"&gt;GroupDav&lt;/a&gt; ist eine kleine Erweiterung
zu WebDav die einfach nur festlegt jeder Event oder Kontakt liegt in einer einzelnen Datei
in einem jeweiligen Unterordner. So muss immer nur eine Datei übertragen werden.  Diese Idee
finde ich noch von allen die beste Möglichkeit da man so auch einfach den Ordner lokal für
offline Arbeit zwischenspeichern kann.&lt;/p&gt;

&lt;h4&gt;IMAP&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://de.wikipedia.org/wiki/Kolab"&gt;Kolab&lt;/a&gt; definiert versteckte IMAP Ordner. Der
jeweilige Client speichert Kontakte oder Termine als Email in den jeweiligen versteckten Ordner
mit entsprechendem XML-Anhang. Die gesamte Kommunikation läuft so über IMAP Ordner.
Ist eine nette Idee, allerdings finde ich den Gedanken sehr unschön meine Kontakte und
Termine als XML-Anhang an eine versteckte Email ranzukleben. Ist irgendwie sehr umständlich
und sicher nicht Sinn der Sache.&lt;/p&gt;

&lt;h4&gt;SyncML&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://de.wikipedia.org/wiki/SyncML"&gt;SyncML&lt;/a&gt; hat sich ja längst auf allen Handys
festgesetzt und auch erste Plugins für Desktop-Anwendungen sind verfügbar. Dazu beigetragen
hat sicherlich &lt;a href="http://www.funambol.com/"&gt;funambol&lt;/a&gt; (früher Sync4J). Dies ist
ein freier SyncML-Server der von Google-Anwendungen über Groupdav bis hin zum IPhone alles
miteinander Syncen kann.&lt;/p&gt;

&lt;h3&gt;Kalender only&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://de.wikipedia.org/wiki/CalDAV"&gt;CalDav&lt;/a&gt; ist spätestens seit es Google in
seinem Kalender unterstützt etwas populärer als GroupDAV. Es basiert ebenfalls auf WebDav
allerdings kann man auch komplexere Abfrage-Queries an den Server stellen.  Das macht es einerseits
natürlich etwas effektiver als GroupDav allerdings auch komplexer zu Implementieren. Für Apache
gibt es übrigens ein &lt;a href="http://modules.apache.org/search.php?id=1653"&gt;CalDav-Modul&lt;/a&gt;.
Leider muss man Apache dafür neue übersetzten (was ich auf einem Server sehr ungern tue).&lt;/p&gt;

&lt;h3&gt;Kontakte only&lt;/h3&gt;

&lt;p&gt;Hier ist sicherlich eine der wichtigsten Lösungen &lt;a
href="http://de.wikipedia.org/wiki/Ldap"&gt;LDAP&lt;/a&gt;.  Fast jedes Programm kann auf LDAP
zugreifen. Es bietet sehr gute Such Möglichkeiten und ist einfach zu erweitern.  Leider hat
man hier immer das Problem das man auf ein LDAP nur lesend zugreifen kann. Will man Einträge
hinzufügen oder bearbeiten muss dies manuell auf dem Server geschehen. Deshalb wird von vielen
Groupware-Systemen LDAP nur als Read-Only-Verzeichnis genutzt. Die eigentlichen Änderungen laufen über
andere Protokolle. Serverseitig werden diese dann ins LDAP überführt.&lt;/p&gt;

&lt;h2&gt;Sonstiges&lt;/h2&gt;

&lt;p&gt;Eigentlich erwarte ich von einer Groupware, dass sie mehr als nur Emails, Kontakte,
Termine und Todos unterstützt.  Allerdings sieht es hier noch schlechter aus, als in den
anderen Bereichen. Wünschenswerte Features wären zum Beispiel RSS (was leider meistens nur
read-only für den Client ist. Also sprich der Client kann dem Server nicht mitteilen welche
Items ich gelesen habe. Kennt hier jemand eine Lösung??), XMPP, IRC (Wäre doch Klasse wenn
der komplette Verlauf, zum jeweiligen Kontakt, zentral abgespeichert wird) oder auch Bookmarks
(ganz im grandiosen (neuen) &lt;a href="http://delicious.com"&gt;delicious.com&lt;/a&gt;-Style). Aber
von solchen Ideen sind wir wohl noch ähnlich weit entfernt wie zu dieser Vision: &lt;a
href="http://www.heise.de/newsticker/Assoziative-Gedaechtnishilfe-fuer-mobile-Datensammler--/meldung/113568"&gt;Assoziative
Gedächtnishilfe für mobile Datensammler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ich hoffe ich konnte kurz einen Überblick über mögliche Techniken geben. Vielleicht kanntet ihr
ja das ein oder Andere noch nicht. Sollte ich was vergessen haben, einfach in den Kommentaren melden!
Zum Schluss mein Wunsch-Setup: IMAP (mit IDLE und Sieve), GroupDav, LDAP (read-only)
und Funambol-Connector.  &lt;a href="http://sogo.opengroupware.org/"&gt;SOGo&lt;/a&gt; (ein Fork von &lt;a
href="http://opengroupware.org/"&gt;OpenGroupware.org&lt;/a&gt;) bietet mir zwar genau das, allerdings
habe ich mit dem Kompilieren des Objective-C Quellcodes einige Probleme ;-).&lt;/p&gt;

&lt;p&gt;Anmerkung 1: Ich konnte (noch) nicht alle Produkte und Protokolle ausprobieren, deshalb sind
die Kommentare alle nur persönliche Empfindungen&lt;/p&gt;

&lt;p&gt;Anmerkung 2: Mir ist aufgefallen ich verlinke sehr wenig auf andere Seiten. Ich hab diesmal
sehr viel (vor allen) auf Wikipedia verlinkt. Findet ihr das besser?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-4389887337768811452?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=KHgbmf5a"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/juH-ORGTvrI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/juH-ORGTvrI/groupware-protokolle.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/08/groupware-protokolle.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3762902743438475961</guid><pubDate>Fri, 25 Jul 2008 16:40:00 +0000</pubDate><atom:updated>2008-07-25T18:44:23.060+02:00</atom:updated><title>Wissen ist nutzlos - Weisheit ist Macht!</title><description>&lt;p&gt;Man wird die gesamte Schulzeit, und leider nun im Studium auch noch weitgehend, darauf getrimmt
Dinge einfach zu Wissen. Großteils geschieht dieser Vorgang durch stupides Auswendiglernen
relevanter Teilbereiche. Selbst bei Mathematik oder Physik, die beide sehr viel mit Verstehen zu
tun haben, muss man manchmal einfach Definitionen oder Rechenvorschriften auswendig lernen. Und
sogar Deutsch bleibt nicht verschont. (Ich erinnere mich noch mit Grauen daran, als ich die
Gliederungssymbolreihenfolge im Inhaltsverzeichnis von Textanalysen auswendig lernen musste). Und
am Ende hat kann man zwar Teile auswendig, aber wirklich viel mehr weiß man dadurch nicht. Das
Beigebrachte beschränkt sich meist nur auf einige kleine Teilaspekte, die bis ins letzte Eck
beleuchtet werden, und doch werden andere zum Teil grundlegende Themengebiete weg gelassen. Und
spätestens nach der Prüfung ist sowieso alles vergessen.&lt;/p&gt;

&lt;p&gt;Man sieht oft nicht den Sinn hinter dem Ganzen. Das gesamte Lernen erscheint einem als
unnötige Zeitverschwendung. Der beste Weg ist diese Methodik sicher nicht, allerdings darf
man nicht in die Einstellung verfallen, man müsste nur lernen was man später auch einmal
braucht. Vieles von dem was man lernt sollte als Allgemeinbildung angesehen werden. Außerdem
denke ich, eine Schulnote im Zeugnis repräsentiert nicht zwingend den Wissenstand sondern viel
mehr die Motivation etwas zu lernen (auch wenn es einem zeitweise als unwichtig erscheint).&lt;/p&gt;

&lt;p&gt;Nun ist es aber so dass sich das gesamte Wissen unserer Gesellschaft ca. alle 5 Jahre
verdoppelt!! (Leider habe ich für die Behauptung keine gute Quelle. Allerdings habe ich mehrere
Angaben zwischen 2 und 7 Jahre gefunden). Dieser unglaubliche Wissenswachstum lässt jegliches
Auswendiglernen gradezu lächerlich erscheinen. Früher gab es immer das Zitat "Wissen ist Macht"
ich denke aber, im Kontrast zu der momentanen, rasanten Forschung sollte man dieses Zitat, nach
fast 400 Jahren, doch noch einmal überdenken. Es ist heute schon unmöglich auch nur in einem
Teilbereich alles zu wissen. Und so gewinnt die oben genannte Schul- oder vielmehr Lehrkritik
wieder an Bedeutung.&lt;/p&gt;

&lt;p&gt;Ich denke eine gewisse Allgemeinbildung muss vorhanden sein, allerdings sollte im allgemeinen
(und nicht nur auf die Schulen bezogen) Detailwissen viel weniger von Bedeutung sein. Es sollte
mehr auf Strukturierte Informationsaufbereitung und -verarbeitung Wert gelegt werden, als auf
die Informationen selbst. Wie man so schön sagt: "... man muss nur wissen wo es steht". 
Zudem gewinnt Erfahrung und breitgefächertes Kenntnis immer mehr an Bedeutung.&lt;/p&gt;

&lt;p&gt;Gerade für uns Informatiker stellt sich immer wieder das Problem der richtigen
Informationsverwaltung.  Ich habe zum Beispiel im Moment 174 Rss-Feeds abonniert, von denen ich
pro Tag mehrere Hundert neue Beiträge bekomme. Davon schau ich mir ca. 60 an und lese vielleicht
gerade einmal 10. Hinzu kommt noch IM und EMail.  Um keine Informationen zu vergessen sammle
ich seit langem Links bei Del.icio.us und habe mir ein privates Wiki aufgesetzt um Wichtiges
länger zu speichern. Doch das wichtigste Mittel um den Informationen Herr zu werden ist und
bleibt die Volltextsuche. Semantische Auszeichnung und automatisierte Verarbeitung durch KI ist
noch ein ferner Traum obwohl die Grundsteine gelegt sind. Bleibt abzuwarten was sich auf diesem
Feld tut.  Ich persönlich denke diese maschinelle Verarbeitung wird über kurz oder lange ein
wichtiger Hauptbestandteil unserer Informatik.&lt;/p&gt;

&lt;p&gt;Wahrscheinlich lernt man irgendwann in der Schule keine Jahreszahlen mehr sondern nur
noch Suchbegriffsyntax, reguläre Ausdrücke und ganz wichtig die Bewertung von gefundenen
Informationen... Ist dann Wissen überflüssig? Ob diese Vorstellung so viel besser ist?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3762902743438475961?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=ZGaqLPeZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/e0MTcmJfqvM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/e0MTcmJfqvM/wissen-ist-nutzlos-weisheit-ist-macht.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/07/wissen-ist-nutzlos-weisheit-ist-macht.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-717125774508546877</guid><pubDate>Sun, 13 Jul 2008 11:05:00 +0000</pubDate><atom:updated>2008-07-13T13:10:40.514+02:00</atom:updated><title>GEZ ein unabdingbares Übel - Teil 2</title><description>&lt;p&gt;Heute wie versprochen den zweiten und letzten Teil meiner Pro-Contra-Argumentierung zur GEZ. Nachdem ich im &lt;a href="http://nougad.blogspot.com/2008/07/gez-ein-unabdingbares-bel-teil-1.html"&gt;ersten Teil&lt;/a&gt; geschrieben habe warum ich die Rundfunkgebühren gut finde gibts heut meine Meinung warum ich die GEZ schlecht finde.&lt;/p&gt;

&lt;h2&gt;Mhmm, interessting ... but!&lt;/h2&gt;

&lt;p&gt;Wie vorher schon angekündigt, stehe ich nicht dem Abrechnungssystem als ganzes Kritisch gegenüber, sondern viel mehr der GEZ an sich. Leider wird Kritik an den Methoden der GEZ und dem der gesamten Gebührenverwaltung oft vermischt obwohl sie eigentlich nicht viel miteinander zu tun haben.&lt;/p&gt;

&lt;p&gt;Vor allem seit Anfang 2008 die sogenannte Abgabe auf neuartige Rundfunkempfangsgeräte in Kraft getreten ist, werden immer wieder Beispiele herangezogen um die Abbrechungen zu kritisieren. Sicherlich sind Fälle wie "Wenn der Sohn ein Einkommen hat, bei den Eltern wohn und einen eigenen Fernseher nutzt muss dieser auch angemeldet werden" oder "Wenn ein Computer bei einem Selbstständigen in einem abgetrennten Arbeitszimmer steht so ist zusätzlich ein gewerblicher Gebrauch anzumelden" nicht gerade schön zu lesen, allerdings halte ich nichts davon, ein System aufgrund von Einzelfällen zu bewerten. Ich denke die Berechnung hat einige gravierende Lücken und ist sicher nicht mehr auf dem aktuellen Stand, allerdings ist eine hundertprozentige Zufriedenheit aller Beteiligten bei solch komplexen Angelegenheiten unmöglich.&lt;/p&gt;

&lt;p&gt;Ob nun eine Abgabe auf Computer und Handys zulässig sind oder nicht lässt sich lange diskutieren. Ich möchte in diesen Bereich auch gar nicht zu tief wühlen da ich mir selber keiner Meinung sicher bin. Einerseits ist es fraglich in wie weit, mit zum Beispiel dem Handy, Dienste der ÖR genutzt werden und ob eine Video-on-Demand Lösung, wie sie aktuell üblich ist, mit dem ursprünglichen Streaming-Gedanken von Radio oder Fernsehen vereinbar ist. Auf der anderen Seite bieten die ÖR ein sehr umfassendes und vor allem qualitativ hochwertiges Angebot im Internet, so dass eine Zahlung eigentlich schon gerechtfertigt ist. (Notiz am Rande: Selbst &lt;a href="http://chaosradio.ccc.de/chaosradio.html"&gt;Chaosradio&lt;/a&gt; ist durch Rundfunkgebühren finanziert).&lt;/p&gt;

&lt;p&gt;Sicherlich ein sehr größer Kritikpunkt ist die Datenspeicherung der GEZ. Die GEZ hat zentral mehr Daten über die Bundesbürger gespeichert, als alle Einwohnermeldeämter zusammen. Die GEZ bekommt nicht nur Adressdaten von Einwohnerämtern sondern kauft diese auch extern bei kommerziellen Adresshändlern ein. Zudem kommen noch einige freiberufliche Gebührenfahnder die provisionsbasierend Arbeiten. Sollte man einmal bei der GEZ gemeldet sein so bleiben die Daten auch vorhanden selbst wenn man sich wieder abmeldet. Somit verfügt die GEZ bundesweit über den umfassendsten Datenbestand zu Privatpersonen. Intern beschäftigt die GEZ zwar Datenschutzbeauftragte allerdings wird sie nicht extern kontrolliert so dass immer wieder Datenschutzvergehen auffliegen.&lt;/p&gt;

&lt;p&gt;Die GEZ hat (zurecht) mit einem sehr negativen Bild zu kämpfen. Schaut man sich die Briefe, die Werbung oder auch das Vorgehen der Außendienstmitarbeiter an, so erkennt man ein sehr restriktives Vorgehen, bei dem der Anschein erweckt wird man muss augenblicklich mit drakonischen Strafen rechnen, da man ein zu einem Verdächtigen in einem Kapitalverbrechen degradiert wurde. Auf der anderen Seite versucht die GEZ ihren Ruf zu verbessern indem sie Medien abmahnte, die als Beispiel statt Rundfunkgebühr von einer GEZ-Gebühr sprachen oder das Wort Rundfunkgebührenbeauftragter durch einen GEZ-Fahnder vereinfachten. Leider scheinen die Verantwortlichen noch nicht begriffen zu haben dass man sein negatives Bild nicht durch Abmahnungen gegen eben diese negative Einstellung bereinigt.&lt;/p&gt;

&lt;p&gt;Alles in allem muss ich sagen ich finde es gut, dass es die Rundfunkgebühren gibt und auch das System mit dem sie eingetrieben werden. Nur kann ich auf der einen Seite die Berechnungskriterien nicht immer nachvollziehen und auf der anderen Seite sind die Verfahren der GEZ in keinster Weise tolerierbar.&lt;/p&gt;

&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;ALLES was in diesem Text geschrieben wurde basiert auf meinen persönlichen Ansichten und Ansichtsweisen. Da ich auf diesem Gebiet selbst nur Laie bin, und mir die Infos nur angelesen habe, schließe ich auch Inhaltliche Fehler und Unvollständigkeiten nicht aus. Berichtigungen und Kritik sind aber auf jeden Fall willkommen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-717125774508546877?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=upuSs6TU"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/MwLW23h5Cns" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/MwLW23h5Cns/gez-ein-unabdingbares-bel-teil-2.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/07/gez-ein-unabdingbares-bel-teil-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-1668203509764638489</guid><pubDate>Sat, 12 Jul 2008 09:12:00 +0000</pubDate><atom:updated>2008-11-13T09:13:21.797+01:00</atom:updated><title>GEZ ein unabdingbares Übel - Teil 1</title><description>&lt;p&gt;Ist es nicht manchmal seltsam? Man findet etwas persönlich schlecht, weiß aber eigentlich, dass der Sachverhalt so korrekt abläuft. Genauso geht es mir mit der GEZ. Ich kann die GEZ, wie so viele andere auch, nicht leiden und doch weiß ich, dass eine Gebührenpflicht für Öffentlich-rechtlicher Rundfunk notwendig und gut ist. &lt;/p&gt;

&lt;p&gt;Fangen wir mit den positiven Punkten der Rundfunkgebühr an. Aufgrund von aktuellen Beschwerden werde ich diesen Beitrag in zwei Teile aufsplitten. Heute gibts Pro-GEZ und morgen folgt das große Aber. Zusätzlich zu den normalen Kommentaren bitte ich heute mal auch Kritik zu den Beiträgen in die Kommentare zu schreiben. Findet ihr Splitten gut? Sind Beiträge zu komplex bzw. zu lange?&lt;/p&gt;

&lt;h2&gt;Gebührenverteilung&lt;/h2&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CCBUQk7990Q/SHh1vdKdTLI/AAAAAAAAAC4/GXlfpLwfgKc/s1600-h/Rundfunkgeb%C3%BChren.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_CCBUQk7990Q/SHh1vdKdTLI/AAAAAAAAAC4/GXlfpLwfgKc/s320/Rundfunkgeb%C3%BChren.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5222053226078882994" /&gt;&lt;/a&gt;

&lt;p&gt;Kurz möchte ich meine Sicht der Gebührenverteilung erläutern. Diese Sicht ist zum einen etwas vereinfacht und zum anderen an dieser Stelle ein deutlicher Verweiß auf den Disclaimer am Ende des Beitrags. &lt;/p&gt;

&lt;p&gt;Zentral von Bedeutung sind sicher erst einmal die Öffentlich Rechtlichen (ÖR), die dazu verpflichtet sind (siehe Grundgesetz Artikel 5 - Rundfunkfreiheit) ein von staatlichen Einflüssen unabhängiges Programm zu senden. Zusätzlich dazu ist eine Wirtschaftliche Unabhängigkeit aber ebenso von Bedeutung. Ziel dieser Bestimmung ist es eben eine gezielte Beeinflussung der ÖR zu vermeiden. Statt dessen sollen die betroffen Medien frei über staatliche und wirtschaftliche Misstände berichten dürfen, ohne an dieser Stelle von einer höheren Instanz eingeschränkt zu werden. In so weit sollte, denke ich, jeder mit der Notwendigkeit einer solchen Einrichtung übereinstimmen. &lt;/p&gt;

&lt;p&gt;Das große Problem an dieser Geschichte ist allerdings die Umsetzung. Fakt ist, dass eine Finanzierung über Steuern unmöglich ist, da Steuern vom Staat erhoben und verteilt werden. Somit wäre eine staatliche Unabhängigkeit nicht mehr gegeben. Der Staat könnte, mit einem steuerfinanzierten System, willkürlich die ÖR durch Geldzahlungen (oder vielmehr durch ausbleiben von Zahlungen) in eine gewollte Richtung lenken. &lt;/p&gt;

&lt;p&gt;Auf der Anderen Seite ist eine Finanzierung über zum Beispiel Werbeeinnahmen ebenfalls ausgeschlossen, da man hier die Einflussnahme der Wirtschaft nicht ausschließen kann. In Deutschland ist es durch die Duale Finanzierung allerdings trotzdem möglich &lt;strong&gt;auch&lt;/strong&gt; durch Werbung Geldeinnahmen verbuchen zu können. Wichtig ist allerdings hier die Tatsache, dass ÖR (eigentlich) kein Gewinn erwirtschaften können. Eine Handlung/Haltung ausschließlich zur Gewinnmaximierung fällt an dieser Stelle also schon mal weg. &lt;/p&gt;

&lt;p&gt;Eine Lösung die man dafür geschaffen hat ist die Gebühreneinzugszentrale der öffentlich-rechtlichen Rundfunkanstalten in der Bundesrepublik Deutschland (GEZ). Diese Verwaltungsgemeinschaft ist zum einen ebenfalls staatsfern organisiert, aber auch unabhängig von den ÖR. Sie nimmt das Geld der Empfänger, zieht seinen Anteil ab (ca. 2,2%) und verteilt den Rest auf die ÖR. So ist eine gerechte Verteilung an alle beteiligten Programmen gegeben.&lt;/p&gt;

&lt;p&gt;Nun kann die GEZ nicht nach belieben Geld eintreiben. Die ÖR vermelden an die jeweiligen Länder (Rundfunkgebühren ist Ländersache) ihren Bedarf, der diese Vorschläge objektiv bewertet (Kommission zur Ermittlung des Finanzbedarfs der Rundfunkanstalten - KEF) und die Höhe der zu zahlenden Rundfunkgebühren festsetzt.&lt;/p&gt;

&lt;h2&gt;Missverständnisse&lt;/h2&gt;

&lt;p&gt;Durch dieses gesamte, zugegeben recht komplexe Modell, ist eine Unabhängige Berichterstattung der ÖR weitgehend sichergestellt. Da allerdings der Bürger unzufrieden ist wenn er Geld abdrücken muss, gibt es immer wieder rufe nach einem Abschaffen der Rundfunkgebühren beziehungsweise einem alternativen Abrechnungssystem. Vor allem Sätze wie "Warum soll ich für ÖR zahlen wenn ich doch nur RTL schaue?" hört man immer wieder. Aber auch wenn sich, vor allem bildungsfernere Gesellschaftsschichten, mit dem Angebot der aktuellen Privatsender zufrieden geben so ist eine Abbrechung nach Nutzen sehr fatal (und sogar per Gesetz ausgeschlossen). Die ÖR müsste mit ihrem Programm so versuchen ein möglichst breites Publikum zu erreichen, da sie auf die Zahlungen angewiesen sind. Resultat wäre kaum mehr ein wirtschaftlich und staatlich unabhängiges Medium sondern viel mehr eine sensationslüstere und unseriöse Berichterstattung wie sie bei den Privatsendern schon zum Standard geworden ist. Außerdem leben die ÖR davon dass Alle einzahlen und vielleicht kann man doch noch hoffen dass ich der ein oder andere Privatsendergeschädigte auf einen Öffentlich-rechtlichen Kanal verirrt.&lt;/p&gt;

&lt;p&gt;Soweit zum Positiven Gedanken der GEZ. Morgen gibts den zweiten Teil mit meinen Negativen Erfahrungen.&lt;/p&gt;

&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;ALLES was in diesem Text geschrieben wurde basiert auf meinen persönlichen Ansichten und Ansichtsweisen. Da ich auf diesem Gebiet selbst nur Laie bin, und mir die Infos nur angelesen habe, schließe ich auch Inhaltliche Fehler und Unvollständigkeiten nicht aus. Berichtigungen und Kritik sind aber auf jeden Fall willkommen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-1668203509764638489?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=G9MZzDkU"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/LzsFG0TyfgY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/LzsFG0TyfgY/gez-ein-unabdingbares-bel-teil-1.html</link><author>noreply@blogger.com (nougad)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_CCBUQk7990Q/SHh1vdKdTLI/AAAAAAAAAC4/GXlfpLwfgKc/s72-c/Rundfunkgeb%C3%BChren.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/07/gez-ein-unabdingbares-bel-teil-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-5237886432482009954</guid><pubDate>Wed, 18 Jun 2008 19:51:00 +0000</pubDate><atom:updated>2008-06-18T21:58:36.811+02:00</atom:updated><title>Peinlich, Mozilla, Peinlich!</title><description>&lt;p&gt;Mozilla wirbt seit Tagen für seinen Rekordversuch bei dem sie mit Firefox 3.0 die meisten
Downloads in 24 Stunden erreichen wollen. Seit dies bekannt gegeben worden ist, steht die Frage im
Raum, wie viele Downloads überhaupt nötig sind. Gerade habe ich die Antwort darauf gelesen:&lt;/p&gt;

&lt;blockquote&gt;Das Guiness muss den Rekord allerdings noch anerkennen, denn die Kategorie gab es
bisher noch nicht. (&lt;a href="http://ubuntuusers.de/ikhaya/1102/"&gt;via&lt;/a&gt;)&lt;/blockquote&gt;

&lt;p&gt;Das heißt im Grunde die Frage ist nicht ob man genug Rekordversuche zusammen
bekommt sondern legentlich ob der Rekordversuch auch anerkannt wird. Wird
er anerkannt hätte wohl auch ein Download gereicht. Wird er nicht anerkannt
war sowieso alles umsonst. Und die ganzen 8,2 Millionen Leute hätten ihr &lt;a href="http://www.spreadfirefox.com/de/worldrecord/certificate_form"&gt;Zertifikat&lt;/a&gt; wohl ganz
umsonst ausgedruckt.&lt;/p&gt;

&lt;p&gt;Ich fand die gesamte Aktion nur eine schlechte Marketing-Aktion die mein sowieso
schon schlechtes Bild auf Mozilla nur noch mehr beschädigt hat. Allgemein scheint sich
die PR-Abteilung, im Moment, komplett im Urlaub zu befinden.  Nur so kann ich mir &lt;a href="http://www.mozilla-europe.org/de/firefox/#feature-vsie"&gt;solche Vergleiche&lt;/a&gt; erklären.
Allgemein versucht man die Masse durch absolut blödsinnige Werbetexte zu begeistern. So scheut
man sich auch nicht davor, mit &lt;a href="http://www.mozilla-europe.org/de/firefox/organic/"&gt;100%
Bio-Software&lt;/a&gt; zu werben. Traut man den Firefox Nutzern gar keine Intelligenz zu? Es ist
jedenfalls schön zu lesen das ich mein Studium damit zubringe Blaupausen zu malen, die zeigen
wie Software im innersten funktioniert. Wie muss man sich Bio-Software vorstellen? Darf ich nun
meine Software nicht mehr zur Konservierung radioaktiv bestrahlen? Oder darf ich einfach nur
keine synthetischen Schutzmittel mehr verwenden um meine Software frei von Bugs zu halten? Ich
finde es gut das eine Firma auf die Idee gekommen ist mit Freier Software zu werben, aber dann
soll man dem Kunden doch dies auch zumuten und nicht noch mehr verwirren.&lt;/p&gt;

&lt;p&gt;Etwas weiter am Anfang lobt sich Mozilla damit nicht von "Profitmaximierung" getrieben
zu werden. Auch diese Erkenntnis war neu für mich. Hat man nicht noch Ende letzten Jahres &lt;a href="http://www.pro-linux.de/news/2007/11739.html"&gt;Thunderbird abgestoßen&lt;/a&gt; da dieser zu wenig
Geld einspielt? Bei Firefox sieht das schon anders aus. Allein was Google, für die Suchleiste, an
Geld rein steckt!  Wenn man nun etwas die Gerüchte schüren möchte könnte man glatt behaupten
Thunderbird geht zugunsten gmails unter.  Wie man kurz darauf gesehen hat wurde es sogar den &lt;a href="http://www.pro-linux.de/news/2007/11826.html"&gt;Core-Entwicklern zu bunt&lt;/a&gt;. Auch schön
finde ich die &lt;a href="http://www.pro-linux.de/news/2008/12681.html"&gt;Datensammlungspläne&lt;/a&gt;
von Mozilla um "Einschaltquoten" von Webseiten zu ermitteln. Also so rein, wie sie Mozilla
gerne hätte, ist ihre Weste nicht.&lt;/p&gt;

&lt;p&gt;Was mich aber nun direkt an Firefox stört? Generell lässt sich das Problem mit dem
Satz "Was die Masse gut findet kann nur schlecht sein!" beschreiben. Allerdings will ich
mich, zumindest in diesem Post, nur auf das Problem Firefox beziehen. Am meisten stört mich
Mozilla! Einmal aus den oben genannten Gründen auf der anderen Seite aber auch ihre Open-Source
Politik. Klar Firefox ist (u.a.) unter der GPL veröffentlicht allerdings versucht, meiner
Meinung nach Mozilla möglichst alles unter sich zu behalten.  Wenn man mal überlegt was alle
Open-Source Produkte gemeinsam haben sind dies wohl die Forks. Bei Firefox ist mir nur Flock
bekannt. Alle anderen sind gescheitert weil Mozilla keinerlei Hilfe gibt. Ich erinnere mich
noch an den Versuch Firefox der auf GTK+ basiert auf QT zu portieren. Leider ist das Projekt
unter gegangen da Mozilla hier komplett dicht gemacht hat. Ein anderes Beispiel ist der &lt;a href="http://de.wikipedia.org/wiki/Namensstreit_zwischen_Debian_und_Mozilla"&gt;Namensstreit
zwischen Debian und Mozilla&lt;/a&gt; bei dem sich Debian vom Namen und Logo gelöst hat. Seit dem
bin auch ich bin seit dem demonstrativ auf Iceweasle umgestiegen.&lt;/p&gt;

&lt;p&gt;An Firefox merkt man finde ich ganz deutlich: Dieser Browser ist für die Masse gemacht! Es
finden sich kaum Einstellungsmöglichkeiten und die Konfiguration erinnert mich an den GAU namens
Windows Registry. Schon mal versucht Tastenkombinationen anzupassen? Oder gar einzustellen,
welcher Dateityp mit welchem Programm zu öffnen ist? Klar, die Masse an Windowsnutzer braucht
so was nicht. Die sind schon froh wenn im Gegensatz zum IE Webseiten korrekt angezeigt werden.
Für die Windowsnutzer scheint die Software auch optimiert zu sein. Ich kann mir sonst nicht
erklären warum Firefox unter Linux so langsam rendert. Allgemein leidet Firefox an dem Problem
der Plattformunabhängigkeit. Dazu kann zwar Firefox selbst nichts, aber ich finde es immer
unschön wenn sich ein Programm in keinster Weiße in den Desktop integriert. Bestes Beispiel
ist hier wohl der Passwort-Manager. Klar Windowsnutzer kennen so etwas wie Integration nicht,
aber gerade Mac OS und auch unter den Linux Desktops werden den Anwendern schöne Systeme
geboten um gerade so etwas wichtiges wie Passwörter zentral abzuspeichern. Andere Beispiele
finden sich ebenfalls zu Haufen.&lt;/p&gt;

&lt;p&gt;Wozu allerdings Firefox etwas kann ist die Integration ins Internet. Klar, Firefox zeigt
Webseiten an, aber damit ist es auch schon getan. Zum Beispiel die ursprüngliche Angekündigte
Unterstützung von Microformats im Firefox 3 wurde schon nach kurzem in eine API für Erweiterungen
herabgestuft.  Flock geht, meiner Meinung nach, hier schon eher den richtigen allerdings ist
auch dieser Browser weit davon entfernt mir zu gefallen.&lt;/p&gt;

&lt;p&gt;Alternativen? Ich nutze auch noch Firefox! ... Leider. Es gibt zwar schon noch einige Browser
wie, allerdings sind die alle nicht besser.  Konqueror zum Beispiel gefällt mir echt gut, aber
leider fehlen mir hier die Plugins. Das ist auch eins der wenigen Dinge die Firefox absolut
genial hinbekommen hat! Opera ist leider nicht Frei, weshalb ich ihn auch nie ausprobiert
habe. Und sonst?  Für den Gnome Desktop gibt es noch einige kleinere Browser wie Epiphany oder
Galeon allerdings sind auch diese nicht das Gelbe vom Ei.&lt;/p&gt;

&lt;p&gt;Ich warte gespannt auf einen minimalistischen Linux-Fork. Einfach so Dinge wie
Bookmarkverwaltung und Passwort-Manager weglassen und statt dessen auf Performance und
Konfigurierbarkeit achten. Features sollten dann bei Bedarf einfach über Plugins nachgerüstet
werden können. Auf jeden Fall denke ich das Firefox langsam aber sicher seinen Höhepunkt
erreicht hat. Zeit für einen neuen Browser!&lt;/p&gt;

&lt;small&gt;PS: Dieser Blogbeitrag ist zu 100% Biologisch abbaubar... Wenn er schon nicht ganz
Objektiv ist ;-)&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-5237886432482009954?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=E74dIjzo"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/TvdUhVYyO-Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/TvdUhVYyO-Q/peinlich-mozilla-peinlich-mozilla-wirbt.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/06/peinlich-mozilla-peinlich-mozilla-wirbt.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-5392986121889024638</guid><pubDate>Sat, 24 May 2008 23:08:00 +0000</pubDate><atom:updated>2008-08-02T10:56:10.774+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programmierung</category><title>Wissenswertes über Erlang(en)</title><description>&lt;p&gt;Viele haben es ja schon mitbekommen, aber nun noch mal für den Rest der Welt: Ich habe ein neues Spielzeug gefunden! Ich bin vor kurzem durch eine Folge im &lt;a href="http://chaosradio.ccc.de/cre082.html"&gt;Chaosradio&lt;/a&gt; auf die Programmiersprache &lt;strong&gt;Erlang&lt;/strong&gt; gestoßen. Erlang lässt sich mit nur einem Wort beschreiben: &lt;em&gt;anders&lt;/em&gt; (alternativ auch &lt;em&gt;genial&lt;/em&gt; ;-).&lt;/p&gt;

&lt;p&gt;Erlang bezeichnet sich selbst als COPL (Concurrency Oriented Programming Language). Diese Bezeichnung halte ich für sehr treffend. In Objektorientierten Sprachen dreht sich alles um Objekte und in Erlang sind es statt dessen die Prozesse. Ich habe vor kurzem einen Artikel gelesen, in dem es darum ging, dass Prozesse in Erlang doch im Grunde nichts anderes als Objekte in anderen Sprachen sind. Ich halte diesen Vergleich etwas unglücklich, da Erlang eine Funktionale Sprache ist. Am ehesten erinnerte mich Erlang an Prolog, da ich hier auch eine Art Regeln spezifizieren kann und es möglich ist darauf durch Abfragen über Matching zu zugreifen. Allerdings ist Erlang weitaus mächtiger.&lt;/p&gt;

&lt;p&gt;Erlang wurde ursprünglich 1987 von Ericsson für Telefonanlagen entwickelt. Und ich muss sagen sie haben sehr gute Arbeit geleistet. Nichts passt besser zu Telefonanlagen als Erlang: In Erlang läuft so gut wie alles parallel. Die Prozesse sind so leichtgewichtig das auch mehrere tausende gleichzeitig von der Performance kaum Auswirkungen haben. Erlang ist hochgradig Fehlertolerant: Sollte ein Prozess abstürzen kann ein anderer diesen einfach neu starten. Und zu guter Letzt: Es ist in Erlang einfach möglich während der Laufzeit Codeteile durch neue zu ersetzen; ohne Unterbrechung der Ausführung.&lt;/p&gt;

&lt;p&gt;Durch die Entwicklung in der Praxis ist Erlang keine akademische Sprache sondern (relativ) oft in freier Wildbahn anzutreffen. Spätestens nach der Open Source Variante, die 1998 veröffentlicht wurde, stieg die Beliebtheit rasch an. So gibt es heute eine Vielzahl von Projekten die auf Erlang aufbauen: Das berühmteste Beispiel ist wohl ejabberd ein Jabberserver. Außerdem setzt Amazon mit ihrer SimpleDB ebenso wie Facebook auf Erlang. Es gibt einen hochperformanten Webserver namens yaws und einem gigantischen Benchmark-Tool (Tsung) für z.B. Webserver. Außerdem gibt es eine Datenbank namens Mnesia die sich perfekt in Erlang integriert. Man hat so keine Tabellen mehr wie in Relationale Datenbanken sondern nutzt die Erlang eigenen Datentypen um mit der Datenbank zu kommunizieren. Außerdem kann Mnesia wie eigentlich alles in Erlang verteilt laufen so das es möglich wäre, auf einem Computer die DB im RAM (für Performance) zu halten und auf einem anderen die Datenbank auf Festplatte als Backup. Eine weitere Datenbank die auf Erlang setzt ist couchdb die Dokumenten-orientiert arbeitet.&lt;/p&gt;

&lt;p&gt;Doch was macht Erlang so besonders? Programmiert man in einer der üblichen Sprachen macht man immer ein neuen Thread auf wenn man muss. In Erlang macht man immer einen neuen Prozess auf sobald man kann. So ist es &lt;em&gt;theoretisch&lt;/em&gt; möglich das ein Erlang Programm auf einer Maschine mit 16 Prozessoren 16 mal schneller als auf einem Prozessor läuft. Die Prozesse in Erlang sind extrem leicht zu erstellen (sowohl von der Syntax als auch von dem Ressourcenverbrauch). Es ist möglich in Millisekunden einfach so mal 30000 Prozesse zu erstellen und wieder zu beenden ohne das die Prozessorauslastung sonderlich steigt.&lt;/p&gt;

&lt;p&gt;Threads? Prozesse? Was den nun? So gut wie alle Sprachen bieten Threads für Nebenläufigkeiten an. Erlang hingegen nur Prozesse. Der Hauptunterschied ist: Threads haben gemeinsam genutzten Speicher. Dadurch kommt es immer wieder zu Verklemmungen und Konflikte. Ein Hoher Aufwand muss betrieben werden um dies zu vermeiden. In Erlang geht man einen anderen Weg: Dort hat jeder Prozess exklusiv einen festen Speicher. Kein anderer Prozess kann ihm dazwischen funken. Die Prozesse kommunizieren untereinander durch einfache Nachrichten. Durch dieses Prinzip ist es zum Beispiel möglich ein Programm (fast) ohne umschreiben von einer Einplatzlösung auf mehrere Computer zu verteilen so dass die Programmteile miteinander kommunizieren.&lt;/p&gt;

&lt;p&gt;Der andere Vorteil von Erlang ist seine Eigenschaft als funktionale Sprache. So gut wie alle Probleme werden Rekursiv gelöst weshalb es auch keine Schleifen gibt. Außerdem kann man Funktionen einfach in Variablen speichern wodurch man gigantische Möglichkeiten bekommt. Am Anfang muss man sich doch sehr daran gewöhnen das Variablen, die einmal gesetzt wurden nicht wieder überschrieben werden können. Erlang arbeitet nur mit simplen Datentypen wie Tupeln und Listen, allerdings ist die Sprache so gebaut das diese einfachen Konstrukte vollkommen ausreichen. Und das Beste von allem: Der Index dieser Datentypen fängt bei 1 an! (und nicht wie üblich bei 0)&lt;/p&gt;

&lt;p&gt;Die Sprache eignet sich perfekt für Serveranwendungen auf die gleichzeitig viele Benutzer zugreifen, allerdings lässt sich auch das tk-GUI Toolkit verwenden wodurch GUI Anwendungen ebenso möglich sind. Sogar ein 3D-Modellierer namens Wings3D ist in Erlang geschrieben.&lt;/p&gt;

&lt;p&gt;Wer mehr über Erlang wissen will, dem kann ich nur die oben schon verlinkte Chaosradio-Sendung empfehlen. Die Dokumentation findet Großteils in man-Pages statt, was für Viele etwas ungewohnt ist. Allerdings findet man auch ein sehr gutes &lt;a href="http://erlang.org/doc/"&gt;Tutorial&lt;/a&gt; welches einem die Konzepte näher bringt. Zu der Entstehung der Sprache existiert ein großartiges &lt;a href="http://video.google.com/videoplay?docid=-5830318882717959520"&gt;Video&lt;/a&gt; welches ihr unbedingt anschauen müsst! Und zu Letzt muss ich noch unbedingt das Outro von Chaosradio verlinken welches auch ein Grund war die Sprache zu lernen (&lt;a href="http://www.lastfm.de/music/Foyer+des+Arts/_/Wissenswertes+%C3%BCber+Erlangen"&gt;Foyer des Arts - Wissenswertes über Erlangen&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Ich dachte mir, evtl. besteht ja Interesse an einem kleinen Tutorial hier auf diesem Blog? Wenn ihr sagt euch würde die Sprache interessieren starte ich mal den Versuch ein kleines Tutorial über Erlang zu schreiben.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-5392986121889024638?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=X4z0TZq8"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/cYbQnIrcOYQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/cYbQnIrcOYQ/wissenswertes-ber-erlangen.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/05/wissenswertes-ber-erlangen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-1536124659335769929</guid><pubDate>Thu, 08 May 2008 11:00:00 +0000</pubDate><atom:updated>2008-05-08T13:08:46.085+02:00</atom:updated><title>Massendownload</title><description>&lt;p&gt;Wie oft steht man vor einem Problem wie es simpler nicht sein könnte? Doch weil man eine besonders elegante Lösung möchte verrenkt man sich dabei beide Arme... So erging es mir gestern wieder. Mein Gedanke war aus einem Directory-Index, wie er von jedem Webserver generiert wird, alle Dateien auszulesen und herunter zu laden. Das Ergebnis sollte allerdings möglichst kurz sein und in nur einem Befehl, ohne irgendwelche Hilfsdateien anlegen zu müssen, abgeschlossen sein.&lt;/p&gt;

&lt;p&gt;Nach stundenlangen Versuchen mit &lt;a href="http://de.wikipedia.org/wiki/Sed_%28Unix%29"&gt;sed&lt;/a&gt; habe ich nun endlich heute eine Lösung gefunden mit der ich leben kann:&lt;/p&gt;

&lt;code&gt;wget -qO- $PARAM | ruby -e "STDIN.each_line{|line| file=line.gsub!(/^&amp;lt;img .*&amp;gt; &amp;lt;a href=\"(.*)\"&amp;gt;.*$/, '\1'); puts('wget '+'$PARAM'+file) unless file.nil?}"&lt;/code&gt;

&lt;p&gt;Dabei enthält die Variable &lt;code&gt;PARAM&lt;/code&gt; meine Webseite und evtl. weitere Parameter. Ein Beispiel wäre eine benötigte Authentifizierung: &lt;code&gt;PARAM="--http-user=XY --http-passwd=XYZ http://example.org/";&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Allerdings ist meine Lösung ist mit ca. 300 Zeichen sicher nicht die kürzeste/eleganteste deshalb hier mein Aufruf: Wer schafft es besser??&lt;/p&gt;

&lt;p&gt;Anmerkung: 1.) Überprüft meine Zeile nicht ob es sich wirklich um eine Index Seite handelt und 2.) weiß ich nicht ob es bei allen Index-Seiten funktioniert. Bisher habe ich es glaube ich nur mit Apache-generierten Standard Seiten getestet. Diese kann man allerdings nach belieben anpassen so das es dann evtl. nicht mehr funktioniert. Beim ISS bin ich recht sicher das es nicht geht ... wird der  getrost ignoriert. Wenn jemand sonst noch ein Szenario hat, immer her damit!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-1536124659335769929?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=tFfgBW6R"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/UQ0E9ucv8WI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/UQ0E9ucv8WI/massendownload.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/05/massendownload.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3495062914415918320</guid><pubDate>Mon, 05 May 2008 16:23:00 +0000</pubDate><atom:updated>2008-11-13T09:13:21.985+01:00</atom:updated><title>Sinnlose Spielerei ...</title><description>&lt;p&gt;... aber trotzdem interessant. Gerade habe ich etwas mit meinen Boot Optionen herum gespielt. Dabei bin ich zufällig auf ein nettes Tool namens &lt;a href="http://www.bootchart.org/"&gt;Bootchart&lt;/a&gt; gestoßen. Dieses Programm analysiert den Boot Prozess und stellt diesen Grafisch da. Ich geb mal eine Kurzeinführung wie man das Programm unter Gentoo zum laufen bringt. Für andere Distributionen sollte die Installation ähnlich verlaufen. Alternativ gibt es in der &lt;a href="http://bootchart.svn.sourceforge.net/viewvc/*checkout*/bootchart/trunk/bootchart/README"&gt;README&lt;/a&gt; noch eine andere Möglichkeit.&lt;/p&gt;

&lt;p&gt;Zuerst muss das Paket app-benchmarks/bootchart installiert werden. Da das Programm als masked gekennzeichnet ist muss man die folgende Zeile in die Datei einfügen: &lt;code&gt;echo "~app-benchmarks/bootchart-0.9 ~x86" &gt; /etc/portage/package.keywords&lt;/code&gt;. Anschließend das Paket gleich mergen. Dabei unbedingt darauf achten, dass das Java UseFlag aktiviert ist, da sonst später nicht automatisch Bilder erstellt werden.&lt;/p&gt;

&lt;p&gt;Nun kommt die Konfiguration dran. In der Datei &lt;code&gt;/etc/conf.d/rc&lt;/code&gt; die folgende Option einstellen: &lt;code&gt;RC_BOOTCHART="yes"&lt;/code&gt; außerdem in &lt;code&gt;/etc/bootchartd.conf&lt;/code&gt; die Option &lt;code&gt;AUTO_RENDER="yes"&lt;/code&gt; aktivieren. Wenn man sonst noch etwas wünscht wie zum Beispiel ein anderer Outputpfad oder ein anderes Format kann man dies hier ebenfalls angeben.&lt;/p&gt;

&lt;p&gt;Wenn man nun neu startet kann man eine grafische Darstellung des Bootprozesses unter &lt;code&gt;/var/log/bootchart.png&lt;/code&gt; (oder so ähnlich, je nach Einstellungen in der Config-Datei) bewundern.&lt;/p&gt;

&lt;p&gt;Um ehrlich zu sein ist das ganze (wie Benchmarks allgemein) relativ sinnlos, aber nett anzusehen. Deshalb los, los, ich will euren Bootprozess bewundern ;-). Ich mach schon mal den Anfang:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CCBUQk7990Q/SB810S_34_I/AAAAAAAAACs/CESzGlo3mxU/s1600-h/bootchart.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_CCBUQk7990Q/SB810S_34_I/AAAAAAAAACs/CESzGlo3mxU/s320/bootchart.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5196931667578053618" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3495062914415918320?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=YQnijPbT"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/XTWH9wRLgBg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/XTWH9wRLgBg/sinnlose-spielerei.html</link><author>noreply@blogger.com (nougad)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_CCBUQk7990Q/SB810S_34_I/AAAAAAAAACs/CESzGlo3mxU/s72-c/bootchart.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/05/sinnlose-spielerei.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-7441968504859435187</guid><pubDate>Thu, 24 Apr 2008 14:52:00 +0000</pubDate><atom:updated>2008-04-24T16:52:45.760+02:00</atom:updated><title>R.I.P. Lidl</title><description>&lt;p&gt;Lidl ist durch ihre Mitarbeiter / Kundenüberwachung in letzter Zeit eigentlich genug in Kritik geraten. Man sollte sich nach diesen Vorwürfen nochmal überlegen ob man dort wirklich einkaufen will. Aber bei diesem Super Angebot heute konnte ich nicht widerstehen:&lt;/p&gt;

&lt;p&gt;500 GB externe SATA Festplatte in Aluminiumgehäuse mit Netzwerk-, eSATA- und USB-Anschluss für gerade mal 139 EURO&lt;/p&gt;

&lt;p&gt;Und da meine eine externe Festplatte vor kurzem sowieso seinen Geist aufgegeben hat, war dies (trotz Lidl) ein verlockendes Angebot. Soweit zur Theorie... Ich also vor genau drei Wochen um 9:00 Uhr vor dem Lidl gestanden und wollte eben diese Festplatte. Nachdem ich sie nirgends gefunden habe bin ich gleich an die Kasse um dort nachzufragen. Ich dachte ja ich höre nicht recht als man mir sagte, dass die Filiale nur &lt;strong&gt;zwei Festplatten&lt;/strong&gt; geliefert bekommen hat. Ich mich natürlich erstmal total aufgeregt da dies ja nicht das erste Mal ist, dass Lidl vorher groß Werbung macht und dann kaum Exemplare auf Lager hat.&lt;/p&gt;

&lt;p&gt;Die Mitarbeiterin, verwies mich allerdings sofort (anscheinend passiert das öfters...) auf die Service-Hotline die groß über dem Ausgang hängt. Ich natürlich gleich mein Handy ausgepackt und versucht dort anzurufen. Aber ich war wohl nicht der Einzige, der mit Lidl seine Probleme hatte. Gegen 11:30 habe ich dann endlich jemanden erreicht, der mir versicherte, dass es eigentlich nicht möglich sei. Er würde versuchen eine andere Festplatte vom Lager zu meiner Filiale zu schicken. Nachdem ich ihm (zugegeben etwas ungern) meine Kontaktdaten gegeben habe versprach er die Festplatte auf meinem Namen zu hinterlegen.&lt;/p&gt;

&lt;p&gt;Eine Woche später wurde ich wieder angerufen. Im Lager sind noch Festplatten verfügbar und wenn ich noch Interesse habe, würde man mir eine in meine Filiale schicken. Ich hab mich natürlich erstmal gefreut und gewartet das sich, wie versprochen, meine Filiale meldet sobald die Platte dort eingetroffen ist.&lt;/p&gt;

&lt;p&gt;Nachdem ich am Dienstag noch immer nichts von meiner Platte gehört habe, fragte ich halt nochmal nach (Die Nummer hatte ich ja mittlerweile eingespeichert). Wer hätte es gedacht? Mein Platte ist natürlich schon längst in der Filiale, man hatte nur vergessen mich anzurufen. Ich also gleich Abends zum Lidl und Platte abgeholt.&lt;/p&gt;

&lt;p&gt;Ab hier wird es Technisch: Nachdem das Teil ja ein Netzwerkanschluss mitbringt bin ich davon ausgegangen das dort ein UNIX sein Dienst verrichtet und mir die Daten per SMB, FTP, NFS etc. zur Verfügung stellt. Das ganze kann man dann über ein Webinterface Verwalten (IP/DHCP etc.). Die Realität sah leider etwas anders aus: Das Laufwerk war von Targa und arbeitete mit &lt;a href="http://de.wikipedia.org/wiki/NDAS"&gt;ndas&lt;/a&gt; dazu in Wikipedia:&lt;/p&gt;

&lt;blockquote&gt;
  Network Direct Attached Storage (NDAS) ist ein proprietäres System für Speichermedien (meist Festplatten), die ohne einen PC oder Server direkt an ein Netzwerk angeschlossen werden können und auf dem Zielsystem wie ein lokaler Datenträger erscheinen.
&lt;/blockquote&gt;

&lt;p&gt;Software war natürlich dafür nur Windows dabei allerdings habe ich auf der Herstellerseite auch ein "Source"-&lt;a href="http://code.ximeta.com/trac-ndas/wiki/Gentoo"&gt;Paket&lt;/a&gt; gefunden. Bis auf ein paar Libs, die nur binär vorliegen, kann man es sich also kompilieren. Das &lt;a href="http://bugs.gentoo.org/show_bug.cgi?id=168295"&gt;Gentoo-Paket&lt;/a&gt; hat etwas ärger gemacht, deswegen habe ich es selbst kompiliert.&lt;/p&gt;

&lt;p&gt;Das ganze &lt;a href="http://code.ximeta.com/trac-ndas/wiki/Usage"&gt;läuft nun so ab&lt;/a&gt;: Die Platte hat eine eindeutige ID. Über die muss man die Platte auf jedem PC, auf dem man sie nutzen möchte, registrieren. Anschließend muss man einen ndas Dienst starten der schaut ob die Platte im Netzwerk ist. Wenn ja erscheint sie dann als Blockdevice und man kann sie wie gewohnt mounten. Blöder weiße kann immer nur ein Computer die Festplatte mounten und zwei mal ist mir beim unmount mein Laptop eingefroren (was mir unter Linux zuvor noch nie passiert ist). Und was das Fass zum überlaufen brachte: Die Funktion mit der ich ein erneutes Suchen nach der Platte anstoßen kann ist nicht eingebaut. So muss man immer den Dienst neu starten um zu suchen. Alles in allem muss ich sagen die Technik ist absoluter Bullshit!&lt;/p&gt;

&lt;p&gt;Fazit: Ich habe die Platte gestern zurück getragen und hab mein Geld wieder abgeholt. Auch wenn das Angebot wirklich gut war, ist die Technik dahinter einfach nicht zu gebrauchen. Dann leg ich lieber noch 20€ drauf und hab eine funktionierende Festplatte. Ich muss sagen ich bin einerseits davon enttäuscht &lt;b&gt;wie&lt;/b&gt; Lidl verkauft, da sie einfach absichtlich möglichst wenig Festplatten ausliefern. Andererseits auch &lt;b&gt;was&lt;/b&gt; Lidl verkauft. Würde nicht mein Miteinkäufer unbedingt immer bei Lidl einkaufen wollen, würde ich wohl in nächster Zeit einen großen Bogen um Lidl machen. (Außer evtl. &lt;a href="http://denkspuren.blogspot.com/2008/04/lidl-und-der-kassen-bug.html"&gt;zum Spaß&lt;/a&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-7441968504859435187?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=ZHFo1g6w"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/PFGWV75t5Y8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/PFGWV75t5Y8/rip-lidl.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/04/rip-lidl.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3458562645454363572</guid><pubDate>Mon, 07 Apr 2008 21:24:00 +0000</pubDate><atom:updated>2008-04-07T23:41:40.307+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programmierung</category><title>Ich kann nicht Programmieren...</title><description>&lt;p&gt;... zumindest kam es mir letzte Woche so vor. Für eine Vorlesung musste ich einen (bis jetzt) vereinfachten Single Sign On - Server schreiben. Da wie gesagt dies bisher nur ein Prototyp ist, war die Implementierung relativ simpel und die Anwendung lief recht schnell. Die nächste Aufgabe bestand daraus den Prototyp mit vorgegebenen Unittests zu testen.&lt;/p&gt;

&lt;p&gt;GRAUSAM! Ich dachte naja, zwei drei Tests werden wohl rot sein, aber das gut 60% fehlschlägt hat mich dann doch sehr betroffen gemacht. Die meisten Fehler waren einfach eine fehlende Überprüfung auf Null oder eine vergessene Negation in einer If Abfrage. Ich habe mich darauf hin gleich gefragt warum die Tests so schlecht ausgefallen sind bzw. was man besser machen könnte um solche Fehler zu vermeiden.&lt;/p&gt;

&lt;p&gt;Natürlich Methoden wie Unittests, Design by Contract, TDD, etc. sind in aller Munde aber mal ehrlich, nutzt ihr die bei jedem Projekt so ausführlich wie man sollte? Ich bestreite nicht den Nutzen dieser Techniken, auch bin ich mir durchaus benutzt das diese bzw. vergleichbare Techniken in ernsthaften Projekten unabdingbar sind aber ich finde es sind immer noch zu viele Barrieren vorhanden so das die Techniken wirklich Sinn geben. Ich weiß nicht genau wie ich sagen soll, deshalb gibt es mal paar Beispiele:&lt;/p&gt;

&lt;p&gt;Ein Unittest ist schnell geschrieben, aber man muss ja prinzipiell jede Mögliche Kombination von Input und Output Werten bzw. auch an Zuständen im System Abdecken. Ein enges System aus Unittests halte ich für sehr sinnvoll, aber wenn sich beispielsweise ein Nutzer mit Name und Passwort an einem Server anmelden will. Was muss ich alles Testen? Was ist wenn Nutzername und/oder Passwort Null sind? Was ist wenn Nutzer und/oder Passwort falsch sind? Was ist wenn der Server nicht erreichbar ist? Was ist wenn der Nutzer bereits angemeldet ist? Was ist wenn der Nutzer überhaupt nicht im System vorhanden ist? Was ist wenn Nutzername und/oder Passwort ein Leerer String sind? Und so weiter. Mir fällt bestimmt noch mehr ein. Und das nur für einen Vorgang! Man stelle sich das mal in einem Komplexen System vor! Außerdem ergibt sich früher oder später die otwendigkeit von Mock Objekten und GUI Tests. Diese Spirale dreht sich so lange hoch bis ich irgendwann mehr Testcode als produktiven Code habe. Und genau hier tritt für mich ein Widerspruch zwischen Theorie und Praxis auf. Ich weiß das es gut ist, ich weiß das man es braucht, aber ich habe keine Ahnung wie man sinnvoll (sowohl logistisch als auch zeitlich) alle Fälle abdecken soll.&lt;/p&gt;

&lt;p&gt;Andere Möglichkeit sind Pre- Postconditons. Hier tritt, außer dem Umfangproblem der Unittests, auch noch das Problem der Mangelnden Verbreitung auf. Die Sprachen, die ich mehr oder weniger kenne (Java, Ruby, C(++), Python, Bash, Prolog(:D), ...) bringen Conditions von Haus aus nicht mit. Deshalb bleiben mir zwei Möglichkeiten: Entweder ich lade mir eine zusätzliche Erweiterung der Programmiersprache dazu (was leider wieder andere Probleme wie Kompatibilität und Overhead mit sich bringt) oder ich arbeite mit Asserts. Bringt meine Sprache der Wahl schon Asserts mit habe ich es etwas einfacher. Ansonsten muss man sich erst eine Assert Funktion schreiben (wofür es gerade in Ruby einige sehr schöne Ansätze gibt!). Das Problem was ich hier wieder sehe ist einfach das es keine gezielte Notation der Conditions gibt. Ich habe einfach am Anfang (oder auch am Ende) meiner Funktion 10,20 oder auch mehr Zeilen mit Assert Statements die alle Fälle die mir einfallen abdecken sollten. Blöd nur wenn die Methode selbst nur 5 Zeilen hat. Besser wäre ein Ansatz mit dem man durch die Erweiterung der Sprache eine gesonderte Syntax innerhalb des Methodenkopfes einführt. Und selbst da macht einem die Vielzahl der Möglichen Input- und Output-Werte Kopfzerbrechen.&lt;/p&gt;

&lt;p&gt;Ich habe jetzt mal die beiden Methoden herausgegriffen und meine Bedenken dazu geäußert. Ich komme aber irgendwie aus diesem Widerspruch nicht heraus. Um robusten Code zu schreiben muss ich alle Fälle abdecken, wenn ich alle Fälle abdecke, komme ich nicht dazu Code zu schreiben. Klar der Mittelweg ist der beste, aber das dachte ich bei meinem Projekt auch und dann waren doch 60% rot. Es muss doch eine Möglichkeit geben schnell und kurz während ich die Methode schreibe alle Fälle auszuschließen die nicht auftreten dürfen. So eine Technik kann nur funktionieren wenn sei nebenbei, schon fast automatisch, abläuft (sei es nun wirklich automatisiert oder einfach nur durch den Autor). Aber irgendwie kämpfen die Methoden die mir spontan einfallen alle mit massig Overhead.&lt;/p&gt;

&lt;p&gt;Wie handhabt ihr das? Schon mal TDD versucht? Geht es euch Ähnlich? Ich bin für Vorschläge dankbar!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3458562645454363572?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=aKZEnO5S"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/_K1E-yrV2ss" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/_K1E-yrV2ss/ich-kann-nicht-programmieren.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/04/ich-kann-nicht-programmieren.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-693215850211445682</guid><pubDate>Mon, 31 Mar 2008 14:42:00 +0000</pubDate><atom:updated>2008-03-31T23:31:23.242+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programmierung</category><title>Kurzes Statement an alle Programmierer</title><description>&lt;p&gt;Aus aktuellem Anlass 3 kurze Statements an alle Programmierer da draußen:&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Wenn ihr glaubt man kann durch das Einsetzten toller Tools, Editoren oder Libraries bessere Programme schreiben, dann könnt ihr nicht programmieren!&lt;/dt&gt;
  &lt;dd&gt;Ich sehe es an Eclipse: IntelliSense, Projektverwaltung, Wizards alles schön und gut, ich arbeite trotzdem ungern damit! Eclipse hat tausend Einstellungsmöglichkeiten aber versucht mal die Einrückung auf zwei Leerzeichen einzustellen. Warum zum Teufel mach ich tausend Menüpunkte statt einer Configdatei? Warum muss ich eine halbe Minute warten bis ich Eclipse gestartet hab nur um zu schauen ob Änderungen im SVN sind? VIM ist für mich mit Abstand der beste Editor obwohl ich ihn bei weitem noch nicht so bedienen kann wie ich es gerne hätte. Dort ist einfach alles einstellbar, so wie es für jeden richtig ist. Für was brauche ich IntelliSense wenn ich eine Doku hab? Für was brauche ich ein SVN-Plugin wenn ich svn als Programm habe? Eclipse steht nur im Weg wenn man programmiert. Sicher Programmiert es sich so schneller weil man einfach nur seinen Methodennamen vervollständigen lassen muss aber genau in dem Moment gibt man das Denken an die IDE ab. Bevor ich in Eclipse ein Projekt erstellt habe bin ich mit VIM fertig.&lt;/dd&gt;

  &lt;dt&gt;Wenn ihr glaubt man kann aus einem UML-Diagramm, einem GUI-Designer oder Anderweitig auch nur Programmteile  zusammenklicken, dann konntet ihr noch nie programmieren!&lt;/dt&gt;
  &lt;dd&gt;Programmieren hat zu einem kleinen Teil etwas mit einer planbaren Engineeringtätigkeit zu tun. Der Rest besteht aus Erfahrung und einem künstlerischem Prozess. Mit Kunst meine ich keine schöne GUI sondern viel mehr ist es eine Art von künstlerischem Ausdruck. Etwas, das durchaus mit dem spielen eines Instrumentes gleich kommt. &lt;strong&gt;KEIN&lt;/strong&gt; Editor schafft es dies durch ein paar Code-Templates die man im Hintergrund platziert zu komprimieren. Sie gaukeln nur ein schnelles Ergebnis vor bis man ein gewissen Detailgrad erreicht hat und dann kommt der GAU weil der Editor nur noch im Weg steht und komplexe Dinge nicht mehr möglich sind.&lt;/dd&gt;

  &lt;dt&gt;Wenn ihr glaub, man muss nicht stetig weiterlernen, dann werdet ihr auch nie programmieren können!&lt;/dt&gt;
  &lt;dd&gt;Je nach dem was man als Programmiersprache definiert sollten zwei neue Sprachen im Jahr locker drinnen sein. Jeden Monat ein Buch zu einem neuen Thema sollte auch möglich sein. Bevor man sich mit einem neuen Thema beschäftigt =&gt; Buch lesen. Bevor man versucht etwas durch probieren zum laufen zu bekommen =&gt; Buch lesen. Ziel ist es zu wissen was man tut und nicht Beispiele aus einem Online Tutorial herauszukopieren und zu hoffen das es Funktioniert!&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Schlechte Programme sind das Übel der Neuzeit. Früher gab es die Pest, heute reichen dazu ein paar Programmierer. Programmieren hat nichts mit Syntax zu tun. Programmieren ist einfach ein Gefühl welches sich durch Code ausdrückt!&lt;/p&gt;


&lt;p&gt;Anmerkung: Das ganze ist natürlich (mal wieder) übertrieben und nicht ganz ernst gemeint. Deswegen ist es leider nicht weniger wahr.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-693215850211445682?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=m380Xnks"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/fgWsnF6ElsY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/fgWsnF6ElsY/kurzes-statement-alle-programmierer.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/03/kurzes-statement-alle-programmierer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3057518062526747746</guid><pubDate>Sat, 15 Mar 2008 17:58:00 +0000</pubDate><atom:updated>2008-03-15T19:17:21.181+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programmierung</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>ssh-agent Startscript</title><description>&lt;p&gt;Nachdem ich zufällig auf einige interessante Möglichkeiten von SSH gestoßen bin entschloss ich mich vor meinen Semesterferien das Buch "&lt;a href="http://www.amazon.de/SSH-Secure-Shell-Daniel-Barrett/dp/3897212870/"&gt;SSH, The Secure Shell&lt;/a&gt;" auszuleihen. Ich muss sagen wenn dieses Buch ist schon fast die SSH Spezifikation. Dort steht wirklich alles drinnen. Zum Lesen völlig ungeeignet allerdings für Ideen und zum Nachblättern gar nicht mal so schlecht.&lt;/p&gt;

&lt;p&gt;So bin ich auch auf Authentifikation über SSH-Keys gestoßen. Normalerweise gibt man sein Passwort ein, wenn man sich auf einem Server anmeldet. SSH-Keys funktionieren allerdings eher wie GPG Verschlüsselung. Man generiert einen Public Key, den man auf allen Servern, bei denen man sich anmelden möchte, hinterlegt. Außerdem noch einen Privat Key mit dem sich jeder, bei allen Server auf denen der Public Key hinterlegt ist, anmelden kann. Das funktioniert einfach, in dem der Server mit dem Public-Key eine Challenge verschlüsselt und diese dem Client zusendet. Dieser entschlüsselt die Nachricht wieder und sendet es zurück. Stimmen die Nachrichten beim Server überein wird der Nutzer rein gelassen. Allerdings kann dann wie schon gesagt jeder der den Private Key kennt auch auf den Server zugreifen. Um dies etwas zu erschweren kann man ein Passwort definieren das für den Privaten Key benötigt wird. Man sieht schon, im Grunde nichts anderes als GPG. In Wirklichkeit kann man sogar (mit den nötigen Einstellungen) seinen GPG Key dafür nutzen.&lt;/p&gt;

&lt;p&gt;Nun hat man zwar SSH-Key, allerdings darf man nun wieder jedes mal sein Passwort eingeben. Man hat also nichts gewonnen. Dafür gibt es nun (ebenfalls aus der GPG-Welt bekannt) einen Agent, der die Key einmal lädt, dabei das Passwort abfragt und anschließend auf Anfragen reagiert. So muss man nicht jedes mal neu sein Passwort eingeben. Sehr praktische Geschichte! Leider ist die Syntax etwas umständlich und auch muss jeder Key einzeln geladen werden. Deshalb habe ich mir etwas den Kopf zerbrochen wie man dies automatisieren kann. Dabei ist das folgende Script entstanden. Es schaut bei jedem Aufruf (in der Regel sobald sich eine neue Shell öffnet) ob der SSH-Agent läuft. Außerdem lädt es die Keys Automatisch so das man nur noch die Passwörter eingeben muss. Außerdem ermöglicht es über die beiden Funktionen &lt;code&gt;start-ssh-agent&lt;/code&gt; und &lt;code&gt;load-ssh-indentities&lt;/code&gt; dies auch Manuell durchzuführen.&lt;/p&gt;

&lt;p&gt;Um zu verstehen wie das Script funktioniert muss man sich erst einmal anschauen wie der ssh-agent bekannt gibt es es ihn gibt. Ruft man ihn einfach mit dem &lt;code&gt;ssh-agent&lt;/code&gt; Kommando auf (was der falsche Weg ist), erscheinen einige Variablen. Diese Variablen sind wichtig damit der ssh-Client auf den Agent zugreifen kann. Der Agent selbst läuft vom Terminal losgelöst. Er wird also nicht beendet wenn die Session beendet wird sondern läuft im Hintergrund weiter. Einer der richtigen Wege (es gibt mehrere Möglichkeiten) wäre &lt;code&gt;eval `ssh-agent`&lt;/code&gt;. Hier wird zuerst der ssh-agent aufgerufen und die Ausgaben ausgeführt. So werden die Variablen im aktuellen Terminal bekannt gegeben. Möchte man nun auch in einer anderen Session auf den Agent zugreifen muss man dort auch einfach nur die Variablen bekannt machen. Da der Agent wie gesagt unabhängig von der aktuellen Session läuft interessiert es nicht aus welcher Shell er gestartet wurde.&lt;/p&gt;

&lt;pre&gt;$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Yvpvk13029/agent.13029; export SSH_AUTH_SOCK;
SSH_AGENT_PID=13045; export SSH_AGENT_PID;
echo Agent pid 13045;&lt;/pre&gt;

&lt;p&gt;Mein kleines Script macht im Grunde nichts anderes als diese Variablen in einer Datei zu speichern und bei jedem anmelden diese einzulesen. Außerdem lädt es alle Identitäten die in in dem Verzeichnis &lt;code&gt;~/.ssh/keys/&lt;/code&gt; liegen. Wichtig ist, dass dort nur Private-Keys liegen dürfen; keine Public-Keys!&lt;/p&gt;

&lt;pre&gt;
# Lädt alle Indentitäten im Verzeichnis ~/.ssh/keys/
function load-ssh-indentities() {
  # Prüft erst ob ein tty verfügbar ist
  if tty -s ; then
    for FILE in ~/.ssh/keys/* ; do
      ssh-add $FILE
    done
  fi
}

# Startet den SSH-Agent mit einer Indentitäten-Lifetime von einer Stunde
# und schreibt die Variablen in die ~/.ssh_agent_vars Datei
function start-ssh-agent() {
  eval `ssh-agent -s -t 3600`
  echo -e "export SSH_AGENT_PID=$SSH_AGENT_PID\nexport SSH_AUTH_SOCK=$SSH_AUTH_SOCK" &gt; ~/.ssh_agent_vars \
  &amp;&amp; echo "SSH-Agent gestartet"
}

# Fragt erst nach ob Indentitäten geladern werden sollen.
function _ask_load_ssh_indentities() {
  echo "Indentitäten laden? (y/N)"
  read ANSWER
  ( [ "$ANSWER" = "y" ] || [ "$ANSWER" = "Y" ] ) &amp;&amp; load-ssh-Indentitäten
}

# Die Variable SSH_AUTH_SOCK wird für den SSH-Agent benötigt und sollte gesetzt sein wenn er läuft.
if [ "$SSH_AUTH_SOCK" = "" ]; then
  # Es wird geprüft ob die Datei ~/.ssh_agent_vars vorhanden ist.
  if [ -f ~/.ssh_agent_vars ]; then
    # Wenn ja wird diese Includiert und geprüft ob die Variablen darin noch gültig sind.
    source ~/.ssh_agent_vars

    # Prüft ob es ein ssh-agent Prozess mit der PID gibt und das Socket existiert.
    if ( ps -p $SSH_AGENT_PID  | grep -q ssh-agent ) &amp;&amp; [ -e $SSH_AUTH_SOCK ]; then
      # SSH-Agent ist gestartet Vorhandene Indentitäten werden angezeigt.
      echo "SSH-Agent ist bereits gestartet Geladene Indentitäten:"
      ssh-add -l
    else
      # Die Variablen sind nicht mehr gültig. Datei wird gelöscht und SSH-Agent wird neu gestartet.
      echo "~/.ssh_agent_vars Datei existiert aber es ist kein Agent gestartet. Starte Agent."
      rm ~/.ssh_agent_vars
      start-ssh-agent &amp;&amp; _ask_load_ssh_indentities
    fi
  else
    # Datei ist nicht vorhanden. Es wird geprüft ob SSH-Agent läuft.
    if ps u -C ssh-agent | grep -q ssh-agent ; then 
      echo "SSH-Agent läuft aber es existiert keine ~/.ssh_agent_vars Datei!"
      echo "SSH-Agent muss gestoppt werden und mit 'start-ssh-agent' neu gestartet"
      # Weiteres Vorgehen dem User überlassen
    else
      # Wenn nicht wird er gestartet.
      start-ssh-agent &amp;&amp; _ask_load_ssh_indentities
    fi
  fi
else
  # Variable ist schon gesetzt. Es wird geprüft ob SSH-Agent auch wirklich läuft
  if ps u -C ssh-agent | grep -q ssh-agent ; then 
    echo "SSH-Agent ist bereits gestartet. Geladen Indentitäten:"
    ssh-add -l
  else
    # Tritt nur bei Subshells auf, wenn die Variable in die Subshell
    # übergeben wurde obwohl der Agent schon beendet wurde.
    echo "SSH_AUTH_SOCK Variable ist gesetzt aber SSH-Agent läuft nicht!"
    # Weiteres Vorgehen dem User überlassen
  fi
fi
&lt;/pre&gt;

&lt;p&gt;Das Script muss am besten in die Datei &lt;code&gt;~/.bashrc&lt;/code&gt; eingefügt werden. Dabei ist wichtig, dass dies nicht in einer Subshell ausgeführt werden darf. Deshalb direkt in die bashrc kopieren oder mittels &lt;code&gt;source&lt;/code&gt; einbinden. Da es sonst Namespace-Probleme mit Variablen und Funktionen gibt darf es nicht über &lt;code&gt;exec&lt;/code&gt; eingebunden werden (deshalb auch kein &lt;code&gt;#!/bin/bash&lt;/code&gt; am Anfang).&lt;/p&gt;

&lt;p&gt;Für Kritik und Verbesserungsvorschläge bin ich immer offen. Getestet habe ich das Script bis jetzt mit Bash 3.2.17 und zsh 4.3.4. Einziger Kritikpunkt den ich schon jetzt von meiner Seite habe: Das Script merkt natürlich nicht wenn der User nicht mehr angemeldet ist. Da der Agent unabhängig von der Session ist läuft er einfach weiter auch wenn der User schon längst über alle Berge ist. Das ist in so weit ein Problem da man theoretisch einen Speicherdump des ssh-agent Prozesses machen kann und dann alle Keys vorfindet. Um dies zu verhindern habe ich die 60 Minuten Sperre eingebaut. So scheißt der Agent nach 60 Minuten alle Keys raus und man muss sie neu laden. Leider ist das etwas unschön. Ich habe allerdings (noch) keine bessere Idee.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3057518062526747746?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=T3zxn1ri"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/qHqYxZA6UCo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/qHqYxZA6UCo/ssh-agent-startscript.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/03/ssh-agent-startscript.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-3507961227547862425</guid><pubDate>Mon, 10 Mar 2008 21:12:00 +0000</pubDate><atom:updated>2008-03-12T15:47:12.051+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gentoo</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>Fortgeschrittene Paketverwaltung mit Gentoo</title><description>&lt;p&gt;Wer kennt das nicht. Man installiert ein Programm und irgend eine Kleinigkeit passt einem nicht. Sei es ein kleiner Bug oder ein fehlendes Feature. Oftmals kann man dies durch ein kurzes Patchen des Source Codes ausbügeln. Bisher unter Debian basierenden Distributionen war dies immer ein reißen Problem. Man musste manuell die Source herunterladen diese Patchen alle Abhängigkeiten herausfinden und installieren, Kompilieren und schließlich auch noch ein DEB-Paket erstellen und in die Paketverwaltung zurückführen. Wer das öfters machen muss wird wahnsinnig.&lt;/p&gt;

&lt;p&gt;Bei der Installation von Gentoo bin ich auf ein richtig Cooles Feature gestoßen. Es gibt die Möglichkeit von Overlays. Das sind im Grunde weitere Repositories, die ebuilds, also die Gentoo-Pakete, enthalten. Richtig komfortabel wird dies da man über das Programm Layman einfach ein solches Repository bei sich einfügen kann, um dann daraus Software zu installieren. Im Prinzip wie bei Debian auch, nur das es viel anpassbarer ist. So besteht z.B. die Möglichkeiten das Repository über rsync, svn, git, bzr, etc. abzurufen und so zu aktualisieren. Im Gegensatz dazu sind auch Lokale Overlays möglich. Dabei legt man einfach ein Verzeichnis an und schmeißt die ebuilds die man installieren möchte einfach rein. Sehr komfortabel da man so kein Unterschied merkt ob diese Pakete nun Lokal in einem Overlay liegen oder aus dem offiziellen Portagetree kommen.&lt;/p&gt;

&lt;p&gt;Hier ein kurzes Beispiel für ein Ebuild das aus einem lokalen Overlay installiert wird. Zuerst einmal das entsprechend Verzeichnis anlegen. Ich habe es unter &lt;code&gt;/usr/portage/local/&lt;/code&gt; gelegt, da dort auch Layman seine Dateien ablegt. Empfohlen wird normal &lt;code&gt;/usr/local/portage/&lt;/code&gt; allerdings sollte das relativ egal sein.&lt;/p&gt;

&lt;p&gt;Ich zeige das ganze mal am Beispiel von &lt;a href="http://eqonomize.sourceforge.net/"&gt;Eqonomize&lt;/a&gt;. Dazu schmeißen wir einfach das &lt;a href="http://bugs.gentoo.org/show_bug.cgi?id=143523"&gt;heruntergeladen&lt;/a&gt; Ebuild in den Unterordner &lt;code&gt;app-office/eqonomize&lt;/code&gt;. Anschließend noch kurz ein &lt;code&gt;ebuild app-office/eqonomize/eqonomize-0.5.ebuild digest&lt;/code&gt;. Dies erstellt ein Manifest was einfach einige Checksummen zur Überprüfung enthält. Jetzt muss nur noch das Lokale Overlay in Portage bekannt gemacht werden. Das geschieht einfach über die Variable &lt;code&gt;PORTDIR_OVERLAY="/usr/portage/local/local-overlay"&lt;/code&gt; die wir in der Datei &lt;code&gt;/etc/make.conf&lt;/code&gt; hinzufügen müssen. Das einzige was noch fehlt ist das synchronisieren des Portage. Ich nutze dazu &lt;code&gt;eix-sync&lt;/code&gt; da mir einfach die Ausgaben besser gefallen. Mit emerge geht's natürlich genauso.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Soweit meine Kurzeinführung in Lokale Overlays. Jetzt aber zu dem eigentlichen Feature. Ich bin es Leid bei ntfs3g jedes mal &lt;code&gt;locale=de_DE.utf8&lt;/code&gt; mitzugeben damit Umlaute richtig dargestellt werden. Deshalb möchte ich es gerne automatisch einfügen wenn ich mount.ntfs aufrufe. Das löse ich einfach über ein Patch im Lokalen Overlay. Ob dieses Beispiel jetzt sinnvoll bzw. der Aufwand gerechtfertigt ist sei mal dahin gestellt.&lt;/p&gt;

&lt;p&gt;Dazu erst einmal ein Verzeichnis erstellen und die Aktuelle ntfs3g Version aus dem Portage kopieren. Der Unterordner &lt;code&gt;files&lt;/code&gt; lege ich schon mal für den Patch später an.&lt;/p&gt;

&lt;pre&gt;
mkdir -p /usr/portage/local/local-overlay/sys-fs/ntfs3g/files/

cp /usr/portage/sys-fs/ntfs3g/ntfs3g-1.1120.ebuild /usr/portage/local/local-overlay/sys-fs/ntfs3g/
cp /usr/portage/sys-fs/ntfs3g/metadata.xml /usr/portage/local/local-overlay/sys-fs/ntfs3g/
&lt;/pre&gt;

&lt;p&gt;Anschließend die Datei &lt;code&gt;/usr/portage/local/local-overlay/sys-fs/ntfs3g/ntfs3g-1.1120.ebuild&lt;/code&gt; Editieren und oben bei &lt;code&gt;inherit multilib toolchain-funcs&lt;/code&gt; noch &lt;code&gt;eutils&lt;/code&gt; hinzufügen. Außerdem weiter Unten noch folgenden Block, der das Auspacken und Patchen erledigt, einfügen:&lt;/p&gt;

&lt;pre&gt;
src_unpack() {
      unpack ${A}
      cd "${S}"
      epatch "${FILESDIR}"/Makefile.am.patch
      epatch "${FILESDIR}"/Makefile.in.patch
}
&lt;/pre&gt;

&lt;p&gt;Das war's so weit jetzt müssen wir noch die beiden gepatchen Makefiles erstellen. Dazu einfach das bestehende ebuild auspacken in &lt;code&gt;/tmp/&lt;/code&gt; verschieben und die beiden benötigten Dateien mit der Endung *.change kopieren&lt;/p&gt;

&lt;pre&gt;
ebuild /usr/portage/local/local-overlay/sys-fs/ntfs3g/ntfs3g-1.1120.ebuild unpack

cp -r /var/tmp/portage/sys-fs/ntfs3g-1.1120/work/ntfs-3g-1.1120 /tmp/

cp /tmp/ntfs-3g-1.1120/src/Makefile.am /tmp/ntfs-3g-1.1120/src/Makefile.am.change
cp /tmp/ntfs-3g-1.1120/src/Makefile.in /tmp/ntfs-3g-1.1120/src/Makefile.in.change
&lt;/pre&gt;

&lt;p&gt;Diese Dateien ändern wir nun. Als erstes Kommentieren wir die Zeile aus die den Link von ntfs-3g auf mount.ntfs-3g anlegt. Dann Fügen wir über echo Zwei Zeilen in die neue &lt;code&gt;/sbin/mount.ntfs-3g&lt;/code&gt; Datei ein die ntfs-3g mit dem gewünschten Parameter aufrufen. Wer sich über die Maskierung wundert einfach mal ausführen und Anschauen. Ich hab ewig gebraucht bis ich das raus gefunden habe. Zu Letzt geben wir der Datei noch Ausführungsrechte und erstellen einen Link auf mount.ntfs. Das ganze muss in beiden Dateien (Makefile.in und Makefile.am) jeweils unter &lt;code&gt;install-data-local:&lt;/code&gt; und &lt;code&gt;install-exec-local:&lt;/code&gt; eingefügt werden. Die beiden Dateien sollen unter &lt;code&gt;uninstall-local:&lt;/code&gt; auch wieder gelöscht werden.&lt;/p&gt;

&lt;pre&gt;
-- vim -O /tmp/ntfs-3g-1.1120/src/Makefile.*.change
(install-data-local:|install-exec-local:)
#$(LN_S) -f $(bindir)/ntfs-3g $(DESTDIR)/sbin/mount.ntfs-3g
echo -e '#!/bin/bash\nntfs-3g "$$@" -o locale=de_DE.utf8' &gt; $(DESTDIR)/sbin/mount.ntfs-3g
chmod +x $(DESTDIR)/sbin/mount.ntfs-3g
$(LN_S) -f $(DESTDIR)/sbin/mount.ntfs-3g $(DESTDIR)/sbin/mount.ntfs

uninstall-local:
$(RM) -f $(DESTDIR)/sbin/mount.ntfs
$(RM) -f $(DESTDIR)/sbin/mount.ntfs-3g
-- :wqa
&lt;/pre&gt;

&lt;p&gt;Nun erstellen wir ein Patch zwischen der geänderten und der original Version. Das &lt;code&gt;bash -c&lt;/code&gt; hilft mehrere Befehle auf einmal auszuführen. Das ist besonders hilfreich wenn man wie ich mit sudo arbeitet. Da man sonst evtl. keine Berechtigungen hat in die Datei zu schreiben. Die geänderten Dateien nun in unser lokales Overlay kopieren und wieder ein Manifest erstellen.&lt;/p&gt;

&lt;pre&gt;
bash -c "cd /tmp/; diff -uN ntfs-3g-1.1120/src/Makefile.in ntfs-3g-1.1120/src/Makefile.in.change &gt;  ntfs-3g-1.1120/src/Makefile.in.patch"
bash -c "cd /tmp/; diff -uN ntfs-3g-1.1120/src/Makefile.am ntfs-3g-1.1120/src/Makefile.am.change &gt;  ntfs-3g-1.1120/src/Makefile.am.patch"

cp -v /tmp/ntfs-3g-1.1120/src/Makefile.*.patch /usr/portage/local/local-overlay/sys-fs/ntfs3g/files/

ebuild ntfs3g-1.1120.ebuild digest
&lt;/pre&gt;


&lt;p&gt;Wer noch nicht die Variable für das lokale Overlay in die Datei &lt;code&gt;/etc/make.conf&lt;/code&gt; eingefügt hat sollte das jetzt tun. Ansonsten wieder mit &lt;code&gt;eix-sync&lt;/code&gt; synchronisieren. Hier sieht man dann das ein Update zwischen dem Originalen Portage und unserem Overlay statt gefunden hat. Installiert man nun wie gewohnt die Datei sieht man auch, dass das Portage gewechselt hat. Wenn man schnell genug ist, und ich die Ausgabe von emerge anschaut, sieht man sogar wie unsere beiden Patchs ausgeführt werden.&lt;/p&gt;

&lt;pre&gt;
-- eix-sync
[ebuild   R   ] sys-fs/ntfs3g-1.1120  USE="-debug -suid" 0 kB [0=&gt;1]
[0] /usr/portage
[1] /usr/portage/local/local-overlay
--

-- emerge -vat ntfs3g
[ebuild   R   ] sys-fs/ntfs3g-1.1120  USE="-debug -suid" 0 kB [1]

Total: 1 package (1 reinstall), Size of downloads: 0 kB
Portage tree and overlays:
 [0] /usr/portage
 [1] /usr/portage/local/local-overlay
--
--
&gt;&gt;&gt; Unpacking ntfs-3g-1.1120.tgz to /var/tmp/portage/sys-fs/ntfs3g-1.1120/work
 * Applying Makefile.am.patch ...                                                                                                                                [ ok ]
 * Applying Makefile.in.patch ...                                                                                                                                [ ok ]
&gt;&gt;&gt; Source unpacked.
--
&lt;/pre&gt;

&lt;p&gt;So nun sollte alles Funktionieren. Man kann nochmal über eix nach unserem Paket suchen. So sieht dann dass die Version unseres Overlays installiert ist. Außerdem sollte man nochmal checken ob die Datei richtig erstellt worden ist und auch die Rechte und der Link so passen.&lt;/p&gt;

&lt;pre&gt;
-- eix ntfs3g
[I] sys-fs/ntfs3g
     Available versions:  1.810 ~1.1030 ~1.1104 1.1120 1.1120[1] ~1.2129 ~1.2216 {debug suid}
     Installed versions:  1.1120(16:14:30 03/08/08)(-debug -suid)
     Homepage:            http://www.ntfs-3g.org
     Description:         Open source read-write NTFS driver that runs under FUSE

[1] /usr/portage/local/local-overlay
--

-- cat /sbin/mount.ntfs-3g
#!/bin/bash
ntfs-3g "$@" -o locale=de_DE.utf8
--

-- ls -l /sbin/mount.ntfs-3g
-rwxr-xr-x 1 root root 46  8. Mär 20:13 /sbin/mount.ntfs-3g
--

-- ls -l /sbin/mount.ntfs
lrwxrwxrwx 1 root root 19  8. Mär 20:13 /sbin/mount.ntfs -&gt; /sbin/mount.ntfs-3g
--
&lt;/pre&gt;

&lt;p&gt;Ich finde diese Möglichkeit absolut praktisch. Beachten sollte man allerdings, dass das lokale Overlay vor dem offiziellen Portage Vorrang hat, aber wenn jetzt z.B. die Version 1.2216 in unserem Portagetree stable wird dann hat diese vor dem lokalen Overlay Vorrang da sie aktueller ist. In diesem Sinne, fröhliches Merging!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-3507961227547862425?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=EPz7at6Y"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/mlucLPJdN74" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/mlucLPJdN74/fortgeschrittene-paketverwaltung-mit.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/03/fortgeschrittene-paketverwaltung-mit.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-1413467462908308236</guid><pubDate>Sun, 09 Mar 2008 13:58:00 +0000</pubDate><atom:updated>2008-03-09T16:15:08.205+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gentoo</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>Eine Woche Gentoo...</title><description>&lt;p&gt;Nun ist es schon eine ganze Woche her seit dem ich kurz entschlossen angefangen habe Gentoo zu installieren. Alles in allem war die Installation bisher einfacher als erwartet. Allerdings dauerte es auch länger als ich dachte. Ich kann noch lange nicht sagen das alles fertig installiert und eingerichtet ist.&lt;/p&gt;

&lt;p&gt;Mein altes Kubuntu 7.04 ist langsam doch in die Jahre gekommen. Außerdem ärgerte ich mich immer wieder über die Paketverwaltung da teilweise unschöne Abhängigkeiten, veraltete Pakete und wenig Anpassungsmöglichkeiten einem das Leben schwer machen. Allgemein bin ich warscheinlich aus der Zielgruppe von *buntu raus gewachsen, da zwar die Oberfläche schön und Sinnvoll eingerichtet ist (was mir jetzt nach dem Umstieg besonders auf fällt), allerdings dahinter absolutes Chaos herrscht. Wer wie ich gerne auf CLI-Basis arbeitet fällt dies sicher besonders auf. Bestes Beispiel ist der Networkmanager der nie tut was er soll. Jetzt habe ich einfach ein paar Konfigurationsdateien geschrieben und Netzwerk läuft ohne Probleme. Ebenso automatisches Einbinden von Wechseldatenträger etc. Ich glaub da kann man noch genug Beispiele finden. Und zu guter Letzt ärgerte es mich das Kubuntu, welches ich als KDE-Fan verwendet habe, von den *buntu Entwicklern eher &lt;a href="http://www.seqfault.de/blog/index.php?/archives/70-Wird-Kubuntu-von-Canonical-vernachlaessigt.html"&gt;vernachlässigt wurde&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So habe ich viel Hoffnung in Gentoo gesteckt und wurde auch im Großen und Ganzen nicht enttäuscht. Hier mal meine ersten Eindrücke von der Installation und einer Woche im Gebrauch. Außerdem vielleicht ein paar Tipps am Rande die dem ein oder anderen Umsteiger das Leben etwas einfacher machen sollte.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Wer auf einen Installer, wie man ihn in den meisten anderen Linux Distributionen kennt, hofft wird enttäuscht. Statt dessen startet man mit einer Live-CD und partitioniert so mit den gewohnten Programmen seine Festplatte und kopiert einige wichtige Programme. Anschließend wechselt man mit chroot auf die so erstellte Minimalumgebung und beginnt Programme wie den Bootmanager grub oder ein DHCP-Client zu installieren. Das erste mal wo ich wirklich geschockt wurde, war die Kernel Konfiguration. Man (darf|muss) jede Kerneleinstellung selbst setzten. Ich war damit erstmal völlig überfordert. Bisher habe ich allerdings bestimmt 30 Mal mein Kernel neu kompiliert und mittlerweile ist das Konfigurieren nichts mehr besonderes. Man sollte sich nur von Anfang an klar machen das man nicht alles gleich richtig einstellen kann. Einfach mal rum Probieren. Ganz wichtig für die komplette Installation ist das &lt;a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml"&gt;Handbuch&lt;/a&gt;. Ich rate jedem danach vor zu gehen.&lt;/p&gt;

&lt;h2&gt;Paketverwaltung&lt;/h2&gt;
&lt;p&gt;Man muss sich hier am meisten umgewöhnen. Binärpakete, wie unter den meisten anderen Distributionen, gibt es unter Gentoo nicht mehr. Statt dessen lädt man sich den Sourcecode herunter und kompiliert diesen selbst. Das hört sich schwerer an als es ist. Es gibt trotzdem eine Paketverwaltung. So das ein einfaches &lt;code&gt;emerge PAKETNAME&lt;/code&gt; ausreicht um ein Paket mit allen Abhängigkeiten zu installieren. Es wird der Sourcecode heruntergeladen und wie man das auch von manuellen Kompilieren kennt &lt;code&gt;configure&lt;/code&gt; und &lt;code&gt;make&lt;/code&gt; aufgerufen. Wer öfters selbst kompiliert wird die Flags bei configure kennen. Man kann hier entscheiden ob einzelne Module kompiliert werden sollen oder eben nicht. Dies ist bei Gentoo sehr cool über so genannte USE-Flags gelöst die man zentral oder für einzelne Pakete angeben kann.&lt;/p&gt;

&lt;p&gt;Man kann sich mit Use-Flags aber auch viel kaputt machen. Hier ein Tipp von mir: Am Anfang wenig USE-Flags nutzen und lieber später erneutes kompilieren mit veränderten Flags in kauf nehmen. Sonst passiert es euch wie mir, dass man eigentlich nur wpasupplicant für WPA Support installieren will aber gleichzeitig noch der Druckserver Cups, ein X-Server und die QT-Libraries als Abhängigkeiten mit kommen. Außerdem bei jedem Kompilieren bei emerge die Parameter für --verbose, --ask und --tree mitgeben um alle USE-Flags und Abhängigkeiten zu prüfen. Bestes Beispiel, bei dem man aufpassen muss, ist Eclipse. Will man dies in der Version 3.3 installieren und man passt mit den USE-Flags nicht auf so hat man danach Java 1.4, Java 1.5 und Java 6 installiert. Richtig freuen kann man sich aber auf der anderen Seite wenn man Psi mit dem USE-Flag "extra" kompiliert da Psi dann einige richtig coole neue Features hat. Oder wenn man Firefox mit "iceweasel" merged. Damit wird das Iceweasel Branding aktiviert. Leider ist nicht immer klar was ein USE-Flag jetzt genau bewirkt.&lt;/p&gt;

&lt;p&gt;Einige sehr coole Features sind &lt;a href="http://ccache.samba.org/"&gt;ccache&lt;/a&gt; und distcc. Distcc ist für verteiltes Kompilieren der Pakete was ich leider nicht ausprobieren konnte da es mir dazu an Computern fehlt. Ccache ist ein schneller Compiler Cache der Zwischenresultate speichert. So ist es möglich ein Programm viel schneller zu kompilieren wenn man es schon einmal übersetzt hat. Ich rate jedem ccache als eines der ersten Dinge auf dem System einzurichten. Mittlerweile schaffe ich es damit mein Kernel mit recht vielen Modulen in ca. sieben Minuten zu kompilieren. Ohne ccache dauert es bei mir fast 25 Minuten.&lt;/p&gt;

&lt;p&gt;Insgesamt muss man beim installieren und vor allem beim deinstallieren sehr aufpassen da eventuelle Abhängigkeiten beim Deinstallieren nicht berücksichtigt werden. Außerdem kann es passieren das Programme nicht mehr laufen wenn man von Abhängigkeiten die USE-Flags ändert. Dafür hat man aber auch wahnsinnige Möglichkeiten (die ich evtl. die nächsten Tage näher beschreiben werde). Das einzige was ich wirklich vermisse ist mein geliebtes aptitude. Mit der Zeit kommt man aber auch ganz gut so zurecht. Nur weiter empfehlen kann ich eix auf das mich Klaus gebracht hat. Damit kann man sehr komfortabel sein Portage durchsuchen. Ansonsten helfen die &lt;a href="http://gentoo-portage.com/"&gt;drei&lt;/a&gt; &lt;a href="http://gentoo.zapto.org/"&gt;Portage&lt;/a&gt; &lt;a href="http://packages.gentoo.org/"&gt;Seiten&lt;/a&gt; sehr weiter.&lt;/p&gt;

&lt;p&gt;Man gewöhnt sich ans kompilieren allerdings freut man sich doch wenn zwischendurch mal ein Binärpaket wie z.B. den Grafikkartentreiber oder Flash erwischt da dann die Kompilierzeit auf 0 gedrückt wird.&lt;/p&gt;

&lt;h2&gt;GUI&lt;/h2&gt;
&lt;p&gt;Hier blickt man gerne auf *buntu zurück. Gentoo installiert zwar die Pakete, allerdings konfigurieren muss man das selbst. So ist es nicht so einfach unter KDE die Schriftgröße von Firefox anzupassen. Auch muss man zum Teil erst manuell definieren welche Dateien mit welchem Programm geöffnet werden sollen. Besonders beim Firefox ist das nervig. Aber da ich sowieso mit dem Gedanken spiele mich von dem kompletten KDE-Environment etwas weg zu bewegen und lieber mit anpassbaren und schnelleren Window-Managern zu arbeiten, komme ich so oder so nicht um die Konfiguration rum.&lt;/p&gt;

&lt;p&gt;Was mir hier überhaupt nicht gefällt sind die "Metapakete". Metapakete sind Pakete die andere Pakete enthalten. So installiert man zum Beispiel nur kdepim und das gesamte KDE-PIM-Environment wird installiert. Leider aber nicht die einzelnen Komponenten als Abhängigkeit. So ist z.B. KMail in KDE-PIM enthalten und noch einmal als extra Paket. Will ich jetzt KMail deinstallieren geht das nicht weil das Paket KMail ist nicht installiert. Sondern nur kdepim was halt zufällig KMail enthält. Das ganze ist etwas unschön aufgebaut und ich bin noch nicht hinter den Grund gekommen. Ich hatte unter *buntu schon wenig für Metapakete übrig aber so ist das noch schlimmer.&lt;/p&gt;

&lt;p&gt;Leider verfolgt mich auch das leidige nvidia-Treiber Thema welches ich im Zusammenhang mit Framebuffer und nvidia Treiber habe. Ich kann unter Konsole normal arbeiten aber sobald ich X mit nvidia Treiber starte komme ich nicht mehr zurück auf Konsole. Abhilfe schafft nur der langsamere xf86-video-nv Treiber der auch keine 3D Unterstützung anbietet. Allerdings habe ich jetzt schon andere Leute gefunden die das selbe Problem haben. Liegt also nicht an mir ;-)&lt;/p&gt;

&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Der Umstieg hat sich auf jeden Fall gelohnt. Auch wenn ich noch ein bisschen Arbeit vor mir habe. Die Paketverwaltung ist echt cool und auch sonst glänzt es mit Anpassungsmöglichkeiten. Ich sag nur drei System-Logger und drei Cron-Daemons die allein im Handbuch beschrieben werden. Auf der anderen Seite muss ich mich über Details wie so manche Abhängigkeit oder eben der Metapackete wundern. Auch das Bash die Standard Shell ist hat mich als zsh Fan sehr überrascht. Ich bin allerdings froh das ich umgestiegen bin auch wenn ich noch einiges an Zeit reinstecken muss. Die sehr gute Community und die vielen Wikis und Foren helfen mir dabei sehr. In Sachen Dokumentation ist Gentoo auf jeden Fall vorne mit dabei!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-1413467462908308236?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=aaVdN75Y"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/aHONTO7tcCM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/aHONTO7tcCM/eine-woche-gentoo.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/03/eine-woche-gentoo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8174057653907946583.post-5126000478806752527</guid><pubDate>Wed, 13 Feb 2008 14:41:00 +0000</pubDate><atom:updated>2008-03-09T16:15:16.184+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programmierung</category><title>Mono Funktional</title><description>&lt;p&gt;Obwohl ich absolut kein Plan von C# und .Net habe und auch sonst Microsoft ... hasse, konnte ich doch der &lt;a href="http://entwickler.com/itr/news/psecom,id,40274,nodeid,82.html"&gt;Werbung&lt;/a&gt; zu dem &lt;a href="http://www.technetbloggers.de/?cat=50"&gt;F#-Tutorial&lt;/a&gt; von &lt;a href="http://www.technetbloggers.de/"&gt;Andreas&lt;/a&gt; nicht widerstehen. Da es für mich auf keinen Fall in Frage kommt Windows zu installieren habe ich die freie, .Net kompatible Laufzeitumgebung &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt; installiert. Da dies nicht so einfach ging hier ein kurzes HowTo. &lt;b&gt;Anmerkung:&lt;/b&gt; Ich weiß nicht ob alle diese Schritte genau so notwendig sind, da ich wie schon erwähnt mich auf dem Gebiet nicht auskenne, aber so läuft alles.&lt;/p&gt;

&lt;p&gt;Zuerst einmal die Laufzeitumgebung inklusive Libraries und C#-Compiler installieren. Da ich (noch) Kubuntu nutze hier erläutere ich hier mal nur den Ubuntu-Weg. In allen anderen Distributionen sollte es allerdings ähnlich ablaufen. &lt;b&gt;Anmerkung:&lt;/b&gt; Installiert braucht Mono gut 100MB, also mal kurz installieren und testen lohnt fast nicht.&lt;/p&gt;

&lt;code&gt;sudo apt-get install mono-devel&lt;/code&gt;

&lt;p&gt;Da dies soweit ich das beurteilen kann allerdings nur den C# 1.0 Compiler installiert installieren wir noch den 2.0 Compiler inklusive Libraries nach. Außerdem werden noch für C# zwei zusätzliche Libraries benötigt:&lt;/p&gt;

&lt;code&gt;sudo apt-get install mono-gmcs libmono-winforms1.0-cil libmono-system-runtime2.0-cil&lt;/code&gt;

&lt;p&gt;Jetzt sollte Mono so weit laufen. Testen kann man dies indem man ein Beispiel von der &lt;a href="http://www.studentprogram-south.de/cms/home/layout/122.aspx"&gt;Student Homepage&lt;/a&gt; herunter lädt (Wenn das mal kein Werbebonus gibt) und mit &lt;code&gt;gmcs Program.cs&lt;/code&gt; kompiliert. Ausführen lässt sich das Ergebnis einfach mittels &lt;code&gt;mono Program.exe&lt;/code&gt;. Das einzige was noch zu klären bleibt: Warum zum Henker machen Windowsanhänger bei Konsolenprogrammen immer ein &lt;code&gt;Console.ReadLine();&lt;/code&gt; am Ende? ;-)&lt;/p&gt;

&lt;p&gt;Soweit zu Mono. Jetzt kommt der F# Teil. Erst einmal F# &lt;a href="http://research.microsoft.com/fsharp/release.aspx"&gt;downloaden&lt;/a&gt;. Am besten wählt man hier Download F# 1.9.3.14 als Zip aus. Das Paket entpacken und als Administrator installieren. (Gefällt mir ja überhaupt nicht ein Microsoft Produkt als Administrator auf meinem Rechner auszuführen.) Hierzu einfach das mitgelieferte Bashscript ausführen:&lt;/p&gt;

&lt;code&gt;sudo bash install-mono.sh&lt;/code&gt;

&lt;p&gt;Dieses Script installiert F# und kompiliert das ganze in das &lt;code&gt;bin&lt;/code&gt;-Verzeichnis. Hat alles so weit geklappt ist man nun (mehr oder weniger) stolzer Besitzer von F# und kann sich gleich an der &lt;a href="http://www.technetbloggers.de/?p=86"&gt;ersten Aufgabe&lt;/a&gt; von Andreas versuchen.&lt;/p&gt;

&lt;p&gt;Als Beispiel gleich mal meine Lösung:&lt;/p&gt;

&lt;pre&gt;
#light
open System
let rec (!) (a : int) =
  if (a = 1) then
    a
  else
    let a2 = a - 1
    a * !a2

printfn "Zahl eingeben:"
let a = read_line ()
let endresult = !Convert.ToInt32(a)
printfn "Die fakultaet von %s ist %i" a endresult
&lt;/pre&gt;

&lt;p&gt;Das wird nun mit folgendem Befehl erst kompiliert und anschließend ausgeführt:&lt;/p&gt;

&lt;pre&gt;downloads/FSharp-1.9.3.14/bin/fsc.exe fakultaet.fs
mono fakultaet.exe&lt;/pre&gt;

&lt;p&gt;Wenn man dem Binary Ausführungsrechte gibt kann man es auch einfach mittels &lt;code&gt;./fakultaet.exe&lt;/code&gt; ausführen.
Das einzige was jetzt noch schön wäre, ist ein vim Syntax-Style für F#... &lt;/p&gt;

&lt;p&gt;Bleibt abzuwarten wann Tutorial Teil 3 folgt. Ich bin gespannt!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8174057653907946583-5126000478806752527?l=nougad.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schokopapier?a=neHBFKOm"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schokopapier?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schokopapier/~4/VpcLu0Zja9U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Schokopapier/~3/VpcLu0Zja9U/mono-funktional.html</link><author>noreply@blogger.com (nougad)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://nougad.blogspot.com/2008/02/mono-funktional.html</feedburner:origLink></item></channel></rss>
