<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Dinge, Zeugs und Sachen - Computer</title>
    <link>http://blog.slash-me.net/</link>
    <description>(Un)interessante Kleinigkeiten</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.6.2 - http://www.s9y.org/</generator>
    <pubDate>Tue, 23 Apr 2013 13:44:46 GMT</pubDate>

    <image>
        <url>http://blog.slash-me.net/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Dinge, Zeugs und Sachen - Computer - (Un)interessante Kleinigkeiten</title>
        <link>http://blog.slash-me.net/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Browser in Thunderbird umstellen</title>
    <link>http://blog.slash-me.net/archives/384-Browser-in-Thunderbird-umstellen.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/384-Browser-in-Thunderbird-umstellen.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=384</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=384</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Hm, das hat mal wieder länger gedauert mit dem Suchen. Ich möchte gern aus Sicherheitsgründen meinen Browser unter einem extra Nutzer ausführen. Das ist soweit kein Problem. Einfach mein Profil in den neuen Nutzer kopiert, mittels &lt;font face=&quot;courier new,courier,monospace&quot;&gt;kdesudo -u webuser firefox&lt;/font&gt; den Browser aufgerufen, alles gut. Ok, ich müsste theoretisch mein Passwort jedesmal eingeben, aber das kann man ja durch eine geeignete Einstellung in &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/etc/sudoers&lt;/font&gt; verhindern. Falls das mal jemand braucht: &lt;br /&gt;&lt;/p&gt; 
&lt;pre&gt;user        ALL=(webuser) NOPASSWD: /usr/bin/firefox&lt;/pre&gt; 
&lt;p&gt;Diese Zeile in &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/etc/sudoers&lt;/font&gt; erlaubt dem Nutzer &lt;font face=&quot;courier new,courier,monospace&quot;&gt;user&lt;/font&gt; den Befehl &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/usr/bin/firefox&lt;/font&gt; ohne Passwortrückfrage als &lt;font face=&quot;courier new,courier,monospace&quot;&gt;webuser&lt;/font&gt; auszuführen. Diese Einstellungen gelten auch für kdesudo (ich verwende KDE), statt des normalen sudo nimmt dieses aber auch die X-Credentials mit, so dass ein grafisches Programm wie Firefox angezeigt werden kann. Wenn man jetzt noch in der KDE als Standardkomponente für den Webbrowser den kdesudo-bewehrten Befehl oben einstellt, dann öffnen alle KDE-Programme ihre HTTP- und HTTPS-Links mit Firefox unter dem webuser.&lt;/p&gt; 
&lt;p&gt;Doof nur, dass ich Thunderbird verwende (ich mag Akonadi nicht, seitdem ich da mal längere Zeit Probleme mit verschwindenden Terminen etc. hatte). Als GTK-Programm hält der sich dummerweise nicht an die Einstellungen von KDE (ist Vielfalt nicht manchmal toll?). Ich habe eine ganze Menge Tipps im Netz gefunden, die samt und sonders alle nicht mit meinem Thunderbird 17 wollten. Ergo: selbst etwas rumprobiert (ich wusste, dass ich das schonmal eingestellt hatte…) und folgendes gefunden: man gehe über &lt;em&gt;Bearbeiten&lt;/em&gt; -&amp;gt; &lt;em&gt;Einstellungen&lt;/em&gt; -&amp;gt; &lt;em&gt;Anhänge&lt;/em&gt; und suche dort die Dateitypen &lt;font face=&quot;courier new,courier,monospace&quot;&gt;http&lt;/font&gt; und &lt;font face=&quot;courier new,courier,monospace&quot;&gt;https&lt;/font&gt; raus. Dort steht normalerweise firefox (oder sonstwas vergleichbares) drin. Man kann da zwar ein anderes Programm angeben, aber leider keine Standardparameter einstellen, was die kdesudo-Lösung direkt verhindert. Deswegen schreibt man sich ein kleines Bash-Skript mit folgendem Inhalt:&lt;/p&gt; 
&lt;pre&gt;#! /bin/bash
kdesudo -u webuser firefox $1&lt;/pre&gt;Das legt man irgendwo erreichbar hin, macht es ausführbar und stellt es im Thunderbird als Anwendung für die http und https Dateitypen ein. Siehe da: es funktioniert, auch der Thunderbird öffnet die Links in einem Browser unter einem anderen Nutzer.&lt;br /&gt;&lt;br /&gt; 
    </content:encoded>

    <pubDate>Tue, 23 Apr 2013 15:31:22 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/384-guid.html</guid>
    
</item>
<item>
    <title>Duplicity und &quot;system clock issues?&quot;</title>
    <link>http://blog.slash-me.net/archives/379-Duplicity-und-system-clock-issues.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/379-Duplicity-und-system-clock-issues.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=379</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=379</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    Weil ich&#039;s garantiert mal wieder selbst brauche und dann sinnlos danach suchen würde: wenn &lt;a href=&quot;http://duplicity.nongnu.org&quot;&gt;duplicity&lt;/a&gt; mit &lt;font face=&quot;courier new,courier,monospace&quot;&gt;&amp;quot;AssertionError: time not moving forward at appropriate pace - system clock issues?&amp;quot;&lt;/font&gt; fehlschlägt, dann kann es sein, dass im lokalen Signatur-Cache noch fehlerhafte Dateien von einem fehlgeschlagenen vorangegangenen Backupversuch liegen. Einfach in &lt;font face=&quot;courier new,courier,monospace&quot;&gt;~/.cache/duplicity/&amp;lt;Backup-ID&amp;gt;&lt;/font&gt; alle &lt;font face=&quot;courier new,courier,monospace&quot;&gt;.part&lt;/font&gt;-Dateien löschen. Beim nächsten Lauf beschwert sich duplicity möglicherweise, dass Reste eines fehlgeschlagenen Backups rumliegen, sollte dann aber ganz normal weitermachen. Die Fehlermeldung ist… nicht unbedingt naheliegend. Dummerweise wollen die Bugs nur mit Anmeldung haben, worauf ich grad keinen Bock habe.&lt;br /&gt; 
    </content:encoded>

    <pubDate>Sat, 29 Dec 2012 16:17:12 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/379-guid.html</guid>
    
</item>
<item>
    <title>Richtige Verwendung von select()</title>
    <link>http://blog.slash-me.net/archives/376-Richtige-Verwendung-von-select.html</link>
            <category>Linux</category>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/376-Richtige-Verwendung-von-select.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=376</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=376</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Merke: manchmal hilft Doku lesen erheblich. Ich habe gerade einen halben Tag danach gesucht, wieso eine pipe() zwischen zwei Threads eines Programms nicht funktioniert. Ich habe eine pipe, an deren lesendem Ende ein Thread mittels select() auf Befehle wartet. Dummerweise wollte bei folgendem Code select nicht zurückkehren:&lt;/p&gt; 
&lt;pre&gt;select(1, &amp;amp;fdset, 0, 0, 0)&lt;/pre&gt; 
&lt;p&gt;Irgendwie wollte das partout nicht zurückkehren, obwohl ich das Schreib-Ende des File-Descriptors beschrieben habe… Hm… Nach einigem Suchen habe ich die Doku nochmal genauer gelesen:&lt;/p&gt; 
&lt;blockquote&gt;nfds is the highest-numbered file descriptor in any of the three sets, plus 1.&lt;/blockquote&gt; 
&lt;p&gt;Tja, richtig lesen. nfds (der erste Parameter von select) ist &lt;strong&gt;nicht&lt;/strong&gt; die Anzahl der Descriptoren im fd_set, sondern die Nummer des höchsten Descriptors plus eins. Dummerweise ist das Beispiel in der Doku mit fd=0 gemacht, so dass der höchste plus 1 gleich 1 ist (und damit gleich der Anzahl), was mich natürlich auf die völlig falsche Fährte gelockt hat. Naja, ein halber Tag versemmelt, aber wenigstens was bei gelernt. Fast wie Goethe…&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 29 Nov 2011 15:17:33 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/376-guid.html</guid>
    
</item>
<item>
    <title>Neuer Release des Logging-Templates</title>
    <link>http://blog.slash-me.net/archives/372-Neuer-Release-des-Logging-Templates.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/372-Neuer-Release-des-Logging-Templates.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=372</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=372</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Irgendwann vor langer, langer Zeit (laut Versionshistory mittlerweile 5 Jahre her) hatte ich mal als Fingerübung ein Logging-Template in C++ geschrieben, was sich anfühlen sollte wie std::cout. Ziel war den geneigten Programmierer vom Denken zu entlasten und ihm quasi std::cout-Debugging mit etwas mehr Möglichkeiten zu erlauben. Hat offenbar damals schon gut gepasst, kurz darauf kam nämlich die Fähigkeit zur Anpassung an verschiedene Multithread-Umgebungen via Policy-Klasse dazu. Dann lag das ganze erstmal 5 Jahre im Dornröschenschlaf, in denen ich es zwar hin und wieder genutzt habe, aber eigentlich keine neuen Fähigkeiten brauchte. Bis vor kurzem...&lt;/p&gt;
&lt;p&gt;Daher jetzt: tada! ein komplett neues Release, in dem sich so einiges geändert hat. Das Frontend an sich bleibt gleich (sprich: existierender Code sollte problemlos weiter kompilieren, es sei denn er macht was total dämliches und verwendet zweimal einen Log-Level in einer Nachricht). Im Hintergrund hat sich allerdings einiges getan. Erstmal wurde der Code etwas aufgeräumt, da sich dort von verschiedenen Experimenten Reste angesammelt hatten. Dann wurde das Handling der Loglevel komplett umgebaut um eine flexiblere Ausgabe nach unten zu ermöglichen. Hintergrund: ich brauche für ein Projekt gerade die Möglichkeit Daten ins Syslog auszugeben. Dazu muss der zugrundeliegende Ausgabestream aber das Log-Level wissen. Außerdem muss er zuverlässig wissen, wann eine Nachricht beendet ist. Beides stellt das Frontend jetzt sicher. Weil&#039;s so schön war habe ich gleich noch den passenden SyslogStream beigelegt, der das Loggingfrontend an &lt;em&gt;syslog()&lt;/em&gt; anklemmt. Benutzung ist wie üblich relativ einfach:&lt;/p&gt;
&lt;pre&gt;
#include &amp;lt;syslogstream.hxx&amp;gt;

use namespace Logging;

int main(int argc, char *argv[]) {
    SyslogStream slog(&quot;TestLogger&quot;);
    Syslogger logger(slog, LEVEL_INFO);

    logger &amp;lt;&amp;lt; LEVEL_INFO &amp;lt;&amp;lt; &quot;This an INFO message which has a number attached: &quot; &amp;lt;&amp;lt; 12345 &amp;lt;&amp;lt; std::endl;
    logger &amp;lt;&amp;lt; LEVEL_WARNING &amp;lt;&amp;lt; &quot;This is a warning message.&quot; &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/pre&gt;
&lt;p&gt;Dieser Code schreibt zwei Nachrichten unter dem Präfix &lt;em&gt;TestLogger&lt;/em&gt; ins Syslog. Die Doku der Klassen gibt noch einige Informationen her, welche Eigenschaften man zusätzlich konfigurieren kann. Das Logging-Frontend kann dank std::ostream-Kompatibilität natürlich jedes Element ausgeben, welches auf einem ostream ausgegeben werden könnte.&lt;/p&gt;
&lt;p&gt;Der Code ist weiterhin header-only, braucht also keine Installation irgendwelcher Bibliotheken, sondern kann dan public-domain-Lizenz einfach ins eigene Projekt mit übernommen werden. Wer nett sein will: mich interessiert immer, wo der Code verwendet wird. Kurze Mail an mich wäre nett (hm... sollte ich vielleicht mal in die Lizenz schreiben...)&lt;/p&gt; 
&lt;p&gt;Der Code ist mittlerweile umgezogen und liegt bei Bitbucket: &lt;a href=&quot;https://bitbucket.org/namenlos/logging/&quot;&gt;https://bitbucket.org/namenlos/logging/&lt;/a&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 22 Apr 2011 09:41:00 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/372-guid.html</guid>
    
</item>
<item>
    <title>screen für X-Programme</title>
    <link>http://blog.slash-me.net/archives/367-screen-fuer-X-Programme.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/367-screen-fuer-X-Programme.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=367</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=367</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Kennt wahrscheinlich eh schon wieder jeder außer mir, aber wer schonmal das Problem hatte, dass er gern ein X-Programm laufen lassen will und dann vielleicht noch auf einem anderen Rechner wieder drauf zugreifen, der sollte sich mal &lt;a href=&quot;http://code.google.com/p/partiwm/wiki/xpra&quot;&gt;xpra&lt;/a&gt; anschauen. Wie screen das für die Konsole macht kann man mit xpra grafische Programme laufen lassen und später wieder an einen laufenden X-Server anklemmen. Geht (natürlich) auch von einem anderen Rechner aus via ssh. Macht sich sogar ganz bequem mit &lt;tt&gt;xpra attach ssh:user@host:display&lt;/tt&gt;. Wieder was gelernt...&lt;/p&gt;  
    </content:encoded>

    <pubDate>Sun, 30 Jan 2011 18:11:54 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/367-guid.html</guid>
    
</item>
<item>
    <title>Wenn NVidia einen Monitorwechsel nicht erkennen will…</title>
    <link>http://blog.slash-me.net/archives/360-Wenn-NVidia-einen-Monitorwechsel-nicht-erkennen-will.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/360-Wenn-NVidia-einen-Monitorwechsel-nicht-erkennen-will.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=360</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=360</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Manchmal regt mich meine NVidia-Karte im Notebook echt auf. Nicht nur, dass ich nur mit dem Binary-Treiber unter Linux Features wie 3D-Beschleunigung oder Suspend-to-RAM nutzen kann, nein, leider ist der auch noch nicht kompatibel mit der Standardarchitektur zum Setzen von Bildschirmauflösungen etc. Dafür braucht man ein spezielles Tool von NVidia, welches nur im Klicki-Bunti-Modus bedienbar ist. Nix mit Skripten und so (zumindest zum großen Teil). Macht alles nix, kann ich mich gerade noch dran gewöhnen. Was aber wirklich nervig ist, ist die Weigerung des Tools einen Wechsel des externen Monitors zu erkennen. Wenn man nach dem Booten einmal einen Monitor erkannt hat, dann lässt es sich durch nichts und niemanden davon überzeugen einen Wechsel desselben zur Kenntnis zu nehmen. Das ist normalerweise kein Problem: ich arbeite mit einem 1680x1050-Monitor, welche üblicherweise als erster erkannt wird und wenn ich dann mal zu einem Beamer wechsele, dann muss die Auflösung eben von Hand runtergestellt werden (sowieso sinnvoll, da viele Beamer interessanterweise eine höhere Auflösung melden, als sie nativ darstellen). Wenn ich jetzt allerdings mal ausnahmsweise einen Beamer nach dem Booten ranhänge und dann später zum großen Monitor wechseln will, dann hängt man mit der niedrigeren Auflösung fest. Nach einiger Rumprobiererei hab ich jetzt eine Methode, die das ohne X-Server-Neustart zu beheben scheint:&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;tt&gt;nvidia-settings&lt;/tt&gt; starten &lt;em&gt;ohne&lt;/em&gt; externen Monitor dran. Das Programm wird unter &quot;X Server Display Configuration&quot; das bereits früher erkannte Gerät (bspw. den Beamer) zeigen. Dort auf &quot;Detect Displays&quot; klicken. Das Programm wird sich beschweren, dass der externe Monitor entfernt wurde und fragen ob der auch aus der Liste der verfügbaren Displays entfernt werden soll. Soll er. Auf &quot;Apply&quot; klicken, bestätigen und das Programm beenden.&lt;/li&gt;
 &lt;li&gt;Monitor anstecken und &lt;tt&gt;nvidia-settings&lt;/tt&gt; wieder starten. Wenn man jetzt unter &quot;X Server Display Configuration&quot; (wo definitiv nur &lt;em&gt;ein&lt;/em&gt; Display zu sehen sein sollte, nämlich das interne!) auf &quot;Detect Displays&quot; klickt, dann sollte der richtige externe Monitor sichtbar werden (und damit auch die passenden Auflösungen zur Auswahl vorliegen).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Warum das so kompliziert ist fehlt mir im Moment jegliche Idee. Evtl. sitzt hier das Problem auch einfach mal wieder vor dem Monitor.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 03 Jun 2010 09:02:20 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/360-guid.html</guid>
    
</item>
<item>
    <title>Neues yeanpypa-Release</title>
    <link>http://blog.slash-me.net/archives/359-Neues-yeanpypa-Release.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/359-Neues-yeanpypa-Release.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=359</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=359</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Nach über drei Jahren hab ich&#039;s dank der Anregung eines Kollegen doch mal geschafft, meinen kleinen Parser-Generator in Python aufzuarbeiten und eine neue Version zu veröffentlichen. Diese bringt endlich rekursive Regeln und die Möglichkeit Regeln zu gruppieren. Außerdem sollte sie jetzt auch Python 3 kompatibel sein. Geblieben ist natürlich die einfache Definition von Parsern in Form einer (leicht abgewandelten) EBNF direkt in Python.&lt;/p&gt;
&lt;p&gt;Weil Gelaber über Software ohne Beispiel immer doof ist hier ein Beispiel für das Parsen einer einfachen XML-ähnlichen Sprache:&lt;/p&gt;
&lt;pre style=&quot;border: 1px solid black&quot;&gt;
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from yeanpypa import *

test = &#039;&amp;lt;tag&amp;gt;&amp;lt;inner attr=&quot;Just a test&quot;&amp;gt;plah&amp;lt;/inner&amp;gt;&amp;lt;/tag&amp;gt;&#039;

text = Word(alpha)
name = Combine(alpha + ZeroOrMore(alpha | digit))
value = Literal(&quot;\&quot;&quot;).hide() + Word(alpha | AnyOf(&quot; \t.,!?+-&quot;) | digit) + Literal(&quot;\&quot;&quot;).hide()
attribute = name + Literal(&#039;=&#039;).hide() + value
opening_tag = Group(Literal(&#039;&lt;&#039;).hide() + Word(alpha) + ZeroOrMore(attribute) + Literal(&#039;&gt;&#039;).hide())
closing_tag = Group(Literal(&#039;&lt;/&#039;).hide() + Word(alpha) + Literal(&#039;&gt;&#039;).hide())
tag = Recursive()
tag.set(text | opening_tag + tag + closing_tag)

result = parse(tag, test)
print result.getTokens()
&lt;/pre&gt;
&lt;p&gt;Die Ausgabe ist hierarchische Liste von Token sein (wobei alle, die mit .hide() markiert werden nicht enthalten sind):&lt;/p&gt;
&lt;pre&gt;[[&#039;tag&#039;], [[&#039;inner&#039;, [[&#039;attr&#039;, [&#039;Just a test&#039;]]]], &#039;plah&#039;, [&#039;inner&#039;]], [&#039;tag&#039;]]&lt;/pre&gt;
&lt;p&gt;Mittels semantischer Aktionen die an Teile der Regeln gehängt werden kann man komplexere Datenstrukturen on the fly aufbauen statt erst auf der endgültigen Tokenliste zu arbeiten. Bspw. könnte die Regel &lt;tt&gt;tag&lt;/tt&gt; mittels einer semantischen Aktion ein Objekt einer Klasse &lt;tt&gt;Tag&lt;/tt&gt; anlegen, welches strukturierten Zugriff auf die Bestandteile des Tags gibt. Semantische Aktionen sind Funktionen, die die Tokenliste, welche durch die Regel gematcht wurde als Parameter erhalten und darauf beliebige Aktionen ausführen können. Yeanpypa ist so konstruiert, dass der Rückgabewert einer semantischen Aktion anstelle der Token in das Ergebnis übernommen wird. So kann man hier also statt einer Liste von Token mittels einer semantischen Aktion gleich eine Liste von &lt;tt&gt;Tag&lt;/tt&gt;-Objekten erhalten.&lt;/p&gt; 
&lt;p&gt;Die Software findet sich mit dem neuen Release auf &lt;a href=&quot;http://bitbucket.org/namenlos/yeanpypa&quot;&gt;bitbucket.org&lt;/a&gt;. Doku und Beispiele (auf Englisch) finden sich auf &lt;a href=&quot;http://www.slash-me.net/dev-snippets.html&quot;&gt;meiner snippets-Webseite&lt;/a&gt;. Wenn ich Zeit finde werde ich noch ein paar mehr Beispiele implementieren um die Fähigkeiten von yeanpypa umfassender zu demonstrieren.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 01 May 2010 13:43:16 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/359-guid.html</guid>
    
</item>
<item>
    <title>Jabber-Probleme hinter DSL-Router</title>
    <link>http://blog.slash-me.net/archives/355-Jabber-Probleme-hinter-DSL-Router.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/355-Jabber-Probleme-hinter-DSL-Router.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=355</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=355</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Interessante Erfahrung gerade: seit einem Neustart meines Jabber-Servers funktioniert der Kontakt dorthin nicht mehr aus meinem privaten Netz. Ein wenig Sucherei später stellt sich heraus, dass mein DSL-Router (bzw. der darauf laufende DNSMasq) DNS-Queries vom Typ SRV sperrt. Dazu muss man wissen, dass Jabberclients aus dem Domainpart der Jabber-ID mittels eines DNS-Queries ermitteln, auf welchem Server man sich einloggen muss. Sie fragen einfach nach &lt;tt&gt;_xmpp-client._tcp.domain.part&lt;/tt&gt; mit RR-Type SRV und verbinden sich zu dem in der Antwort stehendem Server. Klappt das nicht lösen sie den Domainpart normal auf und verbinden sich dort hin. Nun hatte ich bisher nach einigen Umbauarbeiten immer noch eine Umleitung laufen, die ich aber im Zuge eines Systemupdates mal entfernt habe. Damit klappt das nicht mehr, dass man sich einfach auf die IP aus dem A-Record des Domainparts verbinden kann und den Jabberserver erreicht. In der Welt draußen kein Problem, gibt es doch einen passenden SRV-Record, der verrät, wie&#039;s geht. Dummerweise war mein DNSMasq hier mit der Option &lt;tt&gt;filterwin2k&lt;/tt&gt; konfiguriert, was ihn dazu veranlasst (unter anderem) SRV-Records wegzufiltern. Nimmt man die raus funktioniert alles. Wieder was gelernt...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 11 Dec 2009 22:32:11 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/355-guid.html</guid>
    
</item>
<item>
    <title>Drei Stunden war der Laptop krank... (und außerdem russische Propaganda)</title>
    <link>http://blog.slash-me.net/archives/353-Drei-Stunden-war-der-Laptop-krank...-und-ausserdem-russische-Propaganda.html</link>
            <category>Computer</category>
            <category>Uni</category>
    
    <comments>http://blog.slash-me.net/archives/353-Drei-Stunden-war-der-Laptop-krank...-und-ausserdem-russische-Propaganda.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=353</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=353</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;... jetzt läuft er wieder, Gott sei Dank! Frei nach Wilhelm Busch mach ich grad drei Kreuze. Glücklicherweise habe ich mir mal irgendwann ein Thinkpad gegönnt. Ebenso glücklicherweise war bei IBM jemand mal der Meinung, dass man in eine Tastatur Ablaufkanäle einbauen müsse, falls mal Flüssigkeiten in die Tastatur kommen. Tja... ich bin heute offenbar nicht sooo geschickt und hab es geschafft, ein Glas Cola über meiner Tastatur zu entleeren. Während der größte Teil durch die dafür vorgesehenen Kanäle abgelaufen ist, musste ein relativ kleiner Teil gewaltsam aus dem größtenteils zerlegten Gerät entfernt werden. Nach einer gründlichen Dusche für die Tastatur (die funktioniert plötzlich wieder einwandfrei ohne zu knirschen und so...) scheint soweit wieder alles in Ordnung. Hoffen wir mal das beste...&lt;/p&gt;&lt;p&gt;And now for something completely different: &lt;a href=&quot;http://de.wikipedia.org/wiki/Panzerkreuzer_Potemkin&quot;&gt;Panzerkreuzer Potemkin&lt;/a&gt;, ein Meisterwerk russische Propaganda. Gab&#039;s heute im &lt;a href=&quot;http://www.hochschulfilmclub.de/&quot;&gt;Hochschulkino&lt;/a&gt;. Und weil das ganze ja ein Stummfilm ist und man heute audio-visuelle Berieselung gewohnt ist, haben sich die Jungs und Mädels vom HFC mit dem &lt;a href=&quot;http://www.tu-ilmenau.de/orchester&quot;&gt;Kammerorchester der TU Ilmenau&lt;/a&gt; und der Jazzband nuzz zusammengetan und das ganze mit klassischer Musik unterlegt. Sehr interessante Erfahrung. Ich bin ja sonst nicht so für die Klassik, aber so ein komplettes Orchester hat schon was...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 18 Nov 2009 23:46:48 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/353-guid.html</guid>
    
</item>
<item>
    <title>(K)Ubuntu in eine schon existierende LVM-Struktur installieren</title>
    <link>http://blog.slash-me.net/archives/348-KUbuntu-in-eine-schon-existierende-LVM-Struktur-installieren.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/348-KUbuntu-in-eine-schon-existierende-LVM-Struktur-installieren.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=348</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=348</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Ich wollte aus verschiedenen Gründen meiner Linux-Installation mal einen kompletten Neustart gönnen und &lt;a href=&quot;http://www.kubuntu.org/&quot;&gt;Kubuntu Karmic Koala&lt;/a&gt; frisch aufsetzen. Dabei wollte ich allerdings vorzugsweise darauf verzichten mein aktuell 83&amp;#160;GB schweres Home-Directory komplett aus dem Backup wieder einspielen zu müssen. Gedacht, ... fast getan. Backup wurde natürlich vorher gemacht (ich bin ja nicht wahnsinnig. Jedenfalls nicht wesentlich mehr, als üblich. Außerdem hatte jemand in der näheren Umgebung letztens erst den Fall, dass sämtliche Daten zwar noch da, aber dank Festplattenverschlüsselung mit kaputtem Keystore nicht mehr zugreifbar waren. Das wollte ich mir natürlich ersparen.&lt;/p&gt;
&lt;p&gt;Erstmal dazu, wie meine Platte grob aussieht:&lt;/p&gt;
&lt;pre&gt;
/dev/sda
  |
  +---sda1 (/boot)
  +---sda2 (dm-crypt-Volume)
       |
       +---ec_root (/)
       +---ec_swap (swap)
       +---ec_home (/home)
&lt;/pre&gt;
&lt;p&gt;Soweit, so unpraktisch. Speziell /home sollte unbedingt erhalten bleiben. Erster Anlauf: ganz naiv den Installer gestartet und geschaut, was er so erkennt. Klappt natürlich nicht. Der sieht sda2 und interessiert sich kein bischen für die Innereien. Ok, zweiter Anlauf: Situation herstellen, die dem Installer erlaubt die Innereien zu erkennen:&lt;/p&gt;
&lt;pre&gt;
cryptsetup luksOpen /dev/sda2 sda2_crypt
lvm vgchange -a y
&lt;/pre&gt;
&lt;p&gt;Das erste öffnet das verschlüsselte Volume, das zweite aktiviert die darin enthaltene Volume Group und alle logischen Volumes innerhalb dieser. Das ganze macht man am besten in einer zweiten Konsole, während der Installer gerade auf Nutzereingaben wartet (bspw. wenn er sich grad aufregt, dass er kein Netz findet). Danach kann man die Installation gemütlich weiterlaufen lassen und der Installer wird beruhigt die Volumes erkennen, so dass man in der manuellen Partitionierung (alles andere wäre Unsinn) alles entsprechend wieder zuweisen kann, wie es sein soll.&lt;/p&gt;
&lt;p&gt;Mir ist hier noch ne Kleinigkeit unangenehm aufgefallen: sda2 wird aus irgendeinem Grund als Swap eingestuft. Aus Sicherheitsgründen habe ich das komplett rausgenommen (also auch &lt;em&gt;nicht&lt;/em&gt; als Crypto-Volume definiert), was zur Folge hatte, dass hinterher etwas Handarbeit angesagt war.&lt;/p&gt;
&lt;p&gt;Wenn die Installation durchgelaufen ist (auch das kann ein Problem sein, wenn das CD-Laufwerk auf einmal I/O-Error wie Kekse verteilt...), dann muss man noch einige kleinere Anpassungen machen um das System bootfähig zu machen. Was ist das Problem? Dadurch, dass das Crypto-Volume von Hand geöffnet wurde und der Installer so nichts davon weiß, fehlt der entsprechende Eintrag in der &lt;tt&gt;/etc/crypttab&lt;/tt&gt; des frisch installierten Systems. Das wiederum führt dazu, dass das initrd nichts über die Verschlüsselung weiß und nicht nach dem Passwort fragt, was wiederum den Bootprozess einfach stillstehen lässt. Blöd. Eine Lösung muss her...&lt;/p&gt;
&lt;p&gt;Im Prinzip isses einfach: man macht das System von Hand bootfähig. Man mountet noch im laufenden Installersystem &lt;tt&gt;/dev&lt;/tt&gt; und &lt;tt&gt;/proc&lt;/tt&gt; mittels &lt;tt&gt;-o bind&lt;/tt&gt; nach &lt;tt&gt;/target/dev&lt;/tt&gt; und &lt;tt&gt;/target/proc&lt;/tt&gt; (&lt;tt&gt;/target&lt;/tt&gt; ist der Punkt, wo der Installer die Platte einhängt. Wenn nicht: einfach selbst machen), wechselt mittels &lt;tt&gt;chroot /target&lt;/tt&gt; ins installierte System, passt die &lt;tt&gt;/etc/crypttab&lt;/tt&gt; entsprechend an (sprich: man trägt in meinem Fall &lt;tt&gt;/dev/sda2&lt;/tt&gt; passend ein. Eventuell muss man die &lt;tt&gt;/etc/fstab&lt;/tt&gt; auch noch anfassen, wenn man schonmal da ist.), ruft &lt;tt&gt;update-grub&lt;/tt&gt; und &lt;tt&gt;update-initramfs&lt;/tt&gt; auf, wechselt wieder raus, macht alle Mounts rückgängig und rebootet. Wenn man großes Glück hat, geht&#039;s danach. Wenn nicht, dann ist Fehlersuche angesagt.&lt;/p&gt;
&lt;p&gt;Für diese Sucherei hab ich heute dann doch etwas gebraucht. Vor allem immer unter der Prämisse: bloß nüscht kaputtmachen, sonst musst du das doofe Backup zurückspielen. Mittlerweile läuft alles, nur eine Warnung beim Systemstart bzgl. des Einbindens von /home irritiert mich noch. Hat zwar keine Auswirkungen, aber das will ich auch noch rauskriegen. Später...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 15 Nov 2009 00:02:21 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/348-guid.html</guid>
    
</item>
<item>
    <title>State-Machine-Bibliothek für Java</title>
    <link>http://blog.slash-me.net/archives/347-State-Machine-Bibliothek-fuer-Java.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/347-State-Machine-Bibliothek-fuer-Java.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=347</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=347</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Letzte Woche waren meine Holde und ich ja im Urlaub und wie das so ist kommt man da ja meist zu den Sachen, für die man sonst nie Zeit hat. Da ich schon seit längerer Zeit mal &lt;a href=&quot;http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung&quot;&gt;TDD&lt;/a&gt; ausprobieren wollte, war die Zeit also günstig. Herausgekommen ist ein kleines Spielzeug namens &lt;a href=&quot;http://bitbucket.org/namenlos/statemachine/&quot;&gt;StateMachine&lt;/a&gt; (kreativere Namensvorschläge werden in den Kommentaren gern entgegengenommen): eine kleine Bibliothek für State Machines in Java. Brauch ich demnächst wahrscheinlich sowieso für verschiedene Dinge, so dass die Zeit nicht vergeudet war.&lt;/p&gt;
&lt;p&gt;Fazit der testgetriebenen Entwicklung? Anfangs etwas gewöhnungsbedürftig, weil man den klassischen Entwicklungsprozess (Entwickeln-Testen) quasi rumdreht. Für so Sachen wie die Entwicklung von Bibliotheken ist das allerdings ganz interessant, weil man relativ früh merkt, wenn die Schnittstellen murksig zu benutzen sind. Durch das &quot;auf den grünen Test&quot; hin programmieren hat man auch klar abgesteckte Aufgaben für jeden Entwicklungsschritt. Ich werd das also bei der Library (und auch sonst wo sich&#039;s lohnt) durchaus weiter ausprobieren.&lt;/p&gt;
&lt;p&gt;Ach ja: &lt;a href=&quot;http://www.bitbucket.org&quot;&gt;bitbucket.org&lt;/a&gt; ist richtig angenehm zu benutzen. So angenehm, dass ich zu faul war, den Kram selbst aufzusetzen. &lt;a href=&quot;http://selenic.com/mercurial&quot;&gt;Mercurial&lt;/a&gt; ist eh geil. Sag ich ja meiner Frau immer, aber die hört ja nicht...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 15 Oct 2009 23:12:44 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/347-guid.html</guid>
    
</item>
<item>
    <title>PostgreSQL weigert sich zu starten</title>
    <link>http://blog.slash-me.net/archives/343-PostgreSQL-weigert-sich-zu-starten.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/343-PostgreSQL-weigert-sich-zu-starten.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=343</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=343</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Kleine Nettigkeit über die ich gerade gestolpert bin. Mein PostgreSQL 8.3 weigert sich zu starten. Er meldet:&lt;/p&gt;
&lt;pre&gt;
2009-08-16 16:12:55 UTC WARNING: could not create listen socket for &quot;localhost&quot;
2009-08-16 16:12:55 UTC FATAL: could not create any TCP/IP sockets
&lt;/pre&gt;
&lt;p&gt;Die erste Zeile hat mich dann richtig raten lassen: wenn man mittels &lt;tt&gt;debootstrap&lt;/tt&gt; ein Debian aufgesetzt hat, dann fehlt üblicherweise die &lt;tt&gt;/etc/hosts&lt;/tt&gt;. Deswegen kann er &lt;tt&gt;localhost&lt;/tt&gt; nicht auflösen und weigert sich, zu starten. Ergo: &lt;tt&gt;echo &quot;127.0.0.1 localhost&quot; &amp;gt;&amp;gt; /etc/hosts&lt;/tt&gt; und schon sollte er wollen. Bei der Gelegenheit kann man auch gleich noch die IP des Servers auf den internen Namen mappen (bspw. &lt;tt&gt;echo &quot;1.2.3.4 servername&quot; &amp;gt;&amp;gt; /etc/hosts&lt;/tt&gt;. Wenn man eh schonmal dran ist...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 16 Aug 2009 18:19:38 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/343-guid.html</guid>
    
</item>
<item>
    <title>Sound in Java unter Linux (speziell: JOSM)</title>
    <link>http://blog.slash-me.net/archives/342-Sound-in-Java-unter-Linux-speziell-JOSM.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/342-Sound-in-Java-unter-Linux-speziell-JOSM.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=342</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=342</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Man kann ja mittels &lt;a href=&quot;http://wiki.openstreetmap.org/index.php/OSMtracker&quot;&gt;OSMTracker&lt;/a&gt; während des Trackens Audioaufzeichnungen anfertigen um sich gewisse Sachen zu markieren (sehr praktisch zum Beispiel bei der Erfassung von Hausnummern). In &lt;a href=&quot;http://josm.openstreetmap.de/&quot;&gt;JOSM&lt;/a&gt; geöffnet werden die Aufzeichnungen als kleine Icons in der Karte angezeigt und können via Klick abgespielt werden.&lt;/p&gt;
&lt;p&gt;JOSM ist ja ein Java-Programm und will als solches in einer JVM laufen. Nun habe ich standardmäßig Suns JVM installiert (unter Kubuntu: sun-java6-jre). Die hat aus irgendwelchen Gründen Probleme mit der Audioausgabe (Meldung: &quot;Audio device unavailable&quot;). Längeres suchen und probieren brachte mich darauf, die OpenSource-Variante der VM zu installieren (wieder unter Kubuntu: openjdk-6-jre). Die kann Audio. Theoretisch. Praktisch besteht das Problem, dass sie den PulseAudio-Server mit installiert und damit die Audioausgabe endgültig kaputtspielt. Keine Ahnung, was genau das Problem ist. Der Effekt ist folgender: sobald die JVM (oder das Flash-Plugin im Browser. Die scheinen die gleiche Infrastruktur zu nutzen) eine Audio-Ausgabe machen will, startet im Hintergrund der PulseAudio-Server. Danach geht gar kein Sound mehr. Liest man ein wenig im Netz rum, dann hat dieses Programm den Ruf nur Probleme zu verursachen. Die übliche Empfehlung: deinstallieren. Hab ich gemacht. Hilft. Plötzlich geht sowohl in der JVM, als auch im Flash der Sound völlig problemlos. Wenn ich jetzt noch ne Ahnung hätte, wozu das Audioverhinderungsprogramm PulseAudio genau da ist...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 13 Aug 2009 10:07:01 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/342-guid.html</guid>
    
</item>
<item>
    <title>Zugriff auf die Dateien eines Windows Mobile Gerätes unter Kubuntu</title>
    <link>http://blog.slash-me.net/archives/341-Zugriff-auf-die-Dateien-eines-Windows-Mobile-Geraetes-unter-Kubuntu.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/341-Zugriff-auf-die-Dateien-eines-Windows-Mobile-Geraetes-unter-Kubuntu.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=341</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=341</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Mit vereinten Kräften gerade rausgefunden: um auf die Dateien eines Windows-Mobile-Gerätes von Ubuntu (in dem Fall Karmic, sollte aber auch mit Jaunty gehen) aus zugreifen zu können ist das Paket synce-kio-rapip-kde4 notwendig. Dieses enthält den notwendigen KIO-Slave, der einem erlaubt auf das WM6-Gerät zuzugreifen. Dummerweise ist dieses Paket nicht in den Standardquellen vorhanden (weder bei Jaunty, noch beim kommenden Karmic). Man kann sich behelfen, indem man folgendes in der &lt;tt&gt;/etc/apt/sources.list&lt;/tt&gt; nachträgt:&lt;/p&gt;
&lt;pre&gt;
deb http://ppa.launchpad.net/synce/ubuntu jaunty main
&lt;/pre&gt;
&lt;p&gt;Danach kann man das Paket installieren und durch die Eingabe von &lt;tt&gt;rapip:/&lt;/tt&gt; in die Adresszeile des Dolphin auf die Dateien des WM6-Gerätes zugreifen. Ja, auch unter Karmic muss man &lt;tt&gt;jaunty&lt;/tt&gt; in der Zeile stehen haben. Für Karmic gibt es (noch?) kein eigenes Repository. Macht aber nix: die Version von Jaunty lässt sich problemlos installieren (zumindest im Moment. Jetzt bloss kein Update!).&lt;/p&gt;
&lt;p&gt;So, jetzt aufgezeichnete GPS-Tracks von heute ziehen und wieder ein wenig was an &lt;a href=&quot;http://www.openstreetmap.org&quot;&gt;OSM&lt;/a&gt; tun.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 09 Aug 2009 21:09:38 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/341-guid.html</guid>
    
</item>
<item>
    <title>Serendipity Shared Installation und mod_vhost</title>
    <link>http://blog.slash-me.net/archives/340-Serendipity-Shared-Installation-und-mod_vhost.html</link>
            <category>Linux</category>
    
    <comments>http://blog.slash-me.net/archives/340-Serendipity-Shared-Installation-und-mod_vhost.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=340</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.slash-me.net/rss.php?version=2.0&amp;type=comments&amp;cid=340</wfw:commentRss>
    

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Uff, da hab ich mal wieder länger ringen müssen. Aus ominösen Gründen wollte ich mal wieder eine Instanz meiner bevorzugten Blogsoftware aufsetzen. Weil sich aber die Platte des Servers mittlerweile ganz gut mit Instanzen füllt, sollte diesmal eine Shared-Installation her, bei der sich früher oder später mal alle Instanzen eine Code-Basis teilen (weniger mangels Platz, sondern wegen des Pflegeaufwandes). Soweit der Plan...&lt;/p&gt;
&lt;p&gt;Nun gibt es dafür eine &lt;a href=&quot;http://www.s9y.org/41.html&quot;&gt;Anleitung&lt;/a&gt;, über der dick und fett steht: &quot;WARNING: THIS FEATURE IS EXPERIMENTAL!&quot;. Experimentell ist es in der Tat, vor allem wenn die Anleitung und meine Vorstellung davon, was gewisse Dinge bedeuten, aufeinander treffen. Wenn man dann noch zusätzlich mod_vhost mit in den Ring schmeißt, dann ist das Chaos fast perfekt. Aber von vorn.&lt;/p&gt;
&lt;p&gt;Ziel der Aktion war folgendes: eine Subdomain &lt;tt&gt;blogs.example.com&lt;/tt&gt; unter der man einfach und ohne Probleme neue Blogs anlegen kann. Dazu sollte nur eine Serendipity-Installation verwendet werden (kein Bock da mehrere zu pflegen). Gut, der Anfang ist einfach: mod_vhost ist schon aktiv, einen neuen VirtualHost im Apachen anlegen (&lt;tt&gt;ServerName blogs.example.com&lt;/tt&gt;, &lt;tt&gt;ServerAlias *.blogs.example.com&lt;/tt&gt;) und im DNS *.blogs.example.com auf die IP des VirtualHost zeigen lassen. In dem VirtualHost Ersetzt man nun noch &lt;tt&gt;DocumentRoot&lt;/tt&gt; durch folgende Zeilen (vorausgesetzt die Bloginstallation liegt am Ende mal unter &lt;tt&gt;/home/blogs.example.com/&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;
UseCanonicalName Off
VirtualDocumentRoot /home/blogs.example.com/subdomains/%1
&lt;/pre&gt;
&lt;p&gt;Nun kann man ganz einfach durch Anlegen eines neuen Verzeichnisses in &lt;tt&gt;/home/blogs.example.com/subdomains&lt;/tt&gt; eine neue Subdomain anlegen. (Beispiel: test.blogs.example.com wird mit der Konfiguration auf &lt;tt&gt;/home/blogs.example.com/subdomains/test&lt;/tt&gt; abgebildet). Ausprobieren, ob das Konstrukt funktioniert und dann weitermachen.&lt;/p&gt;
&lt;p&gt;Nächster Schritt: die Installation von Serendipity. Man lädt das normale Package runter (die LITE-Installation bringt die Dateien nicht mit, die man für die Shared-Installation-Geschichte braucht) und entpackt es nach &lt;tt&gt;/home/blogs.example.com/s9y&lt;/tt&gt;. &lt;em&gt;WICHTIG:&lt;/em&gt; der Pfad &lt;em&gt;MUSS&lt;/em&gt; als letzten Teil &lt;tt&gt;s9y&lt;/tt&gt; haben. Entpackt man die Dateien standardgemäß, dann landen sie in einem neuen Verzeichnis namens &lt;tt&gt;serendipity&lt;/tt&gt;. Dessen Inhalt muss man nach &lt;tt&gt;s9y&lt;/tt&gt; verschieben. Der Pfad ist im Code hart verdrahtet. Wenn man das Verzeichnis anders benennt, dann darf man sich auf unerklärliche Internal Server Errors freuen.&lt;/p&gt;
&lt;p&gt;Zuguterletzt muss man dem Apache noch sagen, wo er sich seine PHP-Dateien zusammensuchen soll. Tut man das nicht, dann findet der Deployment-Code (siehe unten) die Dateien der Shared Installation nicht. Dazu trägt man in den VirtualHost noch folgende Zeile ein (ob &lt;tt&gt;/usr/share/php&lt;/tt&gt; und &lt;tt&gt;/usr/share/pear&lt;/tt&gt; hier wirklich notwendig sind, weiß ich nicht. Eigentlich stehen die bei Debian im &quot;Master Value&quot; für &lt;tt&gt;include_path&lt;/tt&gt;. Vielleicht weiß da jemand ja mehr...):&lt;/p&gt;
&lt;pre&gt;php_value include_path &quot;.:/usr/share/php:/usr/share/pear:/home/blogs.example.com:/home/blogs.example.com/s9y:/home/blogs.example.com/s9y/bundled-libs&quot;&lt;/pre&gt;
&lt;p&gt;Außerdem hilft es, wenn man dem Apache noch erlaubt die &lt;tt&gt;.htaccess&lt;/tt&gt;-Dateien, die Serendipity so mitbringt auch zu interpretieren. Dazu muss man in den Block &lt;tt&gt;&amp;lt;Directory /home/blogs.example.com/subdomains&amp;gt;...&amp;lt;Directory&amp;gt;&lt;/tt&gt; in der Apache-Config bei AllowOverride All eintragen. Damit darf die &lt;tt&gt;.htaccess&lt;/tt&gt; innerhalb der Subdomain-Verzeichnisse alle möglichen Änderungen vornehmen. Wer das einschränken will muss rausfinden, was genau benötigt wird und das dann dort entsprechend angeben.&lt;/p&gt;
&lt;p&gt;Nun kann man mit folgendem Skript recht einfach eine neue Bloginstanz anlegen:&lt;/p&gt;
&lt;pre&gt;
#! /bin/sh

BASE_DIR=/home/blogs.example.com

if [ x$1 == x ]; then
        echo &quot;Please supply a subdomain-name for the blog.&quot;;
        exit 1;
fi

mkdir /home/$BASE_DIR/subdomains/$1
$(
        cd /home/$BASE_DIR/subdomains/$1

        cp -r ../../s9y/deployment/* .

        ln -s ../../s9y/templates .
        ln -s ../../s9y/htmlarea .
)
chown -R www-data.www-data /home/$BASE_DIR/subdomains/$1

su - postgres -c &quot;createdb $1blogsexamplecom&quot;
su - postgres -c &quot;createuser -S -D -R -P -E $1blogsexamplecom&quot;
&lt;/pre&gt;
&lt;p&gt;Das Skript tut eigentlich nicht viel: es legt ein passendes Verzeichnis an um die Subdomain zu aktivieren, kopiert die Deployment-Dateien von Serendipity (ein paar kleine PHP-Dateien, die am Ende mal dafür sorgen, dass aus der Shared-Installation die gemeinsamen Dateien angesprungen werden), verlinkt templates und WYSIWYG-Editor passend und überträgt die Rechte an den Webserver-User. Die letzten beiden Zeilen legen noch die Datenbank und den passenden User zum neuen Blog an (Passwort wird erfragt). Das ist natürlich nur für die bei mir verwendete PostgreSQL gültig. Wer was anderes verwendet muss hier entsprechend anpassen.&lt;/p&gt;
&lt;p&gt;Tja, wenn das alles fehlerfrei durchgelaufen ist, dann kann man eigentlich schon die Domain http://&amp;lt;name&amp;gt;.blogs.example.com besuchen. Dort wird man vom Installationsskript von Serendipity begrüßt, welches den eben angelegten DB-Nutzer wissen will und dann seine Arbeit erledigt. Für das (doch eigentlich recht einfache) Vorgehen hab ich jetzt doch 2 Stunden gebraucht um&#039;s auszutüfteln..&lt;/p&gt;
&lt;p&gt;P.S: Das in der Originalanleitung erwähnte &lt;tt&gt;open_basedir&lt;/tt&gt; muss man leider weglassen, weil es nicht zusammen mit mod_vhost spielen mag. Speziell der Subdomain-spezifische Teil des Pfades würde hier Probleme machen.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 09 Aug 2009 01:04:56 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/340-guid.html</guid>
    
</item>

</channel>
</rss>