<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zInformatik &#187; perl</title>
	<atom:link href="http://zinformatik.de/tag/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://zinformatik.de</link>
	<description>Computer, Informatik und Mikrocontroller Blog</description>
	<lastBuildDate>Sat, 22 Oct 2011 09:51:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>dmenuLauncher 0.1.1 &#8211; Update des leichtgewichtigen Launchers</title>
		<link>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/</link>
		<comments>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/#comments</comments>
		<pubDate>Sat, 14 May 2011 12:51:54 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Launcher]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Scripte]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1798</guid>
		<description><![CDATA[<p>Aufgrund des Feedbacks und der vielen interessanten Anregungen habe ich dmenuLauncher ein wenig erweitert. Vielen Dank an alle, die mir Ihre Ideen mitgeteilt haben <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>dmenuLauncher ist ein Programmstarter, der dmenu nutzt um ein Programm auszuwählen. Die Grundfunktionalität ist im Artikel <a href="http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl" title="Ein leichtgewichtiger Launcher mit dmenu und Perl" class="liinternal">Ein leichtgewichtiger Launcher mit dmenu</a>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Aufgrund des Feedbacks und der vielen interessanten Anregungen habe ich dmenuLauncher ein wenig erweitert. Vielen Dank an alle, die mir Ihre Ideen mitgeteilt haben <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>dmenuLauncher ist ein Programmstarter, der dmenu nutzt um ein Programm auszuwählen. Die Grundfunktionalität ist im Artikel <a href="http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl" title="Ein leichtgewichtiger Launcher mit dmenu und Perl" class="liinternal">Ein leichtgewichtiger Launcher mit dmenu und Perl</a> beschrieben. Das Skript habe ich auf <a href="https://gist.github.com/950556" title="dmenuLauncher.pl auf GitHub" target="_blank" class="liexternal">GitHub</a> hochgeladen.</p>
<p>Das Script wurde um folgende Punkte erweitert:</p>
<ul>
<li>Ob ein Programm im Terminal gestartet werden soll wird nun mitgespeichert</li>
<li>Es können optional auch Argumente für ein Programm gespeichert werden</li>
<li>Es kann ein String definiert werden, der immer vor dem Befehl eingefügt wird</li>
<li>Es gibt eine (englische) readme, in der alle Funktionen beschrieben sind</li>
</ul>
<p><b>Starten im Terminal</b><br />
Wird dem Programmaufruf ein ; angehängt, so wird damit zwischen &#8220;im Terminal ausführen&#8221; und &#8220;direkt ausführen&#8221; hin und hergeschaltet. Die jeweils letzte Einstellung wird für zukünftige Aufrufe gespeichert.</p>
<p>Beispiel: Ich gehe von davon aus, dass die pathfile gerade generiert wurde, also alle Programme immer direkt ausgeführt werden.</p>
<ul>
<li><code>firefox</code> &#8211; führt firefox direkt aus</li>
<li><code>firefox;</code> &#8211; führt firefox im Terminal aus</li>
<li><code>firefox</code> &#8211; führt firefox im Terminal aus (weil dies beim obigen Aufruf für die Zukunft gespeichert wurde)</li>
<li><code>firefox;</code> &#8211; führt firefox direkt aus</li>
<li><code>firefox</code> &#8211; führt firefox direkt aus (weil dies beim obigen Aufruf für die Zukunft gespeichert wurde)</li>
</ul>
<p>Möchte man wirklich ein ; an einen Befehl anhängen ohne die Option &#8220;Starten im Terminal&#8221; zu verändern, kann man dies mit einem \ escapen.</p>
<p>Also: <code>programm\;</code></p>
<p><b>Speichern von Argumenten</b><br />
Es gibt nun eine Konfigurationsvariable <code>SAVE_ARGUMENTS</code>. Ist diese auf 1 gesetzt, werden automatisch alle Argumente gespeichert. Das bedeutet, dass in der Liste der Programme, aus denen man wählen kann das entsprechende Programm einmal ohne Argumente und jeweils einmal mit Argument aufgeführt wird.</p>
<div id="attachment_1801" class="wp-caption alignright" style="width: 244px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenulauncher_vertical_arguments.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2011/05/dmenulauncher_vertical_arguments.png" alt="dmenuLauncher im vertikalen Modus mit Argumenten" title="dmenuLauncher im vertikalen Modus mit Argumenten" width="234" height="192" class="size-full wp-image-1801" /></a><p class="wp-caption-text">dmenuLauncher im vertikalen Modus mit Argumenten</p></div>
<p>Für jedes Argument eines Befehls wird auch die Anzahl der Aufrufe gespeichert, so dass häufig genutzte Argumente weiter vorne stehen.</p>
<p>Man kann die Variable <code>SAVE_ARGUMENTS</code> für einen Aufruf umschalten, indem man einen . an den Programmaufruf anhängt.</p>
<p>Beispiel: <code>free -m.</code></p>
<ul>
<li>Ist die Variable <code>SAVE_ARGUMENTS</code> auf 1 gesetzt, so wird das Argument <code>-m</code> nicht gespeichert (ohne den . am Ende würde es gespeichert werden)</li>
<li>Ist die Variable <code>SAVE_ARGUMENTS</code> auf 0 gesetzt, so wird das Argument <code>-m</code> gespeichert (ohne den . am Ende würde es nicht gespeichert werden)</li>
</ul>
<p>Bei der Optimierung werden Programme, zu denen Argumente gespeichert sind grundsätzlich nicht entfernt.</p>
<p>Möchte man wirklich einen . an einen Befehl anhängen ohne die Option &#8220;Speichern von Argumenten&#8221; zu verändern, kann man ihn mit einem \ escapen.</p>
<p>Also: <code>programm\.</code></p>
<p>Man kann . und ; nicht gleichzeitig bei einem Aufruf verwenden.</p>
<p><strong>[UPDATE]</strong> Ich habe als Trenner für mehrere Argumente in der pathfile die Zeichenfolge <code>|||</code> genutzt und zum Trennen der Argumente und der jeweiligen Anzahl der Aufrufe die Zeichenfolge <code>|#|</code>. Leerzeichen sind hier nicht möglich, da diese auch in den Argumenten vorkommen dürfen sollen. Falls jemand einen Fall kennt, wo diese Trenner problematisch wären oder grundsätzlich eine bessere Idee hat würde ich mich über einen entsprechenden Kommentar freuen <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong>[/UPDATE]</strong></p>
<p><b>String vor dem Befehl</b><br />
In der Variable <code>BEFORE_COMMAND</code> kann man einen String definieren, der vor dem Befehl eingefügt wird. Ein Anwendungszweck wäre das Wechseln ins Home-Verzeichnis, so dass alle Befehle im Home-Verzeichnis ausgeführt werden.<br />
Dafür setzt man <code>BEFORE_COMMAND</code> auf <code>"cd ~ &#038;&#038; "</code>. Dies ist auch die default Einstellung.</p>
<p>Natürlich kann man auch einen leeren String angeben, damit nichts vor dem eigentlichen Befehl eingefügt wird.</p>
<p><b>Die Readme</b><br />
Die Readme findet man, wenn man die Datei dmenuLauncher.pl mit einem Texteditor öffnet.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Ein leichtgewichtiger Launcher mit dmenu und Perl</title>
		<link>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/</link>
		<comments>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/#comments</comments>
		<pubDate>Sun, 01 May 2011 15:30:30 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Launcher]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Scripte]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1765</guid>
		<description><![CDATA[<p>Lange habe ich GNOMEDo genutzt nur um Programme zu starten. Auch Kupfer und Launchy habe ich ausprobiert. Was mir an allen Programmen nicht gefällt: Für die Aufgabe, für die ich sie brauche (zum Starten von Programmen) sind sie viel zu groß, zu überladen und sie laufen die ganze Zeit im Hintergrund und brauchen RAM. Durch <a href="http://uzbl.org" target="_blank" class="liexternal">uzbl</a> habe&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Lange habe ich GNOMEDo genutzt nur um Programme zu starten. Auch Kupfer und Launchy habe ich ausprobiert. Was mir an allen Programmen nicht gefällt: Für die Aufgabe, für die ich sie brauche (zum Starten von Programmen) sind sie viel zu groß, zu überladen und sie laufen die ganze Zeit im Hintergrund und brauchen RAM. Durch <a href="http://uzbl.org" target="_blank" class="liexternal">uzbl</a> habe ich <a href="http://tools.suckless.org/dmenu/" target="_blank" class="liexternal"><code>dmenu</code></a> kennen gelernt. Ein Programm, mit dem man leicht eine Liste von Worten als Menü anzeigen kann. Der Benutzer kann nun das gesuchte Wort eingeben und <code>dmenu</code> schließt automatisch beim Tippen alle unpassenden Wörter aus (dabei wird nicht nur der Wortanfang kontrolliert sondern ob irgendein Teil des Wortes matched). Mit &lt;ENTER&gt; wird das aktuell ausgewählte Wort zurückgegeben und dmenu beendet. Übergibt man diesem Programm die Liste aller im PATH befindlichen Programme und führt das gewählte Programm danach aus hat man schon einen Launcher.</p>
<p>Ich habe nun noch ein kleines Script &#8211; <code>dmenuLauncher.pl</code> &#8211; geschrieben, das die Programme nach Häufigkeit ihrer Aufrufe sortiert, damit die am häufigsten genutzten Programmen immer zuerst gewählt werden, wenn es eine Mehrdeutigkeit gibt.</p>
<p>Features:</p>
<ul>
<li>Kleines Perl-Script, dass nur bei Bedarf gestartet wird und sonst weder Prozessorzeit noch RAM benötigt</li>
<li>Kann in den meisten Fenstermanagern über Tastenkombination gestartet werden</li>
<li>Programmen können beim Aufruf Argumente übergeben werden</li>
<li>Sortiert Programme nach Nutzungshäufigkeit</li>
<li>Horizontale oder vertikale Anzeige der Programmliste</li>
<li>Programme im Terminal öffnen</li>
<li>Optimierung der Programmliste (löschen aller Programme mit geringer Aufrufsanzahl aus der Liste)</li>
<li>Einfaches hinzufügen von Programmen, die nicht in der Liste sind</li>
</ul>
<p>&nbsp;</p>
<p style="text-align: center;">
<div id="attachment_1772" class="wp-caption aligncenter" style="width: 707px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-horizontal1.png" class="liimagelink"><img class="size-full wp-image-1772  " title="dmenuLauncher-horizontal" src="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-horizontal1.png" alt="dmenuLauncher mit horizontaler Anzeige" width="697" height="94" /></a><p class="wp-caption-text">dmenuLauncher mit horizontaler Anzeige der am häufigsten aufgerufenen Programme</p></div>
<p>&nbsp;</p>
<p>Das Script habe ich auf <a href="https://gist.github.com/950556" title="dmenuLauncher.pl auf gitHub" target="_blank" class="liexternal">gitHub</a> online gestellt. Das Programm <code>dmenu</code> kann unter Ubuntu über das Paket <code>dwm-tools</code> installiert werden. Also mit dem Befehl <code>sudo apt-get install dwm-tools</code>.</p>
<p>Die Datei <code>dmenuLauncher.pl</code> hat im oberen Teil einen Konfigurationsbereich. Ich habe auf eine externe Konfigurationsdatei verzichtet um diese nicht jedes Mal laden zu müssen.</p>
<p>Zuerst wird der Pfad zur path-Datei (in der die Liste der Programme mit ihrer jeweiligen Aufrufanzahl gespeichert wird) in der Variablen <code>PATHFILE</code> angegeben.</p>
<p><code>dmenu</code> kann die Programme im Menü nebeneinander oder untereinander angezeigen. Dafür kann man <code>dmenuLauncher.pl</code> entweder mit der Option <code>-h</code> für horizontal (also nebeneinander) oder <code>-v</code> für vertical (also untereinander) aufrufen.</p>
<p>Den Standardmodus, der genutzt wird, wenn nichts angegeben wurde kann man über die Variable <code>MODE</code> steuern. Sie wird entweder auf <code>horizontal</code> oder <code>vertical</code> gesetzt.</p>
<div id="attachment_1773" class="wp-caption alignright" style="width: 310px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-vertical.png" class="liimagelink"><img class="size-medium wp-image-1773" title="dmenuLauncher-vertical" src="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-vertical-300x209.png" alt="dmenuLauncher vertikale Anzeige" width="300" height="209" /></a><p class="wp-caption-text">dmenuLauncher mit vertikaler Anzeige der Programme mit &quot;gnome&quot; im Namen</p></div>
<p>Die Konfigurationsvariable <code>NUMBER_OF_LINES</code> gibt die Anzahl von anzuzeigenden Zeilen im <code>vertical</code>-Modus an.</p>
<p>In der Variablen <code>TERMINAL</code> wird der Befehl für den Terminalaufruf gespeichert. Der Platzhalter <code>%COMMAND%</code> wird durch das aufzurufende Kommando (mit Argumenten) ersetzt.</p>
<p>Nun kann durch den Aufruf <code>dmenuLauncher.pl -u</code> die path-Datei generiert werden. Nach dem Installieren oder Löschen von Programmen kann die Datei so auch aktualisiert werden.</p>
<p>Nachdem man <code>dmenuLauncher.pl</code> konfiguriert und die path-Datei (mit der Option <code>-u</code>) generiert hat, kann man eine Tastenkombination dafür einrichten. Bei GNOME unter System -&gt; Einstellungen -&gt; Tastenkombinationen auf den Button &#8220;Hinzufügen&#8221; klicken, als Namen &#8220;dmenuLauncher&#8221; und als Befehl den Pfad zur Perldatei (<code>dmenuLauncher.pl</code>) angeben. Nun gibt es in der Liste ganz unten einen neuen Eintrag. Klickt man auf das Feld &#8220;Tastenkombination&#8221;, so kann man die gewünschte Tastenkombination drücken (ich habe SHIFT+&lt;Space&gt; gewählt, die dann dem Script automatisch zugeordnet wird.</p>
<p>Nach dem Starten des Programms (also drücken der zugeordneten Tastenkombination oder per Terminal) öffnet sich nun das Menü und zeigt die Programmliste an. Nun fängt man an, den gewünschten Befehl einzutippen bis er markiert ist. Man kann auch die Pfeiltasten benutzen. Mit der Eingabetaste wird das gewählte Programm ausgeführt und <code>dmenuLauncher</code> geschlossen.</p>
<p>Drückt man nicht direkt die Eingabetaste sondern &lt;Tab&gt;, so wird der Befehl vervollständigt und man kann noch Argumente angeben.</p>
<p>Ob mit ohne ohne Argumente: Durch ein abschließendes Semikolon wird der Befehl im Terminal ausgeführt.</p>
<p>Ein paar Beispiele:</p>
<ul>
<li><code>firef&lt;ENTER&gt;</code> öffnet Firefox</li>
<li><code>firef&lt;Tab&gt; http://zinformatik.de&lt;ENTER&gt;</code> öffnet firefox und geht auf die Seite &#8220;http://zinformatik.de&#8221;</li>
<li><code>top;&lt;ENTER&gt;</code> öffnet <code>top</code> in einem Terminal</li>
<li><code>ls -lh ~;&lt;ENTER&gt;</code> zeigt das Ergebnis von  <code>ls -lh ~</code> in einem Terminal an.</li>
</ul>
<p>Da die ganze Liste von Programmen sehr groß ist, man jedoch meist nur einen sehr kleinen Teil nutzt gibt es die Möglichkeit die Liste der Programme zu optimieren. Durch den Aufruf von <code>dmenuLauncher.pl -o</code> werden alle Programme aus der Liste entfernt, die noch nie genutzt wurden. Ein weiteres Argument gibt die Anzahl der Aufrufe an, die ein Programm mindestens haben sollte. So werden durch <code>dmenuLauncher.pl -o 3</code> alle Programm aus der Liste entfernt die weniger als 3 mal aufgerufen wurden.</p>
<p>Möchte man nach der Optimierung ein Programm aufrufen, das sich nicht mehr in der Liste befindet, so kann man es einfach komplett eingeben. Auch wenn es dann keine Auswahl gibt, wird das Programm ausgeführt und mit der Aufrufsanzahl 1 in die Liste gespeichert.<br />
Um ein neues Programm in die Liste aufzunehmen braucht man es also nur einmal eingeben.</p>
<p>Mit <code>dmenuLauncher</code> habe ich also ein sehr kleines Programm, welches nur kurz läuft um mir die Auswahl eines Programms zu ermöglichen und danach sofort wieder beendet wird. Das Laden ist auch auf älteren Systemen kaum zu spüren, weil keine Bibliotheken geladen werden. Das bedeutet ich kann jedes häufiger genutzte Programm mit 3-4 Tastendrücken ohne irgendeine Verzögerung starten.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Schöner Debuggen mit DebugMessages &#8211; Stacktraces mit Quelltextanzeige</title>
		<link>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/</link>
		<comments>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 11:51:52 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Stacktrace]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1727</guid>
		<description><![CDATA[<p>Das Standardverhalten von Perl beim Auftreten eines Fehlers ist mit der Funktion <code>die</code> zu beenden. Dabei wird neben einer Fehlerursache die Zeilennummer ausgegeben, welche den Fehler verursacht hat<br />
Tritt ein Fehler in einer sehr häufig genutzten Funktion auf (z.B. Umrechnen eines Wertes), so ist es sehr schwer festzustellen, von wo und mit welchen Parametern diese Funktion aufgerufen wurde.</p>
<p>Beispiel:&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Das Standardverhalten von Perl beim Auftreten eines Fehlers ist mit der Funktion <code>die</code> zu beenden. Dabei wird neben einer Fehlerursache die Zeilennummer ausgegeben, welche den Fehler verursacht hat<br />
Tritt ein Fehler in einer sehr häufig genutzten Funktion auf (z.B. Umrechnen eines Wertes), so ist es sehr schwer festzustellen, von wo und mit welchen Parametern diese Funktion aufgerufen wurde.</p>
<p>Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> divide <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$x</span><span style="color: #339933;">/</span><span style="color: #0000ff;">$y</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> printDivision <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;$x durch $y = &quot;</span><span style="color: #339933;">.</span>divide<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> divideList <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$x</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$listReference</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@list</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">$listReference</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$i</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@list</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        printDivision<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@divList1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">22</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@divList2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">33</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">50</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
divideList<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span><span style="color: #0000ff;">\@divList1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># do something else ...</span>
&nbsp;
divideList<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span><span style="color: #0000ff;">\@divList2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zugegeben ist dies ein recht künstlich konstruiertes Beispiel, jedoch ist es nicht leicht ein möglichst einfaches und gleichzeitig realistisches Beispiel zu finden. Die Funktion <code>divide</code> dividiert zwei übergebene Zahlen ohne überprüfung, ob durch 0 dividiert wird. <code>printDivision</code> nutzt diese Funktion um das Ergebnis einer Division auszugeben. Die Funktion <code>divideList</code> bekommt eine Zahl und eine Referenz zu einer Liste übergeben, durch die die Zahl jeweils geteilt und das Ergebnis mit der Funktion <code>printList</code> ausgegeben werden soll. Schließlich wird die Funktion <code>divideList</code> erst mit einer Liste ohne 0 und dann mit einer Liste aufgerufen, in der eine 0 vorkommt.</p>
<p>Die Ausgabe des Programms ist:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 22 = 4.54545454545455
100 durch 7 = 14.2857142857143
100 durch 16 = 6.25
100 durch 2 = 50
100 durch 5 = 20
100 durch 33 = 3.03030303030303
100 durch 50 = 2
Illegal division by zero at ./test.pl line 8.</pre></div></div>

<p>Wenn man die beiden Lisen jetzt nicht direkt so vor Augen hat (weil sie z.B. während des Ablaufs generiert werden), kann man schwer sagen, welcher Funktionsaufruf den Fehler verursacht hat. Man weiß nur, dass der Fehler in Zeile 8 lag. Auch wenn der Fehler abgefangen wird, kommen wir nicht an die Stelle, an der der falsche Parameter ins Spiel gekommen ist.</p>
<p>Ein Stacktrace kann da ein wenig Abhilfe schaffen. Nutzt man das Modul <code>Carp</code>, so kann man die Funktionen <code>warn</code> und <code>die</code> mit <code>carp</code> und <code>croak</code> überschreiben und bekommt nun zusätzlich einen Stacktrace. Dafür werden die beiden folgenden Zeilen an den Anfang des Programms eingefügt:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Carp<span style="color: #339933;">;</span>
<span style="color: #0000ff;">$SIG</span><span style="color: #009900;">&#123;</span><span style="color: #000000; font-weight: bold;">__DIE__</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>croak <span style="color: #000066;">shift</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Ausgabe sieht nun so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 5 = 20
100 durch 10 = 10
100 durch 33 = 3.03030303030303
100 durch 50 = 2
Illegal division by zero at ./test.pl line 9.
 at ./test_croak.pl line 5
        main::__ANON__('Illegal division by zero at ./test_croak.pl line 9.\x{a}') called at ./test.pl line 9
        main::divide(100, 0) called at ./test.pl line 15
        main::printDivision(100, 0) called at ./test.pl line 22
        main::divideList(100, 'ARRAY(0x87d6d28)') called at ./test.pl line 34</pre></div></div>

<p>Bei einer Warnung kann das Programm zwar noch weiter ausgeführt werden, doch sind die Ergebnisse dann in der Regel falsch (vor allem wenn die Warnung wegen einer nicht initialisierten Variablen auftritt). Daher kann es sinnvoll sein die Funktion <code>warn</code> mit <code>croak</code> zu überschreiben, so dass das Programm auch bei einer Warnung abbricht. </p>
<p>Noch praktischer wäre es natürlich, wenn man nun noch die Elemente der Liste kennen würde, mit deren Referenz die Funktion <code>divideList</code> aufgerufen wurde.</p>
<p>Daher habe ich ein kleines Modul entwickelt (die Grundidee stammt aus einem Perl-Buch), welches noch etwas mehr kann. Das Modul <code>DebugMessages</code> gibt bei einem Fehler einen Stacktrace aus, wobei die aktuellen Parameter des Aufrufs mit ausgegeben werden. Auf Wunsch werden werden auch Inhalte von Listen und Hashes ausgegeben.<br />
Zusätzlich wird der Quelltext mit ausgegeben und zwar ab n Zeilen über der Zeile, die den Fehler erzeugt hat bis n Zeilen danach. (Die Anzahl der Zeilen n kann beliebig gewählt werden). Die Zeile mit dem Fehler wird dabei markiert.</p>
<p>Das Modul kann folgendermaßen eingebunden werden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> lib <span style="color: #ff0000;">&quot;path/to/module&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> DebugMessages exit_on_warning <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> errors <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> warnings <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> level <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> verbose <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Pfadangabe <code>"path/to/module"</code> muss natürlich auf das Verzeichnis zeigen, in dem die Datei <code>DebugMessages.pm</code> liegt.</p>
<p>Die einzelnen Parameter haben dabei folgende Bedeutung:</p>
<ul>
<li>exit_on_warning: Wenn dieser Parameter 1 ist bricht das Programm schon bei einer Warnung ab. (Default ist 0)</li>
<li>errors: Anzahl der Zeilen, die jeweils vor und nach der Zeile ausgegeben werden sollen, die einen Fehler produziert hat. -1 deaktiviert DebugMessages für Fehler. (Default ist 3)</li>
<li>warnings: Anzahl der Zeilen, die jeweils vor und nach der Zeile ausgegeben werden sollen, die eine Warnung produziert hat. -1 deaktiviert Default für Warnungen. (Default ist 3)</li>
<li>level: Anzahl der Rekursionslevel für den Stacktrace. (Default ist 3)</li>
<li>verbose: 1 zeigt den Inhalt von Listen und Hasheses in kompakter Schreibweise an. 2 Zeigt den Inhalt ausführlich an. 0 deaktiviert das Ausgeben von Listeninhalten.</li>
</ul>
<p>Die Fehlermeldung des obigen Beispiels sieht ist nun sehr ausführlich:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 22 = 4.54545454545455
100 durch 7 = 14.2857142857143
100 durch 16 = 6.25
100 durch 2 = 50
100 durch 5 = 20
100 durch 33 = 3.03030303030303
100 durch 50 = 2
&nbsp;
Error: Illegal division by zero at ./test.pl line 11.
&nbsp;
   0008:
   0009: sub divide {
   0010:     my ($x,$y) = @_;
 * 0011:     return $x/$y;
   0012: }
   0013:
   0014: sub divideAll {
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::divide
100
0
-------------------------------------
&nbsp;
   main::divide(100,0) called at line 33 in file ./test.pl (package main):
     0030:
     0031: sub printDivision {
     0032:     my ($x,$y) = @_;
   * 0033:     print &quot;$x durch $y = &quot;.divide($x,$y).&quot;\n&quot;;
     0034: }
     0035:
     0036: sub divideList {
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::printDivision
100
0
-------------------------------------
&nbsp;
     main::printDivision(100,0) called at line 41 in file ./test.pl (package main):
       0038:     my $listReference = shift;
       0039:     my @list = @{$listReference};
       0040:     foreach my $i(@list){
     * 0041:         printDivision($x,$i);
       0042:     }
       0043: }  
       0044:
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::divideList
100
0..6  2 5 33 50 0 7 65
-------------------------------------
&nbsp;
       main::divideList(100,ARRAY(0x9ff2528)) called at line 52 in file ./test.pl (package main):
         0049:
         0050: # do something else ...
         0051:  
       * 0052: divideList(100,\@divList2);</pre></div></div>

<p>So kann man den Fehler über alle Funktionsaufrufe zurückverfolgen ohne in den Editor wechseln zu müssen. Man hat ja auch den Kontext des Quellcodes vor Augen. </p>
<p>Zusätzlich wurde noch eine kleine Verschönerung für die Ausgabe von Listen hinzugefügt. Mit eingebundenem Modul kann man Listen folgendermaßen ausgeben:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@list</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hallo Welt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;b&quot;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;[@list]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Statt der normalen Ausgabe:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">[Hallo Welt a b 1 2 3]</pre></div></div>

<p>bei der man nicht erkennen kann, wie viele Elemente die Liste enthält, bekommt man mit eingebundenem DebugMessages Modul folgende Ausgabe:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">[Hallo Welt] [a] [b] [1] [2] [3]</pre></div></div>

<p>Das Modul <code>DebugMessages</code> habe ich bei GitHub hoch geladen. Die Adresse ist: <a href="http://github.com/zimon/DebugMessages" target="_blank" class="liexternal">http://github.com/zimon/DebugMessages</a></p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erinnerungen mit at und zenity</title>
		<link>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/</link>
		<comments>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:59:53 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[at]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Erinnerung]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[zenity]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1619</guid>
		<description><![CDATA[<p>Wenn man am PC sitzt vergisst man schnell die Zeit. Wenn man noch etwas erledigen muss wäre es daher vorteilhaft, wenn man daran erinnert werden würde. </p>
<p>Ein solches &#8220;Erinnerungsprogramm&#8221; kann man sich recht leicht selber basteln. Ich habe dafür  das Linuxtool <code>at</code> mit dem Programm <a href="http://wiki.ubuntuusers.de/Zenity" target="_blank" title="zenity - Darstellung von Dialogen" class="liuu"><code>zenity</code></a>, welches Dialoge darstellen kann, kombiniert.&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Wenn man am PC sitzt vergisst man schnell die Zeit. Wenn man noch etwas erledigen muss wäre es daher vorteilhaft, wenn man daran erinnert werden würde. </p>
<p>Ein solches &#8220;Erinnerungsprogramm&#8221; kann man sich recht leicht selber basteln. Ich habe dafür  das Linuxtool <code>at</code> mit dem Programm <a href="http://wiki.ubuntuusers.de/Zenity" target="_blank" title="zenity - Darstellung von Dialogen" class="liuu"><code>zenity</code></a>, welches Dialoge darstellen kann, kombiniert.</p>
<p><code>at</code> (bzw. der at-Daemon <code>atd</code>) ist auf den meisten Linuxdistributionen bereits vorhanden, kann sonst aber auch über die Paketverwaltung installiert werden. Zenity sollte bei den meisten Distributionen ebenfalls über die Paketverwaltung installierbar sein.<br />
Unter Ubuntu installiert man <code>zenity</code> mit dem Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> zenity</pre></div></div>

<p>Mit <code>at</code> können Befehle zu einem festgelegten Zeitpunkt ausgeführt werden. Eine sehr schöne Einführung gibt es in der <a href="http://www.freiesmagazin.de/mobil/freiesMagazin-2008-10-bilder.html#08_10_at" target="_blank" title="freiesMagazin 10/2008 - at" class="liexternal">Ausgabe 10/2008 von freiesMagazin</a> (eine Fortsetzung ist in der <a href="http://www.freiesmagazin.de/mobil/freiesMagazin-2008-11-bilder.html#08_11_at-beispiele" target="_blank" class="liexternal">nachfolgenden Ausgabe</a> enthalten, welche mich auch zu diesem &#8220;Programm&#8221; inspirierte, weil ich mit den dort vorgestellten Erinnerungs-Lösungen nicht zufrieden war).</p>
<p>Um mit <code>zenity</code> einen Dialog anzuzeigen kann man folgenden Befehl nutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">zenity <span style="color: #660033;">--info</span> <span style="color: #660033;">--title</span>=<span style="color: #ff0000;">&quot;Titel des Dialogs&quot;</span> <span style="color: #660033;">--text</span> <span style="color: #ff0000;">&quot;Text, der angezeigt werden soll&quot;</span></pre></div></div>

<p>Damit dies von <code>at</code> angezeigt werden kann muss noch das Display angegeben werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">zenity <span style="color: #660033;">--info</span> <span style="color: #660033;">--title</span>=<span style="color: #ff0000;">&quot;Titel des Dialogs&quot;</span> <span style="color: #660033;">--text</span> <span style="color: #ff0000;">&quot;Text, der angezeigt werden soll&quot;</span> <span style="color: #660033;">--display</span>=:<span style="color: #000000;">0</span></pre></div></div>

<p>Diesen Befehl kann man nun in ein Bash- oder Perl-Script einfügen, wobei der Titel fest sein kann und der Text als Argument übergeben wird. Ich habe mich für Perl entschieden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000066;">system</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;zenity --info --title=<span style="color: #000099; font-weight: bold;">\&quot;</span>Erinnerung<span style="color: #000099; font-weight: bold;">\&quot;</span> --text <span style="color: #000099; font-weight: bold;">\&quot;</span>@ARGV<span style="color: #000099; font-weight: bold;">\&quot;</span> --display=:0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dieses Script habe ich unter dem Namen <code>r</code> (für &#8220;remember&#8221;) im bin-Ordner meines Homeverzeichnisses gespeichert. Dieses muss natürlich im Pfad liegen, was durch folgende Zeile in der Datei <code>~/.bashrc</code> erreicht werden kann:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

<p>&#8220;user&#8221; muss natürlich durch den entsprechenden Usernamen ersetzt werden. Nachdem man die <code>~/.bashrc</code> mit dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">. ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p>neu &#8220;geladen&#8221; hat kann man sich nun an Termine oder andere Dinge erinnern lassen.</p>
<p><strong>Beispiele:</strong><br />
Um 14:30 Termin bei FooBar. Also um 14:15 erinnern:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">at 14:15
r Termin bei FooBar in 15 Minuten
Strg+d</pre></div></div>

<p>In einer halben Stunde ist eine Besprechung (5 min vorher erinnern):</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">at now +25min
r Besprechung
Strg+d</pre></div></div>

<p>Es öffnet sich zur angegebenen Zeit ein Dialogfenster (egal, was man gerade macht &#8211; solange man sich in X befindet. Bei Spielen im Fullscreen habe ich es jedoch nicht getestet.), welches den Titel &#8220;Erinnerung&#8221; enthält und den angegebenen Text ausgibt. Das Fenster kann durch einen Klick auf &#8220;OK&#8221; wieder geschlossen werden.</p>
<p><code>at</code> bietet noch viele weitere Möglichkeiten eine Zeit anzugeben. Diese werden im (ersten) oben verlinkten freiesMagazin-Artikel beschrieben.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NaturalDocs &#8211; Quelltexte natürlich dokumentieren</title>
		<link>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/</link>
		<comments>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 14:14:03 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ADA]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Makefile]]></category>
		<category><![CDATA[NaturalDocs]]></category>
		<category><![CDATA[Pascal]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TCL]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1374</guid>
		<description><![CDATA[<div id="attachment_1412" class="wp-caption alignright" style="width: 205px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big-195x300.png" alt="NaturalDocs Dokuementation des zBot" title="NaturalDocs Dokuementation des zBot" width="195" height="300" class="size-medium wp-image-1412" /></a><p class="wp-caption-text">NaturalDocs Dokuementation des zBot</p></div>Da mir POD/PerlDoc nicht gefällt, habe ich mich vor einiger Zeit auf die Suche nach einer Alternative gemacht und bin auf <a href="http://www.naturaldocs.org" title="NaturalDocs" target="_blank" class="liexternal">NaturalDocs</a> gestoßen. Mit diesem System können eine ganze Reihe von Programmiersprachen dokumentiert werden, wie z.B. perl, C#, c++, Makefiles, Ruby, Python, PHP, ActionScript, Java, JavaScript, Pascal, ADA,<p>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1412" class="wp-caption alignright" style="width: 205px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big-195x300.png" alt="NaturalDocs Dokuementation des zBot" title="NaturalDocs Dokuementation des zBot" width="195" height="300" class="size-medium wp-image-1412" /></a><p class="wp-caption-text">NaturalDocs Dokuementation des zBot</p></div>Da mir POD/PerlDoc nicht gefällt, habe ich mich vor einiger Zeit auf die Suche nach einer Alternative gemacht und bin auf <a href="http://www.naturaldocs.org" title="NaturalDocs" target="_blank" class="liexternal">NaturalDocs</a> gestoßen. Mit diesem System können eine ganze Reihe von Programmiersprachen dokumentiert werden, wie z.B. perl, C#, c++, Makefiles, Ruby, Python, PHP, ActionScript, Java, JavaScript, Pascal, ADA, TCL, &#8230;</p>
<p>Sehr schön an NaturalDocs ist, dass die Dokumentation sehr nahe an natürlichsprachlichem Plaintext ist und sich die Beschreibungen von Klassen oder Methoden auch sehr gut aus den Quellen lesen lässt ohne dass man die Syntax von NaturalDocs kennen muss. Auch einfache Textdateien wie eine Readme oder ähnliches können damit erstellt werden. So kann man (zumindest bei kleineren Projekten) sogar sämtliche Dokumente wie Anforderungen, UML-Diagramme, &#8230; mit NaturalDocs erstellen, wodurch man alle Informationen an einem Ort gebündelt und in einem einheitlichen Format vorliegen hat.</p>
<p>Das Perl-Tool versteht auch JavaDoc, so dass eine Umstellung erleichtert wird.</p>
<p>Gestartet wird NaturalDocs mittels:<br />
<code>NaturalDocs -i [input (source) directory]<br />
            -o [output format] [output directory]<br />
            -p [project directory]<br />
            [options]</code><br />
wobei ich mir ein kleines Script zum erstellen/aktualisieren der Dokumentation erstellt habe, welches ein Changelog beinhaltet, welches aus einem <code>svn log</code> automatisch generiert wird. Das Script habe ich unten angehängt.</p>
<p>Ein Beispiel in perl:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># SUB: multiplicate</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># multiplicates two numbers</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># PARAMETERS:</span>
<span style="color: #666666; font-style: italic;"># $a - first parameter</span>
<span style="color: #666666; font-style: italic;"># $b - second parameter</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># RETURNS:</span>
<span style="color: #666666; font-style: italic;"># the product of $a and $b</span>
<span style="color: #000000; font-weight: bold;">sub</span> multiplicate <span style="color: #009900;">&#123;</span>
    <span style="color: #0000ff;">$a</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$b</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$a</span><span style="color: #0000ff;">*$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So sieht die Dokumentation einer einfachen Funktion aus. Bei Sprachen die full language support besitzen (bisher perl, ActionScript und C#) kann auch eine JavDoc-artige Dokumentation genutzt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># multiplicates two numbers</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># PARAMETERS:</span>
<span style="color: #666666; font-style: italic;"># $a - first parameter</span>
<span style="color: #666666; font-style: italic;"># $b - second parameter</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># RETURNS:</span>
<span style="color: #666666; font-style: italic;"># the product of $a and $bsub multiplicate {</span>
    <span style="color: #0000ff;">$a</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$b</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$a</span><span style="color: #0000ff;">*$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Beide Beispiele haben das selbe Ergebnis:<br />
<div id="attachment_1401" class="wp-caption aligncenter" style="width: 439px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs.png" alt="NaturalDocs Beispiel" title="NaturalDocs Beispiel" width="429" height="350" class="size-full wp-image-1401" /></a><p class="wp-caption-text">NaturalDocs Beispiel</p></div>
<p>Listen können erstellt werden, indem eine Zeile mit &#8220;<code>-</code>&#8221; angefangen wird. Definitionen haben ein &#8220;<code>-</code>&#8221; zwischen Bezeichner und Definition. Es können auch Grafiken, Beispielquelltexte und ASCII-Diagramme eingefügt werden.</p>
<p>Leider kann NaturalDocs von Haus aus nicht mit Listen in Listen umgehen, doch dafür gibt es einen Patch: <a href="http://sourceforge.net/tracker/index.php?func=detail&#038;aid=1371134&#038;group_id=81796&#038;atid=564052" title="NaturalDocs Patch - Nested Bullet Lists" target="_blank" class="liexternal">Nested Bullets</a>, womit man durch <code>+</code> oder <code>*</code> eine Liste in der Liste einleitet.<br />
Installiert wird es, indem die Datei Native.pm.diff nach $NATURALDOCS_PATH/Modules/NaturalDocs/Parser Kopiert wird und dann der Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">patch</span> Native.pm Native.pm.diff</pre></div></div>

<p>aufgerufen wird.</p>
<p>Einen neuen Absatz erzwingt man durch eine Leerzeile. Eine Überschrift kann mittels <code># Überschrift:</code> eingefügt werden, wobei die Zeile darüber leer sein muss.<br />
Es kann auch auf Webseiten, Emailadressen und andere Stellen der Dokumentation verlinkt werden.<br />
Natürlich kann auch unterstrichen und fett geschrieben werden. Die Zusammenfassung wird automatisch erstellt. </p>
<p>Cool ist auch die Möglichkeit der Abkürzung, womit man mehrere Defines, Funktionen oder Variablen zusammenfassend dokumentieren kann. So kann man statt dem folgenden Code</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># VARIABLE: $configFile</span>
<span style="color: #666666; font-style: italic;"># Filename of configuration file</span>
<span style="color: #0000ff;">$configFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;config.txt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># VARIABLE: $inputFile</span>
<span style="color: #666666; font-style: italic;"># Filename of input file</span>
<span style="color: #0000ff;">$inputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># VARIABLE: $outputFile</span>
<span style="color: #666666; font-style: italic;"># Filename of output file</span>
<span style="color: #0000ff;">$outputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;out.txt&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>die Variablen für die Dateinamen zusammen fassen:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># VARIABLES: Filenames</span>
<span style="color: #666666; font-style: italic;"># $configFile - Filename of configuration file</span>
<span style="color: #666666; font-style: italic;"># $inputFile - Filename of input file</span>
<span style="color: #666666; font-style: italic;"># $outputFile - Filename of output file</span>
<span style="color: #0000ff;">$configFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;config.txt&quot;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$inputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$outputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;out.txt&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dabei können mehrere solcher Blöcke für verschiedene Belange angelegt werden (z.B. Dateinamen, Logindaten für Datenbank, &#8230;). Das Ergebnis sieht dann so aus:<br />
<div id="attachment_1410" class="wp-caption aligncenter" style="width: 394px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs2.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs2.png" alt="NaturalDocs - Variablen zusammenfassend dokumentiert" title="NaturalDocs - Variablen zusammenfassend dokumentiert" width="384" height="195" class="size-full wp-image-1410" /></a><p class="wp-caption-text">NaturalDocs - Variablen zusammenfassend dokumentiert</p></div></p>
<p>Auch mein <a href="http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/" title="zBot - ein Jabber Bot in Perl" target="_self" class="liinternal">Jabber Bot zBot</a> ist mit NaturalDocs dokumentiert. Als Beispiel kann man sich <a href="http://zinformatik.de/zbotdoc/index.html" title="Dokumentation zBot Version 0.2" target="_blank" class="liinternal">dessen Dokumentation</a> ansehen.</p>
<p>Für Neulinge gibt es ein schönes <a href="http://www.naturaldocs.org/documenting/walkthrough.html" title=" NaturalDocs - Walpthrough" target="_blank" class="liexternal">Walktrough</a>, wo die ersten Schritte mit NaturalDocs erklärt werden.</p>
<p>Hier noch das Script, welches eine von NaturalDocs lesbare Changelist im Ordner documents  und dann die Dokumentation selbst erstellt:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Script: makedocs.pl</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># This script generates the documentation.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Requirements:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># - NaturalDocs path must be in ENV variable $NATURALDOCS_PATH</span>
<span style="color: #666666; font-style: italic;"># - Projectdirectory naturaldocs has to be in the same directory as this script</span>
<span style="color: #666666; font-style: italic;"># - There must be a (empty) directory documentation in the same directory as this script</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Usage:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Just start this script when something has changed or use the script &lt;make.pl&gt;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># &gt; tools/makedocs.pl [OPTIONS]</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Options:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#  -o - start makedocs.pl in offline modus</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># In offlinemode the changelog is not generated</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># SVN:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Commit only the textfiles of the projectdirectory (Not the directory &quot;Data&quot;) from NaturalDocs.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># The documentation directory should be an empty dir in SVN.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># So everybody can create the documentation by himself just by executing this script.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> vars <span style="color: #000066;">qw</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">%ENV</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Sub: generatechangelog</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Generates documents/changelog.txt from svn log -v</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #000000; font-weight: bold;">sub</span> generatechangelog <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Generating changelog...n&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>LANG<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`svn log -v`</span><span style="color: #339933;">;</span> 
&nbsp;
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/(-){2,}//g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/(r[0-9]{1,4})/$1:nn$1/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/n/nn/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/Pfade:/Pfade/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/paths:/paths/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #000066;">s</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>A<span style="color: #339933;">-</span>Z<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/-</span> <span style="color: #0000ff;">$1</span><span style="color: #339933;">/</span>g<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>DATEI<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&gt;documents/changelog.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> DATEI <span style="color: #ff0000;">&quot;Title: Changelognn$log&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">close</span> DATEI<span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Done.n&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">######### PROGRAM START ############</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>NATURALDOCS_PATH<span style="color: #009900;">&#125;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>NATURALDOCS_PATH<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">ne</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    generatechangelog<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">not</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">&quot;-o&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># Generate documentation of current directory in HTML and save to directory documentation. Projectdirectory is naturaldocs.</span>
<span style="color: #666666; font-style: italic;"># Ignore directory tests</span>
    <span style="color: #000066;">system</span>
<span style="color: #ff0000;">&quot;$ENV{NATURALDOCS_PATH}/NaturalDocs -i . -o HTML ./documentation -p ./naturaldocs -xi ./tests&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Environment variable $NATURALDOCS_PATH not defined!n&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Perl Einzeiler auf der Konsole</title>
		<link>http://zinformatik.de/linux/perl-einzeiler-auf-der-konsole/</link>
		<comments>http://zinformatik.de/linux/perl-einzeiler-auf-der-konsole/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 18:59:11 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Einzeiler]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1373</guid>
		<description><![CDATA[<p>Ähnlich wie bei <a href="Keine Angst vor awk - ein Schnelleinstieg" title="http://zinformatik.de/linux/keine-angst-vor-awk-ein-schnelleinstieg/" class="liinternal">awk</a> kann man perl das Programm auf der Konsole direkt übergeben. Dazu ruft man perl mit der Option <code>-e</code> auf. Das Programm muss dann in Hochkommata eingeschlossen werden.<br />
Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'print &#34;Hello World!\n&#34;'</span></pre></div></div>

<p>Um jede print-Anweisung mit einem &#8220;newline&#8221; abzuschließen, kann&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Ähnlich wie bei <a href="Keine Angst vor awk - ein Schnelleinstieg" title="http://zinformatik.de/linux/keine-angst-vor-awk-ein-schnelleinstieg/" class="liinternal">awk</a> kann man perl das Programm auf der Konsole direkt übergeben. Dazu ruft man perl mit der Option <code>-e</code> auf. Das Programm muss dann in Hochkommata eingeschlossen werden.<br />
Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'print &quot;Hello World!\n&quot;'</span></pre></div></div>

<p>Um jede print-Anweisung mit einem &#8220;newline&#8221; abzuschließen, kann man zusätzlich die Option <code>-l</code> benutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-l</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'print &quot;Hello World!&quot;; print &quot;Hello Ubuntuusers!&quot;'</span></pre></div></div>

<p>Um eine Datei Zeile für Zeile durchzugehen, gibt es die Option <code>-n</code>. Das Program beschreibt dann ähnlich wie bei awk was mit jeder Zeile geschehen soll:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-n</span> <span style="color: #660033;">-l</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'print $_ if $_ =~ /foo/&quot;'</span> datei.txt</pre></div></div>

<p>gibt alle Zeilen aus, die &#8220;foo&#8221; enthalten.<br />
Die Option -n entspricht folgendem Code:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;&gt;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;"># Der Code, der übergeben wird</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die Option -a bringt perl noch einen Schritt näher zu awk. Damit werden die Wörter einer Zeile (die durch Leerzeichen getrennt sind) in das Array <code>@F</code> geladen. Den Worttrenner kann man mit der Option <code>-F</code> setzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-n</span> <span style="color: #660033;">-a</span> <span style="color: #660033;">-F</span>; <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'print $F[$#F]'</span> datei.csv</pre></div></div>

<p>gibt von jeder Zeile das letzte Element einer csv (Comma Separated Value) Datei aus.<br />
Dies entspricht folgendem Code:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;&gt;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #0000ff;">@F</span> <span style="color: #339933;">=</span> <span style="color: #000066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$pattern</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;"># Der übergebene Code</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>wobei <code>$pattern</code> das mit -F übergebene Pattern (im obigen Beispiel <code>";"</code>) ist. Dadurch sind auch reguläre Ausdrücke wie <code>-F/[0-9]+/</code> möglich.</p>
<p>Es können auch die Schlüsselwörter BEGIN und END gesetzt werden um einen Block vor oder nach der Hauptschleife auszuführen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-n</span> <span style="color: #660033;">-l</span> <span style="color: #660033;">-a</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'BEGIN{$x=0} {$x+=$F[$#F]} END{print $x}'</span> preisliste.txt</pre></div></div>

<p>errechnet den Gesammtpreis einer Preisliste, in der am Ende jeder Zeile der Preis steht. Es wird also von jeder Zeile das letzte Wort addiert. Man könnte das Programm jetzt auch noch etwas kürzer schreiben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-nlae</span> <span style="color: #ff0000;">'$x+=$F[$#F]; END{print $x}'</span> preisliste.txt</pre></div></div>

<p>Dies entspricht dem awk-Programm:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{x+=$NF} END{print x}'</span> preisliste.txt</pre></div></div>

<p>Für das Suchen und Ersetzen mit Regulären Ausdrücken eignet sich die Option <code>-p</code>. Diese Funktioniert genau wie <code>-n</code> mit dem Unterschied, dass jede Zeile automatisch ausgegeben wird. So kann man wie mit sed Dateien ändern:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-pe</span> <span style="color: #ff0000;">'s/foo/bar/g'</span> datei.txt <span style="color: #000000; font-weight: bold;">&gt;</span> datei_new.txt</pre></div></div>

<p>ersetzt jedes Vorkommen von &#8220;foo&#8221; durch &#8220;bar&#8221; und schreibt das Ergebnis in die Datei &#8220;datei_new.txt&#8221;.</p>
<p>Um die Datei direkt zu ändern, kann man die Option <code>-i</code> verwenden. Dieser kann optional ein String mitgegeben, der an den verwendeten Dateinamen angehängt den Dateinamen einer anzulegenden Sicherheitskopie ergibt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-pi</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/foo/bar/g'</span> <span style="color: #000000; font-weight: bold;">*</span>.txt
<span style="color: #c20cb9; font-weight: bold;">perl</span> -pi.orig <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/foo/bar/g'</span> datei.txt</pre></div></div>

<p>Beim ersten Befehl jede Text-Datei im aktuellen Verzeichnis direkt geändert. Beim zweiten wird die &#8220;datei.txt&#8221; nach &#8220;datei.txt.orig&#8221; kopiert bevor jedes Vorkommen von &#8220;foo&#8221; durch &#8220;bar&#8221; ersetzt wird. (Man kann natürlich auch mit dem 2. Befehl beliebig viele Dateien bearbeiten, wenn man * benutzt.)</p>
<p><strong>Module</strong><br />
Die Option <code>-M</code> erlaubt es einem beliebige Module einzubinden, die dann im Programm benutzt werden können. So kann man z.B. mit dem folgenden Befehl mit dem Modul LWP::Simple eine Webite laden und den HTML-Code ausgeben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> -MLWP::Simple <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'getprint(&quot;http://zinformatik.de&quot;)'</span></pre></div></div>

<p>Mit dem folgenden Befehl werden von allen iso Dateien im Verzeichnis MD5-Summen erstellt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">*</span>.iso <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> -MDigest::MD5 <span style="color: #660033;">-nle</span> <span style="color: #ff0000;">'open(FILE,$_); $d=Digest::MD5-&gt;new; $d-&gt;addfile(FILE); print $d-&gt;hexdigest'</span></pre></div></div>

<p><strong>Fazit</strong><br />
Für kleinere kosmetische Änderungen eines Textes oder einer Ausgabe sowie zum extrahieren von Informationen daraus ist awk meist besser geeignet. Bei komplexeren Aufgabenstellungen ist die Mächtigkeit von perl jedoch vorteilhafter.<br />
Vor allem durch die Möglichkeit der Dateioperationen sollen manche Aktionen beschleunigt werden können:<br />
Statt des Aufrufs:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;*.bak&quot;</span> <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #ff0000;">&quot;{}&quot;</span> \;</pre></div></div>

<p>der für jede gefundene Datei einen neuen Prozess startet um sie zu löschen kann man folgenden Befehl nutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;*.bak&quot;</span> <span style="color: #660033;">-print</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-nle</span> <span style="color: #ff0000;">'unlink'</span></pre></div></div>

<p>Es ist jedenfalls nicht verkehrt beides zu kennen, ganz nach dem Motto: Für jeden Zweck die richtige Programmiersprache.</p>
<p><strong>[UPDATE]</strong>Mehr informationen liefert der Befehl <code>perldoc perlrun</code> (perldoc muss installiert sein) oder die Seite <a href="http://p3rl.org/perlrun" title="Dokumentation von perlrun" target="_blank" class="liexternal">http://p3rl.org/perlrun</a><strong>[/UPDATE]</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/perl-einzeiler-auf-der-konsole/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jabber Bot zBot in Version 0.2</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/jabber-bot-zbot-in-version-02/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/jabber-bot-zbot-in-version-02/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:25:06 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Interessante Programme]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[zBot]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=756</guid>
		<description><![CDATA[<p>Heute stelle ich die Version 0.2 von meinem Jabber Bot <a href="http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/" title="zBot - ein Jabber Bot in Perl" target="_self" class="liinternal">zBot</a> vor.</p>
<p>Nun wird eine Logdatei unterstützt, in der alle Konversationen mit dem Bot gespeichert werden können. Die Option kann in der Datei modules/Configs.pm ein- und ausgeschaltet werden. Dort kann auch der Ort bestimmt werden, wo die Logdatei gespeichert werden&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Heute stelle ich die Version 0.2 von meinem Jabber Bot <a href="http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/" title="zBot - ein Jabber Bot in Perl" target="_self" class="liinternal">zBot</a> vor.</p>
<p>Nun wird eine Logdatei unterstützt, in der alle Konversationen mit dem Bot gespeichert werden können. Die Option kann in der Datei modules/Configs.pm ein- und ausgeschaltet werden. Dort kann auch der Ort bestimmt werden, wo die Logdatei gespeichert werden soll. Ein Timestamp wird mit gespeichert. In einem MUC (Chat) wird das gesammte dortige Gespräch mit geloggt, nicht nur die Konversation mit dem Bot.</p>
<p>Des weiteren wurde die Plugin-Schnittstelle erweitert. Nun kann neben der Hilfe auch eine Kurzbeschreibung angegeben werden, die bei der Auflistung der verschiedenen Befehle angezeigt wird. Jetzt kann auch eine Referenz zu einer Idle-Funktion angegeben werden, die alle 15 Sekunden aufgerufen wird. Diese kann genutzt werden um z.B. regelmäßig RSS-Feeds abzurufen (bei einem RSS-Plugin) oder um ähnliche Aufgaben im Hintergrund zu erledigen. Die Vorhandenen Plugins können jedoch auch ohne Änderung weiter verwendet werden. Jedoch habe ich die Plugins hier auf dem Blog entsprechend aktualisiert, so dass sie nun eine Kurzbeschreibung enthalten.</p>
<p>Das Plugin &#8220;Say&#8221; (Kommando <em>sag</em>), welches den Bot in Chaträumen etwas sagen lässt wurde erweitert. Nun kann er auch in Räumen etwas sagen, die nicht in der Konfigurationsdatei angegeben sind und noch nicht mal auf dem angegebenen Conference-Server liegen müssen (In der modules/Configs.pm lässt sich der Bot jedoch auf den eigenen Conference-Server beschränken). Danach ist er in den entsprechenden Räumen eingeloggt und nimmt dort auch Befehle entgegen. mit dem Befehl</p>
<p>sag ignoriere raumname</p>
<p>kann man ihn im Raum raumname wieder zum schweigen bringen (Befehle aus diesem Raum werden dann ignoriert bis der Bot mit <em>sag</em> erneut etwas in dem Raum sagen soll). Mehr Infos sind in der Hilfe verfügbar (hilfe sag). Eine Funktion um den Bot aus dem Raum wieder abzumelden wird leider nicht von der Bibliothek (Net::Jabber::Bot) unterstützt.</p>
<p>Beim Befehl <em>hilfe</em> wird die Ausgabe der möglichen Befehle nun alphabetisch sortiert.</p>
<p>Eine Updatefunktion gibt es leider nicht. Da sich auch in der Konfigurationsdatei ein paar Änderungen ergeben haben, müssen alle Dateien ersetzt werden und die Daten erneut in die Konfigurationsdatei modules/Configs.pm eingefügt werden.</p>
<p>Die neue Version kann im ursprünglichen Artikel <a href="http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/" title="zBot - ein Jabber Bot in Perl" target="_self" class="liinternal">zBot &#8211; ein Jabber Bot in Perl</a> herunter geladen werden. Dort findet man auch weitere Informationen zum Bot.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/jabber-bot-zbot-in-version-02/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>zBot &#8211; ein Jabber Bot in Perl</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 19:55:36 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Interessante Programme]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Scripte]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=565</guid>
		<description><![CDATA[<p>(English version below)</p>
<p>Nachdem ich mich nun etwas mit <a href="http://zinformatik.de/allgemeines/jabber-die-offene-alternative-zu-icq-und-msn/" title="Jabber - die offene Alternative zu ICQ und MSN" target="_blank" class="liinternal">Jabber</a> beschäftigt habe, war es an der Zeit, einen eigenen Jabber Bot zu schreiben.</p>
<p>Ich hatte bereits einen ChatBot in Perl geschrieben, der in unserem http-Chat lief. Mit der CPAN Bibliothek <a href="http://search.cpan.org/~toddr/Net-Jabber-Bot-2.0.8/lib/Net/Jabber/Bot.pm" title="Jabber Bot CPAN Bibliothek" target="_blank" class="liexternal">Net::Jabber::Bot</a>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>(English version below)</p>
<p>Nachdem ich mich nun etwas mit <a href="http://zinformatik.de/allgemeines/jabber-die-offene-alternative-zu-icq-und-msn/" title="Jabber - die offene Alternative zu ICQ und MSN" target="_blank" class="liinternal">Jabber</a> beschäftigt habe, war es an der Zeit, einen eigenen Jabber Bot zu schreiben.</p>
<p>Ich hatte bereits einen ChatBot in Perl geschrieben, der in unserem http-Chat lief. Mit der CPAN Bibliothek <a href="http://search.cpan.org/~toddr/Net-Jabber-Bot-2.0.8/lib/Net/Jabber/Bot.pm" title="Jabber Bot CPAN Bibliothek" target="_blank" class="liexternal">Net::Jabber::Bot</a> lies sich daraus mit wenigen Handgriffen ein einfacher Jabber Bot basteln.</p>
<p>Der Bot ist noch nicht sehr ausgereift. Aber er funktioniert.</p>
<p>Der Bot hat ein Pluginsystem um einfach neue Funktionen hinzufügen zu können. Um neue Plugins zu schreiben am besten mal ins Helloworld Plugin schauen (plugins/Helloworld.pm). Wichtig ist, das Plugin mit der Funktion Plugins::registerPlugin zu registrieren. Das fertige Plugin kann man ins Verzeichnis &#8220;plugins&#8221; kopieren. Jeder Befehl ist ein Plugin.</p>
<p>zBot läuft im Multi User Chat (MUC) und man kann ihn genauso gut als Kontakt hinzufügen.</p>
<p>Die Installation ist recht einfach. Man legt einen neuen User für den Bot auf dem Server seiner Wahl an. Dann editiert man die Datei modules/Configs.pm entsprechend (Passwort, Username&#8230; setzen). Danach kann man (wenn das CPAN Modul installiert ist) die zbot.pl starten. Am besten natürlich auf einem Server, damit der Bot auch online ist, wenn man den PC ausschaltet. Den Prozess kann man direkt in den Hintergrund schieben um sich wieder abmelden zu können:</p>
<p>./zbot.pl &amp;</p>
<p>Nun kann man den Bot zu seiner Kontaktliste hinzufügen. Nach dem Start braucht der Bot 20 Sekunden zur Initialisierung, bis er antwortet.</p>
<p>Durch das Senden des Befehls &#8220;hilfe&#8221; werden alle Befehle angezeigt. Mit &#8220;hilfe &lt;befehl&gt;&#8221; bekommt man die Beschreibung des Plugins angezeigt (z.B. &#8220;hilfe helloworld&#8221;).</p>
<p>Das Programm habe ich unter der <a href="http://www.gnu.org/licenses/gpl-2.0.html" title="GPL" target="_blank" class="liexternal">GPL</a> veröffentlicht. Eine Dokumentation ist auch vorhanden.</p>
<p>Über Verbesserungen des Codes oder neue Plugins würde ich mich sehr freuen.</p>
<p>Bei Fragen oder Problemen kann man mich natürlich auch gerne anschreiben (oder einfach hier als Kommentar).</p>
<p><strong>Update</strong>: Das Problem mit den Sonderzeichen konnte ich lösen. Es lag daran, dass die Sonderzeichen in der CPAN Bibliothek durch einen regulären Ausdruck ausgefiltert wurden (der dazu gedacht war, nicht druckbare Zeichen auszufiltern). Daher habe ich die entsprechende Datei ins Verzeichnis &#8220;modules&#8221; kopiert, entsprechend editiert und von dort eingebunden.</p>
<p><strong>Update:</strong> Version 0.2 ist nun verfügbar. Informationen über die Änderungen findet man im <a href="http://zinformatik.de/tipps-tricks/interessante-programme/jabber-bot-zbot-in-version-02/" title="Jabber Bot zBot in Version 0.2" target="_self" class="liinternal">zugehörigen Blogeintrag</a>.</p>
<p><strong>[UPDATE]</strong> Es gibt ein Problem ab ejabberd Version 2.0.3, da diese eine digest-uri zur Verifikation des Clients erwartet. Die einzige Möglichkeit das Problem zu lösen besteht anscheinend darin, diese Verifikation im Quelltext abzuschalten und neu zu kompilieren. Mehr Infos gibt es in <a href="http://www.ejabberd.im/node/3545" tile="Forenthread zum digest-uri Problem" target="_blank" class="liexternal">diesem Forenthread</a> (englisch).</p>
<p>Des weiteren gibt es ein Problem mit manchen User- bzw. Domainnamen. Der Bot bricht dann mit der Meldung:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">Can't call method &quot;isa&quot; without a package or object reference at /usr/local/share/perl/5.8.8/Net/XMPP/Protocol.pm line 2471.</pre></div></div>

<p> ab. (Die Zeile kann variieren)<br />
Abhilfe schafft das entfernen des &#8220;problematischen&#8221; Users aus der Liste des Bots. Der User kann den Bot danach immer nocht nutzen (so weit mir berichtet wurde). Anscheinend tritt das Problem auf, wenn der Username mit einer Ziffer beginnt (oder eine Ziffer enthält, das weis ich nicht).<br />
Vielen Dank an Daniel für die Hinweise und die Hilfe bei der Fehlersuche <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <strong>[/UPDATE]</strong></p>
<p><strong>[UPDATE]</strong>Ich habe den Bot jetzt mal auf GitHub hochgeladen: <a href="http://github.com/zimon/zBot" target="_blank" class="liexternal">http://github.com/zimon/zBot</a>. In der dortigen Version ist er auch an die neue Version von Net::Jabber::Bot angepasst. Leider funktionieren dadurch einige Plugins nicht mehr richtig, aber ich habe im Moment keine Zeit sie zu fixen. Vielleicht hat ja jemand Lust zu forken <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong>[/UPDATE]</strong></p>
<p><span>Man kann den Bot gerne testen, indem man ihn zu seiner Kontaktliste hinzufügt: <a href="mailto:bruno@jey-key.de" class="linkifyplus">bruno@jey-key.de</a></span></p>
<p><span>Die Dokumentation ist nun auch online Verfügbar: <a href="http://zinformatik.de/zbotdoc/index.html" title="Dokumentation zBot Version 0.2" target="_blank" class="liinternal">Dokumenation Version 0.2</a><br />
</span></p>
<p><strong>Dateien</strong></p>
<ul>
<li><a href="http://zinformatik.de/wp-content/uploads/2009/02/zbot_02.zip" class="lizip">zbot_0.2.zip</a> &#8211; Das Programm (the program)</li>
<li><a href="http://zinformatik.de/wp-content/uploads/2009/02/zbot_02_doc.zip" class="lizip">zbot_0.2_doc.zip</a> &#8211; Die Dokumentation (the documentation)</li>
</ul>
<p><strong>Plugins</strong></p>
<ul>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/chatbot-plugin-fur-den-zbot/" title="Chatbot Plugin für den zBot" target="_blank" class="liinternal">Chatbot Plugin</a> &#8211; erweitert den zBot um die Möglichkeit &#8220;Unterhaltungen&#8221; mit dem Bot zu führen.</li>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/wikipedia-plugin-fur-den-zbot/" title="Wikipedia Plugin für den zBot" target="_blank" class="liinternal">Wikipedia Plugin</a> &#8211; fügt den Befehl &#8220;wiki&#8221; hinzu, mit dem die Definition (der erste Abschnitt des Artikels) zu einem Begriff angezeigt werden kann.</li>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/leo-dictionary-englisch-deutsch-ubersetzungs-plugin-fur-den-zbot/" title="Leo Übersetzungsplugin (Englisch &lt;-&gt; Deutsch) für den zBot" target="_self" class="liinternal">Leo Dictionary Plugin</a> &#8211; Deutsch &lt;-&gt; Englisch Übersetzungsplugin</li>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/wetter-plugin-fur-den-zbot/" title="Wetter Plugin für den zBot" target="_self" class="liinternal">Wetter Plugin</a> &#8211; macht eine Wettervorhersage für eine angegebene Postleitzahl</li>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/todo-plugin-fur-den-zbot/" title="Todo Plugin für den zBot" target="_self" class="liinternal">Todo Plugin</a> &#8211; verwaltet für jeden User eine Todoliste mittels <a href="http://todotxt.com" title="Todo.sh Homepage" target="_blank" class="liexternal">todo.sh</a></li>
<li><a href="http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/whois-plugin-fur-den-zbot/" title="Whois Plugin für den zBot" target="_self" class="liinternal">Whois Plugin</a> &#8211; Macht eine Whois-Abfrage zu einer gewünschten Domain und liefert das Ergebnis zurück.</li>
</ul>
<p><span style="color: #ffffff;">.</span></p>
<p><strong>English</strong></p>
<p>Here is my Jabber Bot &#8220;zBot&#8221; written in Perl using the CPAN Module <a href="http://search.cpan.org/~toddr/Net-Jabber-Bot-2.0.8/lib/Net/Jabber/Bot.pm" title="Jabber Bot CPAN Library" target="_blank" class="liexternal">Net::Jabber::Bot</a>.</p>
<p>It is easily extendable with plugins. If you want to write a plugin just look at the modules/Helloworld.pm (I commented this example Plugin better than the other ones). Its important to register your Plugin by calling the function Plugins::registerPlugin in your module. When it&#8217;s finished just copy it to the plugins directory. Every command is a plugin.</p>
<p>zBot runs in multi user chats (MUC) and you can add it to your contact list.</p>
<p>I started writing the bot yesterday, so it is not tested well but it works.</p>
<p>To install and start the bot, register a new account for the bot. Then edit the modules/Configs.pm to your needs (password, username,&#8230;) and start the zbot.pl (don&#8217;t forget to install the CPAN module first). It&#8217;s a good idea to start it on a server with</p>
<p>./zbot &amp;</p>
<p>so it stays online when you shut down your own computer. Now you can add the bot to your contact list. After the start the bot needs 20 seconds for initializing before it answers.</p>
<p>By sending &#8220;hilfe&#8221; to the bot it sends a list of available commands. With &#8220;hilfe &lt;command&gt;&#8221; you get the description of the plugin (for example: &#8220;hilfe helloworld&#8221;).</p>
<p>The bot is licenced under <a href="http://www.gnu.org/licenses/gpl-2.0.html" title="GPL" target="_blank" class="liexternal">GPL</a>. An english documentation is available.</p>
<p>All strings in the Code are in german language but the comments and documentation is english. I wrote an english translation as comment after (or below) each string, so it should be easy to translate.</p>
<p>It would be grate if you send me your plugins and enhancements of the code if you create some.</p>
<p><strong>[UPDATE]</strong>I have uploaded the bot on GitHub: <a href="http://github.com/zimon/zBot" target="_blank" class="liexternal">http://github.com/zimon/zBot</a>. There it is adapted to the new Net::Jabber::Bot version. By doing this some of the Plugins broke and I don&#8217;t have time to fix them. Maybe someone wants to fork it <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong>[/UPDATE]</strong></p>
<p>For questions or problems you may contact me.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

