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

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

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

<item>
    <title>Richtige Verwendung von select()</title>
    <link>http://blog.slash-me.net/archives/376-Richtige-Verwendung-von-select.html</link>
            <category>Linux</category>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/376-Richtige-Verwendung-von-select.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=376</wfw:comment>

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

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

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

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

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

    <pubDate>Fri, 22 Apr 2011 09:41:00 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/372-guid.html</guid>
    
</item>
<item>
    <title>Neues yeanpypa-Release</title>
    <link>http://blog.slash-me.net/archives/359-Neues-yeanpypa-Release.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/359-Neues-yeanpypa-Release.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=359</wfw:comment>

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

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

    <pubDate>Sat, 01 May 2010 13:43:16 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/359-guid.html</guid>
    
</item>
<item>
    <title>State-Machine-Bibliothek für Java</title>
    <link>http://blog.slash-me.net/archives/347-State-Machine-Bibliothek-fuer-Java.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/347-State-Machine-Bibliothek-fuer-Java.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=347</wfw:comment>

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

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

    <pubDate>Thu, 15 Oct 2009 23:12:44 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/347-guid.html</guid>
    
</item>
<item>
    <title>Eclipse ohne Code Completion</title>
    <link>http://blog.slash-me.net/archives/297-Eclipse-ohne-Code-Completion.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/297-Eclipse-ohne-Code-Completion.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=297</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;http://www.eclipse.org&quot;&gt;Eclipse&lt;/a&gt; ist ja auch gerade wegen der Code Completion &lt;em&gt;die&lt;/em&gt; Java-IDE. Blöd nur, wenn die nicht tut. Wenn weder nach Eingabe eines Punktes noch nach &lt;tt&gt;Strg+Space&lt;/tt&gt; die erwartete Vervollständigung kommt, sondern stattdessen in der Statusleiste nur &quot;No completions available&quot; erscheint, dann hat man unter Umständen in den Projekteinstellungen oder in den generellen Einstellungen für den Java-Editor (unter Window-&amp;gt;Preferences: Java-&amp;gt;Editor-&amp;gt;Content Assist-&amp;gt;Advanced) die Vervollständigung verkonfiguriert. Im Zweifelsfall einfach in beiden Listen alle Einträge aktivieren (die obere Liste ist das, was im normalen Assitententenpopup hochploppt, die untere das, wo man mit Strg+Space durchschalten kann). Aus irgendeinem Grund war das bei mir verpfriemelt (ich hab ja das JBoss-Plugin in Verdacht, kann ihm aber nix nachweisen *grml*) und ich hatte daher keine Code-Completion mehr. Naja, wieder mal was gelernt und gestandene Eclipser zum Rätseln gebracht.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 12 Feb 2009 21:17:15 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/297-guid.html</guid>
    
</item>
<item>
    <title>Pylons und Elixir + Session-Handling</title>
    <link>http://blog.slash-me.net/archives/292-Pylons-und-Elixir-+-Session-Handling.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/292-Pylons-und-Elixir-+-Session-Handling.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=292</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Wer mal entspannt Webapplikationen entwickeln will/muss, dem sei &lt;a href=&quot;http://pylonshq.com/&quot;&gt;Pylons&lt;/a&gt; ans Herz gelegt. Nettes Framework, noch einige kleinere Ecken, aber schonmal sehr angenehm zum Entwickeln geeignet. Meist liegt hinter einer Webapplikation ja ein entsprechendes Datenmodell in Form einer Datenbank. Um die bequem ansteuern zu können (SQL von Hand zu coden ist mittlerweile definitiv nicht mehr schön) bringt Pylons eine Integration für &lt;a href=&quot;http://www.sqlalchemy.org/&quot;&gt;SQLAlchemy&lt;/a&gt; mit. Nun ist SQLAlchemy flexibel und mächtig, dafür aber manchmal etwas komplexer als nötig. Für viele Anwendungsfälle reichen die Möglichkeiten, die &lt;a href=&quot;http://elixir.ematia.de/&quot;&gt;Elixir&lt;/a&gt; mitbringt (Elixir ist eine auf SQLAlchemy aufsetzende Bibliothek, die einen deklarativen Stil zur Erstellung des Datenmodells ermöglicht). Mit diesem Trio kann man schonmal recht viel Interessantes tun.&lt;/p&gt;
&lt;p&gt;Blöd nur, wenn man ein wenig faul bei der Einbindung der verschiedenen Module ist. Dann kann es nämlich dazu kommen, dass plötzlich folgende Fehlermeldung auftritt, wenn man versucht was in der Nutzersession im Pylons zu speichern:&lt;/p&gt;
&lt;pre&gt;TypeError: &#039;ScopedSession&#039; object is unsubscriptable&lt;/pre&gt;
&lt;p&gt;Der Datentyp deutet es an: das &lt;tt&gt;session&lt;/tt&gt;-Objekt von Pylons ist unter diesem Namen nicht verfügbar. Der Fehler ist simpel: im Datenmodell der Applikation stand mal &lt;tt&gt;from elixir import *&lt;/tt&gt; (um Schreibarbeit bei den Elixir-Datentypen zu sparen). Im Controller wiederum wurde das Datenmodell mit &lt;tt&gt;from app.model import *&lt;/tt&gt; importiert. Tja... Elixir definiert dummerweise ein eigenes &lt;tt&gt;session&lt;/tt&gt;-Objekt, welches durch diese Import-Kette in den Namensraum der Applikation gerät und dort dann das eigentliche Pylons-Objekt überschreibt.&lt;/p&gt;
&lt;p&gt;Als Lösung bleiben drei Möglichkeiten: man kann den Import im Datenmodell in &lt;tt&gt;import elixir&lt;/tt&gt; ändern und allen Datentypen ein &lt;tt&gt;elixir.&lt;/tt&gt; voransetzen, die benötigten Elixirtypen mittels &lt;tt&gt;from elixir import Field, ....&lt;/tt&gt; im Datenmodell importieren (und dabei keinesfalls &lt;tt&gt;session&lt;/tt&gt; mit reinnehmen) oder in der Applikation das Datenmodell mittels &lt;tt&gt;import app.model as m&lt;/tt&gt; und dann jedem Zugriff auf Elemente des Modells ein &lt;tt&gt;m.&lt;/tt&gt; voranstellen. Danach hat man wieder wie gewünscht Zugriff auf seine Session und kann Daten darin speichern und daraus lesen.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 18 Nov 2008 22:11:57 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/292-guid.html</guid>
    
</item>
<item>
    <title>QWidget auf minimal notwendige Größe bringen</title>
    <link>http://blog.slash-me.net/archives/287-QWidget-auf-minimal-notwendige-Groesse-bringen.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/287-QWidget-auf-minimal-notwendige-Groesse-bringen.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=287</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p style=&quot;text-decoration: line-through&quot;&gt;Manchmal kann man sich auch einen Wolf suchen. Ziel war: ein Widget in dem sich mehrere Children befinden (QLineEdit, Checkboxen, QTableView) immer auf die minimal notwendige Größe zu bringen. Das gilt speziell dann, wenn der QTableView unsichtbar wird. Mit etwas um die Ecke denken geht&#039;s: &lt;tt&gt;widget-&gt;setMaximumHeight(0)&lt;/tt&gt;. (Im dem Fall ging es nur um die Höhe). Muss man erstmal drauf kommen...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Unsinn gelöscht. Man schaue sich mal QWidget::adjustSize() an...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 20 Oct 2008 20:06:24 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/287-guid.html</guid>
    
</item>
<item>
    <title>PyQt4 und QAbstractItemView</title>
    <link>http://blog.slash-me.net/archives/280-PyQt4-und-QAbstractItemView.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/280-PyQt4-und-QAbstractItemView.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=280</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Nach zweitägiger Suche: Python und QT können manchmal sehr hässlich zusammenstoßen, wenn es um die Lebensdauer von Objekten geht. Folgender Code:&lt;/p&gt;
&lt;pre style=&quot;border: 1px solid black; padding: 1em 1em 1em 1em&quot;&gt;
class MainWindow(QMainWindow):
    [...]
    def initTreeView(self, top_level_cats):
        model = CategoryModel(top_level_cats)
        self.treeview.setModel(model)
    [...]
&lt;/pre&gt;
&lt;p&gt;Sieht an sich erstmal unverdächtig aus: ein Model wird erzeugt (wie auch immer geartet) und dem &lt;code&gt;QTreeView&lt;/code&gt; als Model übergeben. Scheint alles wunderbar, bis man es ausführt. Aus irgendeinem Grund bleibt der &lt;code&gt;QTreeView&lt;/code&gt; grundsätzlich leer. Es werden zwar von dem Model unter Umständen noch einige Funktionen aufgerufen (in meinem speziellen Fall waren das &lt;code&gt;headerData()&lt;/code&gt; und &lt;code&gt;columnCount()&lt;/code&gt;. Keine Ahnung, ob das immer so ist), aber die eigentlich Daten werden nie dargestellt. Soweit, so schlecht.&lt;/p&gt;
&lt;p&gt;Ein winzig kleine Änderung des Codes bringt die Lösung. Hier &lt;em&gt;fast&lt;/em&gt; die gleiche Funktion:&lt;/p&gt;
&lt;pre style=&quot;border: 1px solid black; padding: 1em 1em 1em 1em&quot;&gt;
class MainWindow(QMainWindow):
    [...]
    def initTreeView(self, top_level_cats):
        self.model = CategoryModel(top_level_cats)
        self.treeview.setModel(self.model)
    [...]
&lt;/pre&gt;
&lt;p&gt;Der einzige Unterschied: statt einer lokalen Variable ist &lt;code&gt;model&lt;/code&gt; nun ein Feld der umgebenden Klasse. Und siehe da: plötzlich funktioniert es. Wie kommt&#039;s? (Fast) ganz einfach: man &lt;em&gt;könnte&lt;/em&gt; zwar annehmen, dass &lt;code&gt;self.treeview.setModel(...)&lt;/code&gt; sich das Model irgendwie speichert, wenn es noch benötigt wird, aber das scheint nicht der Fall zu sein. Anscheinend werden die entsprechenden Aufrufe nur von der dünnen Schicht von PyQt4 an die zugrundeliegende QT-Bibliothek durchgereicht und die entsprechenden Pythonobjekte dann nicht weiter beachtet. Am Ende der Funktion geht das Element im ersten Fall out-of-scope und wird dann irgendwann mal vernichtet. Blöd nur, wenn QT dann bei der Darstellung des Views plötzlich was von dem Model will, dessen Objekt zu dem Zeitpunkt nicht mehr existiert. Weißt man es hingegen einem Feld in der umgebenden Klasse (zum Beispiel dem Fenster) zu, so existiert es so lang, bis dieses vernichtet wird (und damit auch sein View). Dann kann die QT natürlich nach Herzenslust nach den Daten des Views fragen und wird immer auf unserem Model-Objekt landen, wie das gewünscht ist.&lt;/p&gt;
&lt;p&gt;Eigentlich logisch. Wenn man&#039;s einmal weiß...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 28 Aug 2008 23:12:26 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/280-guid.html</guid>
    
</item>
<item>
    <title>Eclipse Ganymede und Subversion</title>
    <link>http://blog.slash-me.net/archives/279-Eclipse-Ganymede-und-Subversion.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/279-Eclipse-Ganymede-und-Subversion.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=279</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Der Titel sagt es schon: es geht um &lt;a href=&quot;http://www.eclipse.org&quot;&gt;Eclipse Ganymede&lt;/a&gt; und &lt;a href=&quot;http://subversion.tigris.org&quot;&gt;Subversion&lt;/a&gt;. Beides meiner Meinung fantastische Tools zur Softwareentwicklung, in Kombination allerdings gerade etwas zickig. Das Problem: bei Eclipse Europa (3.3) wurde meist für die Subversion-Integration das Plugin &lt;a href=&quot;http://subclipse.tigris.org/&quot;&gt;Subclipse&lt;/a&gt; verwendet. Für Ganymede (3.4) gibt&#039;s das allerdings noch nicht. Dafür gibt es ein neues Plugin direkt im Ganymede-Repository: &lt;a href=&quot;http://www.eclipse.org/subversive/&quot;&gt;Subversive&lt;/a&gt;. Dieses Plugin soll wohl bald standardmäßig in Eclipse integriert werden. Es ist quasi deckungsgleich mit dem schon bestehenden CVS-Plugin und integriert sich sehr gut in die Oberfläche.&lt;/p&gt;
&lt;p&gt;So schick das Plugin ist: mir scheint, die Eclipse-Jungs und -Mädels haben bei der Zusammenstellung von Ganymede gepennt. Dummerweise ist nämlich der eigentliche Team-Provider integriert, die Library zum Zugriff auf die SVN-Repositories allerdings nicht. Die darf man sich zu Fuß nachinstallieren. Dabei darf man sich dann auch noch entscheiden, welche man nimmt. Ich hab mich letztlich für &lt;a href=&quot;http://svnkit.com/&quot;&gt;SVNKit&lt;/a&gt; entschieden, weil mir die Idee gefällt, allen Kram gleich in Java abzuwickeln, statt externe Libs einbinden zu müssen. Dummerweise begrüßt mich mein Eclipse bei der Installation von SVNKit mit folgenden Zeilen:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;Cannot find a solution where both Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.1.I20080612-1500,0.7.1.I20080612-1500]] and Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0)] can be satisfied.
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0)
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0)
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Ja, diese Fehlermeldung ist auch im Original so unlesbar. Nach längerem Suchen bin ich in einem &lt;a href=&quot;http://blog.punchbarrel.com/2008/06/30/using-the-new-subversion-integration-in-eclipse-ganymede/&quot;&gt;Blog&lt;/a&gt; auf die Lösung gestoßen: Seit 3. August möchte SVNKit eine neuere Version von Subversive haben (oder andersrum, so 100% schlau bin ich noch nicht draus geworden). Die ist dummerweise nicht in den Ganymede-Repositories, sondern muss unter &lt;a href=&quot;http://download.eclipse.org/technology/subversive/0.7/update-site/&quot;&gt;http://download.eclipse.org/technology/subversive/0.7/update-site/&lt;/a&gt; extra bezogen werden. Diese URL packt man in die Update-Site, muss sie dann noch einmalig via &quot;Manage Sites...&quot; aktivieren und schon kann man sich ein neueres Subversive installieren, was dann auch mit SVNKit spielen mag. Schade, dass die Standardintegration in Ganymede so kaputt ist. Bis zum Nachfolger dauert es ja doch ein wenig und bis dahin sind wahrscheinlich schon einige an Subversion und Eclipse verzweifelt und benutzen glatt wieder CVS *brrrr*...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Wie Deka in den Kommentaren angemerkt hat scheint es mit Subclipse 1.4 wohl doch einen Release für Ganymede zu geben.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 24 Aug 2008 20:08:14 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/279-guid.html</guid>
    
</item>
<item>
    <title>Installation von Cheetah auf Ubuntu</title>
    <link>http://blog.slash-me.net/archives/204-Installation-von-Cheetah-auf-Ubuntu.html</link>
            <category>Linux</category>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/204-Installation-von-Cheetah-auf-Ubuntu.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=204</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Installiert man &lt;a href=&quot;http://pylonshq.com/docs/0.9.4.1/install.html&quot;&gt;Pylons nach Anleitung&lt;/a&gt; mittels &lt;tt&gt;easy_install&lt;/tt&gt; auf einem Ubuntu Feisty Fawn, dann bricht der Compilerlauf von Cheetah (welches als Abhängigkeit mit installiert wird) unter Umständen irgendwann mit folgender Meldung ab:&lt;/p&gt;
&lt;blockquote&gt;&lt;tt&gt;src/_namemapper.c:15:58: error: Python.h: No such file or directory&lt;/tt&gt;&lt;/blockquote&gt;
&lt;p&gt;Das liegt daran, daß die passenden Headerfiles nicht in &lt;tt&gt;/usr/include/&lt;/tt&gt; liegen, sondern in &lt;tt&gt;/usr/include/python2.5&lt;/tt&gt; (bspw.), wo sie natürlich vom Compiler erstmal nicht gefunden werden. Ein&lt;/p&gt;
&lt;blockquote&gt;&lt;tt&gt;CFLAGS=&#039;-I/usr/include/python2.5&#039; easy_install Pylons&lt;/tt&gt;&lt;/blockquote&gt;
&lt;p&gt;behebt das Problem.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 04 Mar 2007 11:29:59 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/204-guid.html</guid>
    
</item>
<item>
    <title>Geek-Witze</title>
    <link>http://blog.slash-me.net/archives/201-Geek-Witze.html</link>
            <category>Computer</category>
            <category>Fundstücke</category>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/201-Geek-Witze.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=201</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Grad von &lt;a href=&quot;http://www.ahzf.de/&quot;&gt;Achim&lt;/a&gt; geschickt bekommen: &lt;a href=&quot;http://xkcd.com/c221.html&quot;&gt;Random Number&lt;/a&gt;. Wer&#039;s nicht versteht: macht nix. Ich find&#039;s lustig. :)&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 16 Feb 2007 14:21:19 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/201-guid.html</guid>
    
</item>
<item>
    <title>Recursive-descent Parser in Python</title>
    <link>http://blog.slash-me.net/archives/199-Recursive-descent-Parser-in-Python.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/199-Recursive-descent-Parser-in-Python.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=199</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Ich hatte mal wieder etwas Langeweile und wollte ein wenig mehr &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt; lernen. Also hab ich mich mal damit beschäftigt, wie das mit Parsing in Python so aussieht. Ich bin ja in C++ von &lt;a href=&quot;http://www.boost.org/libs/spirit/index.html&quot;&gt;boost::Spirit&lt;/a&gt; recht angetan und hab sowas ähnliches für Python gesucht. Das, was dem noch am nächsten kommt, ist &lt;a href=&quot;http://pyparsing.sourceforge.net/&quot;&gt;pyparsing&lt;/a&gt;. Leider hat dieses einen gravierenden (aus meiner Sicht) Nachteil: es scheint nicht möglich zu sein, den Parser dazu zu bringen, Whitespaces &lt;em&gt;NICHT&lt;/em&gt; zu ignorieren. Dummerweise brauchte ich das aber für die selbstgestellte Aufgabe an einigen Stellen...&lt;/p&gt;
&lt;p&gt;Wie der geneigte Informatiker dann so ist, schreibt er sich den Kram halt selbst und lernt noch was dabei. Rausgekommen ist yeanpypa (bevor einer fragt: YEt ANother PYthon PArser framework. Hat da wer gelacht?!), ein kleines Framework, mit dem sich eine EBNF-Grammatik fast 1:1 in Python-Code übertragen läßt. Die Schnittstelle ist zum Teil bei pyparsing und zum Teil bei boost::Spirit abgeschaut. Das ganze dürfte noch einige Fehler haben, aber erscheint mir bisher schon ganz brauchbar. Der Code steht &lt;a href=&quot;http://blog.slash-me.net/index.php?/archives/66-Template-Spielereien-die-Zweite.html&quot;&gt;wieder mal&lt;/a&gt; unter einer public domain Lizenz, kann also vollkommen frei verwendet werden. Natürlich freue ich mich über eine kurze Nachricht, wenn jemand damit irgendwas tut.
&lt;/p&gt;
&lt;p&gt;So, zuguterletzt noch die passenden Links:&lt;br/&gt;
&lt;a href=&quot;https://vcs.slash-me.net/snippets/yeanpypa/&quot;&gt;Download&lt;/a&gt; (yeanpypa.py runterladen)&lt;br/&gt;
&lt;a href=&quot;http://www.slash-me.net/dev/snippets/yeanpypa/documentation.html&quot;&gt;Einführende Doku (Englisch)&lt;/a&gt;. Leider alles andere als vollständig. Vielleicht irgendwann mehr...&lt;br/&gt;
&lt;a href=&quot;http://www.slash-me.net/dev/snippets/yeanpypa/&quot;&gt;Vollständige API-Doku&lt;/a&gt;. Generiert mit &lt;a href=&quot;http://epydoc.sourceforge.net/&quot;&gt;Epydoc&lt;/a&gt;.
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 10 Feb 2007 17:41:39 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/199-guid.html</guid>
    
</item>
<item>
    <title>Secure Networking</title>
    <link>http://blog.slash-me.net/archives/195-Secure-Networking.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/195-Secure-Networking.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=195</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Nachdem ich heute seit langer Zeit mal wieder im &lt;a href=&quot;http://www.andreas.org/blog/&quot;&gt;Blog&lt;/a&gt; von Andreas Bogk gestöbert hab, bin ich über ein &lt;a href=&quot;http://www.opendylan.org/~hannes/secure-networking.pdf&quot;&gt;sehr interessantes Paper&lt;/a&gt; von ihm und Hannes Mehnert zum Thema &quot;Secure Networking&quot; gestolpert. Grob gesagt isses zwar (natürlich) wieder eins der Dylan-Propagandapaper (er mag die Sprache halt wirklich), aber dieses ist echt sehr nett. Ich hoffe doch, daß das Framework, was sie da vorstellen, sich weiterentwickelt.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 28 Nov 2006 21:20:22 +0100</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/195-guid.html</guid>
    
</item>
<item>
    <title>In den Fuß schießen mit C++</title>
    <link>http://blog.slash-me.net/archives/169-In-den-Fuss-schiessen-mit-C++.html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/169-In-den-Fuss-schiessen-mit-C++.html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=169</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    &lt;p&gt;Die letzten drei Tage hab ich einen Fehler aus der Kategorie &quot;In den Fuß schießen mit C++&quot; gesucht. Da gibt man sich nun schon alle Mühe, verwendet die gut getesteten Datenstrukturen der STL und trotzdem grinst einen ein ums andere Mal ein Segmentation Fault an. *gnaa*&lt;/p&gt;
&lt;p&gt;Folgender Code (vereinfacht, das Original ist in eine Klasse eingebettet):&lt;/p&gt;
&lt;pre style=&quot;border-width: 1px; border-style: solid; border-color: #000000; margin-left: 1em; margin-right: 1em; padding: 1em 1em 1em 1em;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;list&amp;gt;

std::list&amp;lt;int&amp;gt; bla;

std::list&amp;lt;int&amp;gt; const getBla() {
        return bla;
}

int main() {
        bla.push_back(10);
        for (std::list&amp;lt;int&amp;gt;::const_iterator i=getBla().begin(); i!=getBla().end(); ++i) {
                std::cerr &lt;&lt; *i &lt;&lt; std::endl;
        }
}
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;getBla()&lt;/em&gt; ist im Original ein Getter für ein Klassenmember. Eigentlich ein gängiges Konstrukt. Der Crash passiert in der Schleife bei der Dereferenzierung des Iterators &lt;em&gt;i&lt;/em&gt;. (Im Original war das etwas komplizierter, aber das ist hier nebensächlich.). Nach einigem Rumprobieren stelle ich fest, daß die Schleife zweimal durchlaufen wird, obwohl bla ja eigentlich nur ein Element enthält. Die Dereferenzierung des Iterators knallt im zweiten Durchlauf der Schleife (logisch, der zeigt dann ja irgendwo ins Nirvana).&lt;/p&gt;
&lt;p&gt;Die Ursache des Fehlers liegt in einem fehlenden Zeichen in der Deklaration von &lt;em&gt;getBla()&lt;/em&gt;. Eigentlich müßte das wie folgt aussehen (der Unterschied ist der Einfachheit halber rot markiert):&lt;/p&gt;
&lt;pre style=&quot;border-width: 1px; border-style: solid; border-color: #000000; margin-left: 1em; margin-right: 1em; padding: 1em 1em 1em 1em;&quot;&gt;
[...]
std::list&amp;lt;int&amp;gt; const &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;amp;&lt;/span&gt;getBla() {
[...]
&lt;/pre&gt;
&lt;p&gt;Standardmäßig übergibt C++ Parameter und Rückgabewerte &lt;em&gt;by value&lt;/em&gt;, d.h. es wird eine Kopie des Wertes auf dem Stack gemacht. Das ganze ist von C geerbt. Mit der Einführung von abstrakten Datentypen kann so eine Kopie natürlich richtig teuer werden, weswegen zusätzlich die Möglichkeit der Übergabe &lt;em&gt;by reference&lt;/em&gt; eingeführt wurde. Gekennzeichnet wird solch eine Referenz durch ein &amp;amp; hinter dem Datentyp. Dann wird eben statt der Kopie nur ein Verweis übergeben. Kann ungeheuer Zeit und Speicherplatz sparen.&lt;/p&gt;
&lt;p&gt;Wie führt das nun in dem Code zum Crash? Nun dafür muss man sich mal den Kopf der &lt;em&gt;for&lt;/em&gt;-Schleife näher anschauen:&lt;/p&gt;
&lt;pre style=&quot;border-width: 1px; border-style: solid; border-color: #000000; margin-left: 1em; margin-right: 1em; padding: 1em 1em 1em 1em;&quot;&gt;
[...]
        for (std::list&amp;lt;int&amp;gt;::const_iterator &lt;span style=&quot;color: #FF0000;&quot;&gt;i=getBla().begin()&lt;/span&gt;; &lt;span style=&quot;color: #0000FF;&quot;&gt;i!=getBla().end()&lt;/span&gt;; ++i) {
[...]
&lt;/pre&gt;
&lt;p&gt;Im rot markierten Teil wird der Iterator &lt;em&gt;i&lt;/em&gt; initialisiert und zeigt auf das erste Element der von &lt;em&gt;getBla()&lt;/em&gt; zurückgelieferten Liste &amp;ndash; einer Kopie der Originalliste, die durch die Rückgabe angefertigt wird. Im blau markierten Teil wird der Iterator vor jedem Schleifendurchlauf mit dem Endezeiger der von &lt;em&gt;getBla()&lt;/em&gt; zurückgelieferten Liste verglichen &amp;ndash; einer &lt;em&gt;anderen&lt;/em&gt; Kopie, die ebenfalls wieder durch die Rückgabe &lt;em&gt;by value&lt;/em&gt; entsteht. Nun, da der Iterator ursprünglich von der ersten Kopie an hochzählt, kann er nie den Endezeiger der zweiten erreichen, der komplett woanders liegt. Also bricht die Schleife nicht ab, wie es korrekt wäre, sondern läuft ein zweites mal durch. Durch das Hochzählen zeigt der Iterator nun hinter das Ende der ersten Kopie, per Definition also ins Nichts. *BUMM*&lt;/p&gt;
&lt;p&gt;Ändert man den Rückgabetype von &lt;em&gt;getBla()&lt;/em&gt; auf eine Referenz, so bekommt man bei jedem Aufruf dieselbe Liste (nämlich &lt;em&gt;bla&lt;/em&gt; selbst). Und siehe da, dann funktioniert&#039;s! Also merke: &lt;em&gt;Der Rückgabewert eines Getters ist grundsätzlich eine konstante Referenz!&lt;/em&gt;*grmpf* (Konstant übrigens deswegen, damit einem nicht irgendein Genie plötzlich die eigenen Daten unterm Hintern wegändert.)&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 18 Jul 2006 15:00:00 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/169-guid.html</guid>
    
</item>
<item>
    <title>Inline-Doku at its best...</title>
    <link>http://blog.slash-me.net/archives/155-Inline-Doku-at-its-best....html</link>
            <category>Programmieren</category>
    
    <comments>http://blog.slash-me.net/archives/155-Inline-Doku-at-its-best....html#comments</comments>
    <wfw:comment>http://blog.slash-me.net/wfwcomment.php?cid=155</wfw:comment>

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

    <author>nospam@example.com (namenlos)</author>
    <content:encoded>
    
&lt;p&gt;Ein besonders schönes Stück Dokumentation aus einem Codestück, an dem ich gerade sitze:&lt;/p&gt;
&lt;pre style=&quot;border-style: solid; border-width: 1px;&quot;&gt;/*---------------------------------------------------------------------------*/&lt;br /&gt;/*     FUNCTION: &amp;lt;function&amp;gt;&lt;br /&gt; */&lt;br /&gt;/*!    @brief    &amp;lt;short&amp;gt;&lt;br /&gt; *&lt;br /&gt; *               &amp;lt;detailed&amp;gt;&lt;br /&gt; *&lt;br /&gt; *     @param    &amp;lt;parmetername&amp;gt; [IN:|OUT:|INOUT:] &amp;lt;description&amp;gt; [range: x .. y] &lt;br /&gt; *     @param    &amp;lt;parmetername&amp;gt; [IN:|OUT:|INOUT:] &amp;lt;description&amp;gt; [range: x .. y]&lt;br /&gt; *     @returns  &amp;lt;description&amp;gt;&lt;br /&gt; * &lt;br /&gt; *     @pre      &amp;lt;contractual&amp;gt;&lt;br /&gt; *     @post     &amp;lt;contractual&amp;gt;&lt;br /&gt; *&lt;br /&gt; *     @warning  &amp;lt;warning&amp;gt;&lt;br /&gt; *     @todo     &amp;lt;features&amp;gt;&lt;br /&gt; *//*------------------------------------------------------------------------*/&lt;/pre&gt;
&lt;p&gt;Nein, er ist übrigens nicht von &lt;a href=&quot;http://www.3soft.de&quot;&gt;uns&lt;/a&gt;.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 31 Mar 2006 15:54:15 +0200</pubDate>
    <guid isPermaLink="false">http://blog.slash-me.net/archives/155-guid.html</guid>
    
</item>

</channel>
</rss>