<?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 - Programmieren</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 - Programmieren - (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>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>
