<?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.5.5 - http://www.s9y.org/</generator>
    <pubDate>Tue, 29 Nov 2011 14:17:33 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>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>

</channel>
</rss>
