<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:ymaps="http://api.maps.yahoo.com/Maps/V2/AnnotatedMaps.xsd">

<channel>
	<title>Automatische Informationen &#187; python</title>
	<atom:link href="http://blog.automatische-informationen.de/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.automatische-informationen.de</link>
	<description>Softwareentwicklung, Projektmanagement, Hochschule und mehr</description>
	<lastBuildDate>Fri, 06 Aug 2010 13:14:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Twacbak, OAuth und Tweepy</title>
		<link>http://blog.automatische-informationen.de/2010/06/01/twacbak-oauth-und-tweepy/</link>
		<comments>http://blog.automatische-informationen.de/2010/06/01/twacbak-oauth-und-tweepy/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 20:29:54 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Twacbak]]></category>
		<category><![CDATA[Tweepy]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Wartung]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=513</guid>
		<description><![CDATA[Meine kleine Datensicherungssoftware für Twitter, Twacbak muss dringend aktualisiert werden: die Benutzerauthentifizierung mittels Name und Kennwort (&#8220;Basic Authentication&#8221;) wird zum 30.06.2010 abgeschaltet. Statt dessen soll das OAuth-Protokoll verwendet werden, bei dem Name und Kennwort nur durch Twitter selbst verwaltet werden und Benutzer einzelnen Anwendungen das Recht geben, auf ihre Daten bei Twitter zuzugreifen. An sich [...]]]></description>
			<content:encoded><![CDATA[<p>Meine kleine Datensicherungssoftware für Twitter, <a href="https://sourceforge.net/projects/twacbak/">Twacbak</a> muss dringend aktualisiert werden: die Benutzerauthentifizierung mittels Name und Kennwort (&#8220;Basic Authentication&#8221;) wird zum 30.06.2010 abgeschaltet. Statt dessen soll das <a href="http://oauth.net/">OAuth</a>-Protokoll verwendet werden, bei dem Name und Kennwort nur durch Twitter selbst verwaltet werden und Benutzer einzelnen Anwendungen das Recht geben, auf ihre Daten bei Twitter zuzugreifen. An sich eine gute Idee, da keine Kennworte mehr bei externen Anwendungen gespeichert werden.</p>
<p>Twacbak nutzt noch das bisherige Verfahren, bei dem über HTTP <a href="http://tools.ietf.org/html/rfc2617">Basic Authentication</a> Name und Kennwort mittels <a href="http://de.wikipedia.org/wiki/Base64">Base64</a> verscheiert übertragen werden. Dabei beruhigt höchstens die mögliche Übertragung per SSL. Das Modul zur direkten Kommunikation habe ich nicht selbst entwickelt. Statt dessen passte ich die <a href="http://mike.verdone.ca/twitter/">Python Twitter Tools</a> (PTT) an meine Bedüfnisse an.</p>
<p>Der 30.06.2010 näherte sich, besonders letzte Woche. Der Author der PTT scheint gerade OAuth zu implementieren, aber ob er bis zum 30.06.2010 fertig wird, bleibt offen. Und dann bräuchte ich ja noch Zeit, die Änderungen in Twacbak zu integrieren. Eine einfache Risikoabschätzung zeigt: besser etwas anderes.</p>
<p>OAuth ist kein triviales Protokoll. Es gibt für die unterschiedlichsten Szenarien Möglichkeiten der Anbindung. In den meisten Beispielen wird davon ausgegangen, dass die Anwendung, die auf Twitter zugreifen möchte, selbst eine für jeden zugänglich Webanwendung ist. Twacbak ist aktuell eine reine Konsolenanwendung. Und selbst wenn Twacbak einmal eine Webanwendung wird, würde es bei mir nur im lokalen Netz laufen.</p>
<p>Das ist die Situation: Twacbak muss bis Ende Juni 2010 an OAuth angepasst werden, OAuth ist ein komplexes Protokoll, mein bisheriges Modul zur Kommunikation mit Twitter unterstützt kein OAuth.</p>
<p>Mitte November 2009 stolperte ich über <a href="http://github.com/joshthecoder/tweepy">Tweepy</a>. Damals war es nicht besonders ausgereift, kein Vergleich zu PTT. Zum Glück hatte ich es in meinem <a href="http://pbrain.de">Brain</a> einsortiert und schaute es mir letzte Woche noch einmal im Detail an. Etwas anders aufgebaut als PTT unterstützt es nun recht ausgereift OAuth.</p>
<p>Bleibt das Problem, wie man sich in einer Konsolenanwendung bei Twitter über OAuth authentifiziert. Die Beispiele im Web gaben nicht viel her. Ein wenig herumexperimentieren, Python&#8217;s <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop">REPL</a> half immens, kam heraus, dass es recht einfach ist:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">auth = tweepy.<span style="color: black;">auth</span>.<span style="color: black;">OAuthHandler</span><span style="color: black;">&#40;</span>CONSUMER_KEY, CONSUMER_SECRET<span style="color: black;">&#41;</span>
auth_url = auth.<span style="color: black;">get_authorization_url</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">webbrowser</span>.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>auth_url<span style="color: black;">&#41;</span>
pin = getline<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Enter PIN: '</span><span style="color: black;">&#41;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> pin:
    access_token = auth.<span style="color: black;">get_access_token</span><span style="color: black;">&#40;</span>pin<span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># sichere access_token.key und access_token.secret für zukünftige</span>
    <span style="color: #808080; font-style: italic;"># Zugriffe, z.B. in einer Datenbank</span></pre></div></div>

<p>Die Werte für CONSUMER_KEY und CONSUMER_SECRET erhält man nach der <a href="http://dev.twitter.com/apps/new">Registrierung einer Anwendung bei Twitter</a>. Mittels <tt>get_authorization_url()</tt> erhält man von Twitter eine URL, unter der ein Benutzer die Anwendung authorisieren kann. Nach der Authorisierung erhält der Benutzer auf der Webseite eine PIN, die er dann in der Konsolenanwendung angeben muss. Diese dient dazu, dass die Anwendung über Twitter ein sog. <em>Access Token</em> erhält. Damit authentifiziert sich die Anwendung später gegenüber Twitter. Das Access Token ist benutzer- und anwendungsspezifisch und damit wesentlich sicherer als ein Kennwort.</p>
<p>Der spätere Zugriff ist dann wieder einfach:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">auth = tweepy.<span style="color: black;">auth</span>.<span style="color: black;">OAuthHandler</span><span style="color: black;">&#40;</span>CONSUMER_KEY, CONSUMER_SECRET<span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># lese key und secret aus Datenbank</span>
auth.<span style="color: black;">set_access_token</span><span style="color: black;">&#40;</span>key, secret<span style="color: black;">&#41;</span>
api = tweepy.<span style="color: black;">API</span><span style="color: black;">&#40;</span>auth, <span style="color: #dc143c;">parser</span>=tweepy.<span style="color: black;">parsers</span>.<span style="color: black;">JSONParser</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Über das Objekt <tt>api</tt> können dann die Methoden der Twitter-API authentifiziert aufgerufen werden. Fertig.</p>
<p>Fertig? Nein. Tweepy hat eine leicht andere Philosophie als PTT. Aber zum Glück ist Python nicht statisch typisiert. Sonst hätte ein Großteil von Twacbak angepasst werden müssen (Ja, ich weiß: geringere Kopplung &#8230;). Dank <a href="http://de.wikipedia.org/wiki/Duck-Typing">Duck Typing</a>, eines der besonders angenehmen Merkmale von Python, und der guten Konfigurierbarkeit Tweepy&#8217;s musste ich nur einige wenige Stellen anpassen. Nach kurzer Zeit war ich dann wirklich fertig mit der Umstellung.</p>
<p>Twacbak arbeitet nun mindestens so gut wie vorher. Subjektiv scheint es sogar schneller mit Twitter zu kommunizieren. Aber das kann auch daran liegen, dass Twitter die Kommunikation mittels OAuth bevorzugt abwickeln könnte.</p>
<p>Jetzt kann ich wieder in Ruhe darüber nachdenken, wie sich Twacbak weiter entwickeln soll. Vermutlich in Richtung Webanwendung ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2010/06/01/twacbak-oauth-und-tweepy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konkurrenz für Twacbak</title>
		<link>http://blog.automatische-informationen.de/2009/10/31/konkurrenz-fur-twacbak/</link>
		<comments>http://blog.automatische-informationen.de/2009/10/31/konkurrenz-fur-twacbak/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:48:06 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[c't]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Twacbak]]></category>
		<category><![CDATA[twitterbak]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=453</guid>
		<description><![CDATA[In der c&#8217;t-Ausgabe 23/2009 gibt es einen Artikel mit Namen Elefantengedächnis, der beschreibt, wie man die Twitter-Timeline nebst Links und Bilder archivieren kann. Zwei Gedanken gingen mir nacheinander durch den Kopf. Erstens: &#8220;Hätte ich doch etwas gewartet, da hätte mir dann jemand Arbeit abgenommen&#8221;. Zweitens: &#8220;Zum Glück habe ich vorher angefangen und meine eigenen Erfahrungen [...]]]></description>
			<content:encoded><![CDATA[<p>In der c&#8217;t-Ausgabe 23/2009 gibt es einen Artikel mit Namen <a href="http://www.heise.de/ct/inhalt/2009/23/184/">Elefantengedächnis</a>, der beschreibt, wie man die Twitter-Timeline nebst Links und Bilder archivieren kann. Zwei Gedanken gingen mir nacheinander durch den Kopf. Erstens: &#8220;Hätte ich doch etwas gewartet, da hätte mir dann jemand Arbeit abgenommen&#8221;. Zweitens: &#8220;Zum Glück habe ich vorher angefangen und meine eigenen Erfahrungen gesammelt&#8221;.</p>
<p>Im Unterschied zu <a href="https://sourceforge.net/projects/twacbak/">Twacbak</a> ist <a href="http://www.heise.de/ct/09/23/links/184.shtml">Twitterbak</a> mit Hilfe von Perl und PHP implementiert. Der Perl-Code dient dazu Twitter regelmäßig per API abzufragen und die Ergebnisse abzuspeichern. Mit PHP wird ein web-basierter Dienst implementiert, um die Ergebnisse anzuzeigen und zu durchsuchen. Schwerpunkt von Twitterbak ist das Archivieren der eigenen Tweets.</p>
<p>Ist Twitterbak eine Konkurrenz zu Twacbak?</p>
<p>Auf jeden Fall. Eine gute dazu.</p>
<p>Das Profil von Twitterbak ist klar: Datensicherung. Wohin die Reise mit Twacbak hingehen wird, ist mir dagegen noch nicht klar.</p>
<p>Was gibt es an Ähnlichkeiten? Beide wollen die Ergebnisse von Twitter-Aktivitäten längerfristig sichern, beide nutzen dazu <a href="http://www.sqlite.org/">SQLite</a> als interne Datenbank. Beide sichern die eigenen Tweets, die direkten Nachrichten und die sog. Mentions, d.h. Tweets, in denen der eigene Account erwähnt wird. Beide sollen periodisch im Hintergrund, z.B. als Cron-Job, ablaufen.</p>
<p>Was kann Twacbak darüber hinaus? Twacbak kann auch die gesamte Timeline sichern, d.h. alle Tweets aller Account, denen man selbst folgt. Es werden die Favoriten gesichert und, ganz wichtig, alle Friends und Follower. Ich weiß, wovon ich spreche. Die Liste derjenigen denen man folgt ist ein fast so wertvolles Asset, wie die eigenen Tweets. Nebenher speichert Twacbak die Friend/Follow-Historie, denn es gibt immer wieder welche, die einem abwechselnd folgen und wieder nicht folgen. Damit ist Twacbak nicht nur ein Werkzeug zum Sichern der Twitter-Aktivitäten, sondern unterstützt diese auch. Mit Twacbak können sebst auch Tweets gesendet werden, Re-Tweets auf Basis von Schlüsselworten werden unterstützt, auch das Folgen per Kommandozeile geht.</p>
<p>Viele der anderen Unterschiede sind Geschmackssache. Ob ich nun das Ganze über eine Konfigurationsdatei steuere oder ob die Daten in der Datenbank selbst abgelegt werden: jeder wird für beides Vor- und Nachteile finden. Ditto für Änderungen am Quellcode selbst und einige Befehlsoptionen mehr gegenüber der Wahl für eine kleine Skriptsprache. Letztens Endes Firlefanz für einen Vergleich.</p>
<p>Natürlich kann das eine oder andere auch schnell von Twitterbak implementiert werden. Auch die größere Fehlertoleranz, wenn Twitter mal wieder nicht verfügbar ist. Darauf freue ich mich.</p>
<p>Ich habe für Twacbak die Anregung aufgenommen, die kurzen URL zu ermitteln, die sich hinter den Twitter-typischen Short-URL&#8217;s (z.B. via <a href="http://bit.ly/">bit.ly</a>) verbergen. Das gleiche gilt für Bilder. Nebenbei, dank der Python-Bibliotheken (&#8220;<a href="http://www.python.org/about/">Batteries included</a>&#8220;) geht das Ganze leichter und weniger fehleranfällig von der Hand. (Die Spitze musste sein, ich nehm das aber nicht zu ernst ;-) )</p>
<p>Über den Artikel habe ich mich sehr gefreut. Bestätigt er doch, wie sinnvoll es ist, selbst für die Sicherung der eigenen Daten zu sorgen und sich nicht immer nur irgendwelchen obskuren Web-Diensten anzuvertrauen. Ich werde die Entwicklung von Twacbak im Rahmen meines knappen Zeitbudgets vorantreiben und immer mal nach nebenan zur Konkurrenz schielen.</p>
<p>Die belebt nämlich auch den eigenen Geist.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/10/31/konkurrenz-fur-twacbak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twacbak: Anforderungen</title>
		<link>http://blog.automatische-informationen.de/2009/08/25/twacbak-anforderungen/</link>
		<comments>http://blog.automatische-informationen.de/2009/08/25/twacbak-anforderungen/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 18:50:25 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Twacbak]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=424</guid>
		<description><![CDATA[Lange habe ich mich schon um die Anforderungen zu Twacbak herumgedrückt. Im Kopf waren Sie schon, aber nicht zu Papier. Und, als weitere Ausrede, musste ich erst einmal ausprobieren, was die Twitter-API so alles hergibt. Damit bin ich nun soweit fertig, einen ersten Prototyp habe ich auch schon. Also, was sind (meine) Anforderungen? Funktionalität Sichern [...]]]></description>
			<content:encoded><![CDATA[<p>Lange habe ich mich schon um die Anforderungen zu Twacbak herumgedrückt. Im<br />
Kopf waren Sie schon, aber nicht zu Papier. Und, als weitere Ausrede, musste<br />
ich erst einmal ausprobieren, was die <a href="http://apiwiki.twitter.com/">Twitter-API</a> so alles hergibt. Damit bin ich nun soweit fertig, einen ersten Prototyp habe ich auch schon.</p>
<p>Also, was sind (meine) Anforderungen?</p>
<h2>Funktionalität</h2>
<ul>
<li> Sichern aller grundlegenden Daten eines Twitter-Accounts, wie:
<ul>
<li>Benutzerdaten (Name, Location, eigene URL, Bio, &#8230; so wie sie im Profile / Setting angegeben werden),</li>
<li>alle eigene Tweets,</li>
<li>Favorites,</li>
<li>gesendete Nachrichten,</li>
<li>empfangene Nachrichten,</li>
<li>Liste der Friends, d.h. der Accounts, denen man folgt,</li>
<li>Liste der Follower, d.h. die Account, die einem folgen.</li>
</ul>
</li>
<li>Sichern von nützlichen Zusatzinformationen:
<ul>
<li>Wann ist mir wer gefolgt, wann hat er mich aus seiner Liste gelöscht?</li>
<li>Wann bin ich jemanden gefolgt, wann habe ich das Verfolgen aufgegeben?</li>
<li>Was haben meine Friends so getwittert?</li>
<li>Wenn jemanden eine Antwort getwittert hat, auf welchen Tweet welchen Benutzers bezog sich diese Antwort?</li>
</ul>
</li>
<li>Die gesammelten Daten sollen auf den Bildschirm / in eine Datei ausgegeben werden können.</li>
<li>Darüber hinaus sollen folgende Berichte (Bildschirm / Datei) ausgegeben werden:
<ul>
<li>Liste der Accounts, die kürzlich das Verfolgen eingestellt haben</li>
<li>Detailinformationen zu Accounts, z.B. wann bin ich gefolgt, wann wurde meinem Account gefolgt, wann wurde das Verfolgen eingestellt und wieder aufgenommen, &#8230;</li>
<li>Durchsuchen der Tweets nach bestimmten Begriffen.</li>
</ul>
</li>
<li>Sobald von Friends Tweets mit einem definierten Hashtag erscheinen, sollen diese Retweetet werden.</li>
<li>Eigene Tweets sollen auf einem anderen Account gespiegelt werden.</li>
<li>Gespeicherte Informationen zu Accounts sollen regelmäßig aktualisiert werden, z.B. einmal pro Woche.</li>
</ul>
<hr />
<h2>Technisches</h2>
<ul>
<li> Die Daten sollen so abgespeichert, dass diese auch separat auswertbar sind.</li>
<li>Twacbak soll regelmäßig ohne Benutzerinteraktion die Daten von Twitter einsammeln können.</li>
<li>Es soll eine Lösung für einen Account erstellt werden.  Twacbak soll nicht für beliebig viele Accounts Daten sammeln.</li>
<li>Es sollen beliebige Microbloggingdienste unterstützt werden, welche die Twitter-API bereitstellen. Neben Twitter ist dies z.B. <a href="http://identi.ca/">identi.ca</a>.</li>
<li>Twacbak soll im Normalfall einmal pro Stunde ablaufen und dabei max. 50 Aufrufe der API tätigen.</li>
<li>Die Software soll so weit es geht platformunabhängig sein. Auf jeden Fall soll die Software unter Windows und unter Linux ablaufen.</li>
</ul>
<hr />
Das wären die ersten Anforderungen. Wir alle wissen ja: der Appetit kommt beim Essen. Und wenn jemand Anregungen hat, ich nehme diese gerne entgegen ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/08/25/twacbak-anforderungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tw***er und Python: Twacbak</title>
		<link>http://blog.automatische-informationen.de/2009/08/23/twer-und-python-twacbak/</link>
		<comments>http://blog.automatische-informationen.de/2009/08/23/twer-und-python-twacbak/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 17:21:50 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Twacbak]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=399</guid>
		<description><![CDATA[Jedes Kind muss einen Namen haben. Und für eine Heimat wäre es wohl auch dankbar. Zuerst der Name. Nicht zu lang, bin ja tippfaul. Eindeutig und aussagekräftig sollte er sein. Bisher hatte ich von &#8220;meinem Twitterbackupanalyseprogramm&#8221; gesprochen. @jbanach kam mit dem Vorschlag &#8220;Twaccback&#8221; (Twitter Account Backup). Ich habe noch zwei C&#8217;s aufgehoben. Eines für das [...]]]></description>
			<content:encoded><![CDATA[<p>Jedes Kind muss einen Namen haben. Und für eine Heimat wäre es wohl auch dankbar. Zuerst der Name. Nicht zu lang, bin ja tippfaul. Eindeutig und aussagekräftig sollte er sein. Bisher hatte ich von &#8220;meinem Twitterbackupanalyseprogramm&#8221; gesprochen. @jbanach kam mit dem Vorschlag &#8220;Twaccback&#8221; (Twitter Account Backup). Ich habe noch zwei C&#8217;s aufgehoben. Eines für das <a href="http://www.youtube.com/watch?v=-bkVCQYtB4U">Glücksrad</a>, das andere für die <a href="http://www.youtube.com/watch?v=AiuowHbnju4">Sesamstraße</a>.</p>
<p>Als Heimat kommen auch diese Seiten in Betracht. Dann könnte ich aber entweder &#8220;nur&#8221; das gesamte Paket zum Download anbieten oder ich müsste hier Software installieren. Aber es gibt ja Dienste, welche die Softwareentwicklung unterstützen. De facto gibt es die Wahl zwischen <a href="http://sourceforge.net/">SourceForge.net</a> oder <a href="http://code.google.com/">Google Code</a>. Ich habe mich für SourceForge.net entschieden, weil es da einige Dienste gibt, die ich immer schon mal ausprobieren wollte: <a href="http://mercurial.selenic.com/">Mercurial</a> als verteiltes Versionskontrollsystem (kann Google Code auch) und <a href="http://trac.edgewall.org/">Trac</a> (kann Google Code m.E. nicht). Beide wären auch Kandidaten für meine Veranstaltung &#8220;<a href="/hochschule/projektstudie-softwareentwicklung/">Projektstudie Softwareentwicklung</a>&#8221; ;-).</p>
<p>Somit ist die <a href="https://sourceforge.net/projects/twacbak/">Heimat von Twacbak</a> gefunden.</p>
<p>Bleibt noch die Frage der Lizenz. <a href="http://www.opensource.org/">Open Source</a> sollte sie sein, von abgeschlossenen Systemen halte ich nicht zu viel. Die <a href="http://www.gnu.org/licenses/gpl.html">GPL</a> ist mir zu viral (und einschränkend), <a href="http://www.opensource.org/licenses/mit-license.php">MIT</a> &#038; Co. zu offen. Als Lizenz habe ich (vorläufig) die <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> definiert.</p>
<p>Ja, ich weiß. Langsam sollte ich die Anforderungen definieren. *g</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/08/23/twer-und-python-twacbak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tw***er und Python: Erste Entscheidung</title>
		<link>http://blog.automatische-informationen.de/2009/08/12/twer-und-python-erste-entscheidung/</link>
		<comments>http://blog.automatische-informationen.de/2009/08/12/twer-und-python-erste-entscheidung/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 21:40:12 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=373</guid>
		<description><![CDATA[Ich habe heute ein wenig mit verschieden Python-Bibliotheken zum Zugriff auf der Tw***er herum gespielt. Ich wollte mir klar werden, was diese Bibliotheken können und was nicht. Eine erste Recherche (Suche nach &#8220;python twitter&#8221;) lieferte mir schon vor einiger Zeit de facto zwei erst zu nehmende Kandidaten. Beide kapseln die Tw***er-API, jedoch mit einer jeweils [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe heute ein wenig mit verschieden Python-Bibliotheken zum Zugriff auf der Tw***er herum gespielt. Ich wollte mir klar werden, was diese Bibliotheken können und was nicht. Eine erste Recherche (Suche nach &#8220;python twitter&#8221;) lieferte mir schon vor einiger Zeit de facto zwei erst zu nehmende Kandidaten. Beide kapseln die <a href="http://apiwiki.twitter.com/Twitter-API-Documentation">Tw***er-API</a>, jedoch mit einer jeweils anderern Philosophie.</p>
<p>Mein erster Kandidat ist <a href="http://code.google.com/p/python-twitter/">python-twitter</a>. Damit hatte ich vor einiger Zeit meine damals 1818 Tweets gesichert. python-twitter stellt als Start die Klasse <tt>Api</tt> zur Verfügung, mit deren Methoden so gut wie alle Aufrufe durchgeführt werden. Diese Aufrufe liefern meistens Listen von Datenobjekten, wie z.B. <tt>Status</tt>, <tt>DirectMessage</tt> oder <tt>User</tt>. Mit denen kann man dann weiterarbeiten. Als Beispiel der Code, um die Texte der eigenen Timeline, mitsamt der eigenen Freunde darzustellen:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span>username=<span style="color: #483d8b;">'username'</span>, password=<span style="color: #483d8b;">'password'</span><span style="color: black;">&#41;</span>
timeline = api.<span style="color: black;">GetFriendsTimeline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> status <span style="color: #ff7700;font-weight:bold;">in</span> timeline:
    <span style="color: #ff7700;font-weight:bold;">print</span> status.<span style="color: black;">text</span></pre></div></div>

<p>Um meine Tweets zu sichern hatte ich folgenden Code ausgeführt:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pickle</span>
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
timeline = api.<span style="color: black;">GetUserTimeline</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'dkreuz'</span>, count=<span style="color: #ff4500;">1818</span><span style="color: black;">&#41;</span>
datei = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'sicherung.pickle'</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">pickle</span>.<span style="color: black;">dump</span><span style="color: black;">&#40;</span>datei, timeline<span style="color: black;">&#41;</span>
datei.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Alles schön handlich und gut gekapselt. Aber mit zwei Nachteilen, doch dazu später. Und wie ich später las: es klappte zufällig. Egal.</p>
<p>Der andere Kandidat sind die <a href="http://mike.verdone.ca/twitter/">Python Twitter Tools</a>. Hier werden nur die Aufrufe sehr grob gekapselt, die Ergebnisse sind meistens Listen von Dictionaries (a.k.a. HashMaps, für die Java-affinen Leser ;-) ). Die Implementierung orientiert sich an der des Python-Moduls <a href="http://docs.python.org/library/xmlrpclib.html">xmlrpclib</a>. Dies funktioniert, das die Tw***er-API sehr einheitlich aufgebaut ist. Die Python Twitter Tools sind so generisch, dass die meisten zu erwartenden Änderungen der Tw***er-API nicht zu Änderungen der Bibliothek führen, evtl. aber zum aufrufenden Programmcode. Methodenaufrufe werden über einen netten Python-Trick abgefangen und direkt auf die Tw***er-API abgebildet. Auch hier das Beispiel zur Darstellung der Texte der eigenen Timeline:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Twitter</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'username'</span>, <span style="color: #483d8b;">'password'</span><span style="color: black;">&#41;</span>
timeline = api.<span style="color: black;">statuses</span>.<span style="color: black;">friends_timeline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> status <span style="color: #ff7700;font-weight:bold;">in</span> timeline:
    <span style="color: #ff7700;font-weight:bold;">print</span> status<span style="color: black;">&#91;</span><span style="color: #483d8b;">'text'</span><span style="color: black;">&#93;</span></pre></div></div>

<p><em>(Achtung: auch Python Twitter Tools stellt ein Modul mit dem Namen <tt>twitter</tt> bereit, genau wie python-twitter. Es sind aber unterschiedliche Module!)<br />
</em></p>
<p>Analog der <a href="http://docs.python.org/library/xmlrpclib.html">xmlrpclib</a> wird der Aufruf <tt>statuses.friends_timeline</tt> auf die Tw***er-API <a href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-friends_timeline">statuses/friends_timeline</a> abgebildet. Die Python Twitter Tools definieren, im Gegensatz zu python-twitter, keine eigenen, an der Tw***er-API orientierten Methoden.</p>
<p>Tja, welche Bibliothek ist nun die geeignete?</p>
<p>Die Bibliothek python-twitter hatte ich wegen der netten Abstraktionen ausgewählt, um meine Tweets zu sichern. Das ging ganz gut. Bis ich mir die Tw***er-API im Detail angesehen habe. Zum Beispiel erlaubt es die Methode <a href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-user_timeline">statuses/user_timeline</a> eine minimale und eine maximale Tweet-ID anzugeben. Die Methode <tt>GetUserTimeline()</tt> von python-twitter erlaubt dagegen nur eine minimale Tweet-ID. Entweder wurde die Angabe einer maximalen Tweet-ID vom Autoren von python-twitter für nicht notwendig befunden oder diese Möglichkeit wurde erst vor kurzem von Tw***er eingeführt, aber noch nicht in python-twitter nachvollzogen. Entsprechendes gibt es von der Klasse <tt>User</tt> zu berichten: Tw***er liefert das Datum, wann der Benutzer sich bei Tw***er angemeldet hat, aber nicht python-twitter.</p>
<p>Der andere Punkt, der gegen python-twitter spricht, ist seine Bindung an den Dienst Tw***er. Im Quellcode ist fest und schwer änderbar für jede Methode die URL &#8220;<a href="http://twitter.com/">http://twitter.com/</a>&#8221; hineincodiert. Zum Beispiel bei <tt>GetFriendsTimeline</tt> die Zeichenkette &#8220;<a href="http://twitter.com/statuses/friends_timeline.json">http://twitter.com/statuses/friends_timeline.json</a> &#8220;. Das ist solange nicht problematisch, so lange man nur den Dienst Tw***er nutzen möchte. Ich selbst nutze parallel den Dienst <a href="http://identi.ca/dkreuz/all" class="broken_link">identi.ca</a>. Schließlich weiß man ja nie, was irgendwann mal mit Tw***er wird. Identi.ca basiert auf einem quelloffenen PHP-System. Und: Identi.ca bietet eine <a href="http://laconi.ca/trac/wiki/TwitterCompatibleAPI">Tw***er-kompatible API</a> an. Software, wie z.B. <a href="http://mobileways.de/products/gravity/gravity/">Gravity</a> nutzen dies, um mehrere Accounts sowohl bei Tw***er als auch bei Identi.ca zu verwalten.</p>
<p>Der einzige Unterschied zwischen API-Zugriffen auf Tw***er und Identi.ca sind unterschiedliche Präfixe der URL für den HTTP-Aufruf. Für Tw***er ist es der Präfix &#8220;<a href="http://twitter.com">http://twitter.com</a>&#8221;, für identi.ca ist es &#8220;<a href="http://identi.ca/api">http://identi.ca/api</a> &#8220;. Der mobile Client <a href="http://www.twibble.de/twibble-mobile/">Twibble</a> erlaubt sogar die Einstellung eines eigenen Präfix, z.B. wenn man eine identi.ca-Implementierung selbst betreibt.</p>
<p>Und hierbei scheitert python-twitter. Eines meiner Anwendungsszenarien ist das selbstbestimmte Spiegeln von Tweets zwischen Tw***er und Identi.ca (dort heißen Tweets &#8220;Dents&#8221;, aber das ist eine <a href="http://www.collegehumor.com/video:1915736">andere Geschichte</a>).</p>
<p>Der andere Vorteil der Python Twitter Tools ist, dass ich per Programm an alles herankomme, was mir die API bietet. Und nicht auf das beschränkt bin, was mir die Bibliothek genehmigt.</p>
<p>Einen Nachteil haben allerdings beide: Kommunikation ist nur über HTTP möglich, nicht über HTTPS. Aber das kann man ja ändern ;-)</p>
<p><strong>Es geht weiter mit den <a href="http://mike.verdone.ca/twitter/">Python Twitter Tools</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/08/12/twer-und-python-erste-entscheidung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tw***er und Python: Motivation</title>
		<link>http://blog.automatische-informationen.de/2009/08/11/twer-und-python-motivation/</link>
		<comments>http://blog.automatische-informationen.de/2009/08/11/twer-und-python-motivation/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 14:23:31 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitterknast]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=360</guid>
		<description><![CDATA[Knapp drei Wochen ist es her, seit dem mein Tw***er-Account nicht mehr so wie gewohnt reagiert. Wenn ich morgens in ein leeres Büro komme, sind keine netten Leute mehr da. Meine Timeline umfasst aktuell etwa die letzten 21 Follower, d.h. mit den meisten konnte ich noch keine wirkliche Beziehung aufbauen. Diejenigen, zu denen es eine [...]]]></description>
			<content:encoded><![CDATA[<p>Knapp drei Wochen ist es her, seit dem mein Tw***er-Account nicht mehr so wie gewohnt reagiert. <a href="http://twitter.com/dc79/status/2014327346">Wenn ich morgens in ein leeres Büro komme, sind keine netten Leute mehr da</a>. Meine Timeline umfasst aktuell etwa die letzten 21 Follower, d.h. mit den meisten konnte ich noch keine wirkliche Beziehung aufbauen. Diejenigen, zu denen es eine Beziehung gibt, folgen mir nicht und können mir nicht folgen. Umgekehrt kann ich nicht mehr als den aktuell 17 Personen folgen. <a href="http://twitter.com/Jimmy1966">@Jimmy1966</a> hat dafür ein Wort geprägt: Twitterknast.</p>
<p>Im Gegensatz zu anderen bin ich nicht in Isolationshaft. Mein Account funktioniert ansonsten soweit. Über die @-Notation kann ich mit anderen kommunizieren, nur DM&#8217;s gehen nicht. Aber es ist schon sehr mühsam.</p>
<p>In den ersten Tagen wurde ich dadurch bei der Bewertung der Klausuren nicht zu sehr abgelenkt. Die Organisation des 2. Heilbronner Twittertreffens (getarnt als <a href="http://twittagessen.de/events/203">Twittagessen</a>) klappte mit Hilfe meines Co-Organisators <a href="http://twitter.com/NurIch">@NurIch</a>. Der Besuch meiner Söhne wurde durch keine Diskussionen oder Anregungen auf Twitter &#8220;gestört&#8221;.</p>
<p>Besonders gefreut hat mich, dass mich einige auf Twitter vermissen. Sei es über direkte Nachfragen via @-Notation oder mit dem Versuch, mir wieder zu folgen. Letztere klappt zwar nicht, aber ich bekomme jedes Mal eine E-Mail. Vielen Dank an (in halbwegs chronologischer Reihenfolge): @samakah, @torridluna, @kreativgut, @Jimmy1966, @Allaboutdancing, @ok23, @lamaiire, @maennig, @WolfgangKraus, @mai_kaefer, @tadels, @jkamlowski, @AKleiner, @taxxas, @kaestnerm. Ich hoffe, ich habe keinen vergessen.</p>
<p>Ich ahne zwar woran es liegt (es wurden von Twitter jede Menge Spam-Accounts entfernt, das Problem meines Accounts ist wohl ein Kollateralschaden) und weshalb wenig passiert (Twitter war/ist Ziel einer DOS-Attacke), aber nach drei Wochen ist nun langsam Schluss. Ich treffe Vorbereitungen für einen Nachfolgeaccount.</p>
<p>Was sind meine bisherigen Ideen?</p>
<ul>
<li>Die Liste der Leute, denen ich bis zum 22.07.2009 folgte, konnte ich dank <a href="http://tweetdeck.com/">TweetDeck</a> rekonstruieren. TweetDeck speichert die Namen aller Personen / Accounts, denen ich folgte und die während es lief mindestens einen Tweet abgesetzt haben in einer internen <a href="http://www.sqlite.org/">SQLite</a>-Datenbank. Damit fehlen mir nur die stillen Benutzer, d.h. einige Studierende meiner Veranstaltungen. Die kann ich im nächsten Semester ansprechen.</li>
<li>Mit Hilfe der API konnte ich meine gesamten Tweets sichern. Zum Glück waren es weniger als 3200, denn <a href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-user_timeline">mehr liefert die API nicht aus</a>.</li>
<li>Alles andere (Replies, DM&#8217;s, Favorites) kann man auch über die API sichern.</li>
<li>Also baue ich mir erst einmal eine kleine Infrastruktur auf, um meine vergangenen und zukünftigen Aktivitäten über Twitter lokal zu sichern.</li>
<li>Ich wollte sowieso mal wieder etwas programmieren.</li>
<li>Das Ganze werde ich in <a href="http://python.org/">Python</a> implementieren, denn es gibt gute Tools, die dabei helfen.</li>
<li>Auch Friends und Follower werde ich sichern, auch um später festzustellen, wer mir folgt und wer die Verfolgung abbricht.</li>
<li>Dafür gilt es ein kleines DB-Modell aufzubauen und ich kann gleich mal <a href="http://www.sqlalchemy.org/">SQLAlchemy</a> ausprobieren. Das wollte ich immer schon mal machen, mir fehlte nur die richtige Anwendung.</li>
<li>Das Problem des Accountnamens @dkreuz ist hoffentlich gelöst: Accountnamen kann man umbenennen. Ob es klappt, weiß ich nicht. Aber zur Not habe ich einen netten, selbstironischen Reservenamen.</li>
<li>Mein <a href="http://identi.ca/dkreuz/" class="broken_link">Identi.ca-Account</a> ist eine gute Reserve, falls mal Twitter den Geist aufgibt.</li>
</ul>
<p>Im Endeffekt soll eine kleine Anwendung zustande kommen, die meine Aktivitäten auf Twitter sichert. Meine Tweets kommen in eine Datenbank und werden auf Identi.ca gespiegelt. Follower und Friends werden gesichert und ich werde benachrichtigt, falls sich dort etwas ändert. Sollte ein Nachfolgeaccount auch ein Problem bekommen, kann ich schneller auf einen anderen/neuen Account wechseln.</p>
<p>Und zu allem Überfluss komme ich auch dazu, <a href="http://twitter.com/hhn_eb">@hhn_eb</a> mit etwas Leben zu füllen: der soll alle Tweets von Followern retweeten, die mit #hhneb markiert sind.</p>
<p>Im nächsten Schritt kümmere ich mich um die Anforderungen und Anwendungsszenarien im Detail.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/08/11/twer-und-python-motivation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wichtige Bücher und Filme für (angehende) IT-ler</title>
		<link>http://blog.automatische-informationen.de/2009/05/28/wichtige-bucher-und-filme-fur-angehende-it-ler/</link>
		<comments>http://blog.automatische-informationen.de/2009/05/28/wichtige-bucher-und-filme-fur-angehende-it-ler/#comments</comments>
		<pubDate>Thu, 28 May 2009 17:30:10 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Hochschule]]></category>
		<category><![CDATA[Profession]]></category>
		<category><![CDATA[alice]]></category>
		<category><![CDATA[anhalter]]></category>
		<category><![CDATA[buch]]></category>
		<category><![CDATA[computer science]]></category>
		<category><![CDATA[film]]></category>
		<category><![CDATA[informatik]]></category>
		<category><![CDATA[matrix]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[monty python]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/?p=273</guid>
		<description><![CDATA[Wie jede Disziplin, so hat auch die Informatik ihre eigenen Geschichten. Geschichten, deren kurze Erwähnung jedem Eingeweihten ein mehr oder minder breites Lächeln hervor ruft. Oder sind diese Geschichten schon Folklore? Egal. Wichtig ist, dass man sie kennt. Filme Matrix Matrix ist ein Science-Fiction-Film aus dem Jahr 1999. Aus Informatiksicht ist er zweierlei interessant. Zum [...]]]></description>
			<content:encoded><![CDATA[<p>Wie jede Disziplin, so hat auch die Informatik ihre eigenen Geschichten. Geschichten, deren kurze Erwähnung jedem Eingeweihten ein mehr oder minder breites Lächeln hervor ruft. Oder sind diese Geschichten schon Folklore? Egal. Wichtig ist, dass man sie kennt.</p>
<h1>Filme</h1>
<h2>Matrix</h2>
<p><a href="http://de.wikipedia.org/wiki/Matrix_(Film)">Matrix</a> ist ein Science-Fiction-Film aus dem Jahr 1999. Aus Informatiksicht ist er zweierlei interessant. Zum einen ist die Matrix nichts anderes eine riesige Simulation unserer Wirklichkeit. Sie ist so gut, dass sie nicht von der Wirklichkeit zu unterscheiden ist. Letzten Endes ist das eine Aufgabe in der Informatik: reale Vorgänge zu modellieren und in einem (digitalem) Rechensystem abzubilden.</p>
<p>Der Film Matrix zeigt, wie verwirrend eine solche Simulation sein kann. Übrigens, er ist nicht der erste seiner Art. Schon 1973 zeigte der deutsche Film <a href="http://de.wikipedia.org/wiki/Welt_am_Draht">Welt am Draht</a> Konsequenzen einer sehr weitgehenden Simulation auf. Ebenfalls 1999 gab es ein Remake, <a href="http://de.wikipedia.org/wiki/The_13th_Floor_%E2%80%93_Bist_du_was_du_denkst%3F">The 13th Floor – Bist du was du denkst?</a>. Wem die philosophische Überfrachtung von Matrix nicht zusagt, kann sich an diesen Filmen ausprobieren. Man verpasst aber auch nette &#8220;Special Effects&#8221; und den zweiten wichtigen Aspekt.</p>
<p>Nämlich die Frage nach der roten oder blauen Pille. Der Held des Film muss sich entscheiden, ob er die ganze Wahrheit erfahren möchte, mit allen Konsequenzen. Dann soll er die rote Pille schlucken. Mit der blauen Pille würde er glauben, was er bisher geglaubt hat. Natürlich nimmt er die rote Pille. Um den Film zu zitieren (aus: <a href="http://www.fosar-bludorf.com/matrix/probe.htm">Fehler in der Matrix</a>):</p>
<blockquote><p>Dies ist deine letzte Chance. Danach gibt es kein Zurück. Schluckst du die blaue Kapsel, ist alles aus. Du wachst in deiner Welt auf und glaubst, was du glauben willst. Schluckst du die rote Kapsel, bleibst du im Wunderland, und ich führe dich in die tiefsten Tiefen des Kaninchenbaus.</p></blockquote>
<p>Dies ist eine ultimative Entscheidung. Solche Entscheidungen sind immer mal wieder zu treffen. Mit meiner Entscheidung für die Informatik habe ich einen ganz anderen Blick auf die Hintergründe computergestützter Systeme erhalten. Im Positiven wie im Negativen.</p>
<h2>Monty Python</h2>
<p><a href="http://de.wikipedia.org/wiki/Monty_Python">Monty Python</a> war eine britische Komikergruppe, die ihre Blütezeit in den 70er-Jahren hatte. Viele Informatiker haben eine gewisse Nähe zum Humor dieser Gruppe. Ich würde ihn als schräg, schwarz, britisch, absurd, hintersinnig bezeichnen.</p>
<p>So ist Monty Python zum Namensgeber der Programmiersprache <a href="http://python.org/">Python</a> geworden (siehe: <a href="http://www.python.org/doc/faq/general/#why-is-it-called-python">Why is it called Python?</a>).</p>
<p>Aber auch die Bedeutung des Wortes <a href="http://de.wikipedia.org/wiki/Spam">Spam</a> ist auf einen <a href="http://www.youtube.com/results?search_type=&amp;search_query=monty+python+spam+sketch&amp;aq=1&amp;oq=monty+python+spam">Sketch</a> dieser Gruppe zurück zu führen.</p>
<p>Alles Gründe, sich einmal mit Monty Python zu beschäftigen. Wenn man davon absieht, dass es einen Riesenspass macht.</p>
<h1>Bücher</h1>
<h2>Per Anhalter durch die Galaxis</h2>
<p>Sie wollten immer schon mal wissen, was es mit dem Sinn des Lebens auf sich hat? Oder warum Sie am 25. Mai eines jeden Jahres vermehrt Leute mit Handtüchern sehen? Das hat seinen Ursprung in der einzigen Trilogie in fünf Bänden, eben <a href="http://de.wikipedia.org/wiki/Per_Anhalter_durch_die_Galaxis_(Romanreihe)">Per Anhalter durch die Galaxis</a>.</p>
<p>Den Inhalt und den Geist dieser Bücher wieder zu geben ist so gut wie unmöglich. Ist es Science-Fiction? Oder ganz einfach ein Roman? Auf jeden Fall hat diese Reihe einen ähnlichen Einfluss auf die Informatik wie <a href="http://de.wikipedia.org/wiki/Der_Herr_der_Ringe">Der Herr der Ringe</a> auf das Fantasy-Genre.</p>
<p>Der Humor hat etwas von Monty Python, ist also auch für Informatiker stilbildend. Und schon im ersten Band werden Sie die Antwort auf die wichtigste Frage kennen lernen: &#8220;42&#8243;!</p>
<p>Wie war noch mal die Frage?</p>
<h2>Alice im Wunderland &amp; Alice hinter den Spiegeln</h2>
<p>Die Geschichten von <a href="http://de.wikipedia.org/wiki/Alice_im_Wunderland">Alice im Wunderland</a> und <a href="http://de.wikipedia.org/wiki/Alice_hinter_den_Spiegeln">Alice hinter den Spiegeln</a> sind nicht nur einfach schöne Geschichten. Der Autor <a href="http://de.wikipedia.org/wiki/Lewis_Carroll">Lewis Carrol</a> war Mathematiker und zeigt damit, dass auch technisch orientierte Menschen sehr phantasievoll sein können.</p>
<p>Beide Bücher können als Vorbereitung für den Film Matrix dienen, siehe das Zitat zur roten Pille. In <a href="http://de.wikipedia.org/wiki/Alice_hinter_den_Spiegeln">Alice hinter den Spiegeln</a> gibt es ein schönes Kapitel mit dem Springer (engl. &#8220;Knight&#8221;), in dem es um Namen geht. Hier der Ausschnitt (aus: <a href="http://www.gutenberg.org/files/12/12-h/12-h.htm#2HCH0008">Through the Looking-Glass</a>):</p>
<blockquote><p>&#8216;The name of the song is called &#8220;HADDOCKS&#8217; EYES.&#8221;&#8216;</p>
<p>&#8216;Oh, that&#8217;s the name of the song, is it?&#8217; Alice said, trying to feel interested.</p>
<p>&#8216;No, you don&#8217;t understand,&#8217; the Knight said, looking a little vexed. &#8216;That&#8217;s what the name is CALLED. The name really IS &#8220;THE AGED AGED MAN.&#8221;&#8216;</p>
<p>&#8216;Then I ought to have said &#8220;That&#8217;s what the SONG is called&#8221;?&#8217; Alice corrected herself.</p>
<p>&#8216;No, you oughtn&#8217;t: that&#8217;s quite another thing! The SONG is called &#8220;WAYS AND MEANS&#8221;: but that&#8217;s only what it&#8217;s CALLED, you know!&#8217;</p>
<p>&#8216;Well, what IS the song, then?&#8217; said Alice, who was by this time completely bewildered.</p>
<p>&#8216;I was coming to that,&#8217; the Knight said. &#8216;The song really IS &#8220;A-SITTING ON A GATE&#8221;: and the tune&#8217;s my own invention.&#8217;</p></blockquote>
<p>Wenn Sie dies verstanden haben, dann verstehen Sie auch die Zusammenhänge zwischen einer Variablen, die auf ein Objekt verweist, dem Namen dieser Variablen, dem Inhalt, der Objektreferenz, dem Objekt und der Objektidentität.</p>
<p>Und damit steht dem erfolgreichen Programmieren nichts mehr im Wege.</p>
<h1>Mehr?</h1>
<p>Haben Sie auch noch Vorschläge für Bücher und Filme? Dann bin ich gespannt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/05/28/wichtige-bucher-und-filme-fur-angehende-it-ler/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Duck Typing for Dummies</title>
		<link>http://blog.automatische-informationen.de/2009/01/27/duck-typing-for-dummies/</link>
		<comments>http://blog.automatische-informationen.de/2009/01/27/duck-typing-for-dummies/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 11:25:40 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Cartoon]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/archives/32-guid.html</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekandpoke.typepad.com/geekandpoke/2009/01/simply-explained-part-34-duck-typing.html" style="display: inline;"><img src="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef010536ef18c3970b-pi" width="470" height="666" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/01/27/duck-typing-for-dummies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python rulez!</title>
		<link>http://blog.automatische-informationen.de/2009/01/23/python-rulez/</link>
		<comments>http://blog.automatische-informationen.de/2009/01/23/python-rulez/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 10:11:28 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Cartoon]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/archives/31-guid.html</guid>
		<description><![CDATA[Real programmers use Python:]]></description>
			<content:encoded><![CDATA[<p>Real programmers use <a href="http://www.python.org/">Python</a>:</p>
<p><a href="http://xkcd.com/534/"><img src="http://imgs.xkcd.com/comics/genetic_algorithms.png" alt="Genetic Algorithms" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2009/01/23/python-rulez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Installation von easy_install ist unter Python 2.6 / Windows nicht so easy</title>
		<link>http://blog.automatische-informationen.de/2008/12/23/die-installation-von-easy_install-ist-unter-python-26-windows-nicht-so-easy/</link>
		<comments>http://blog.automatische-informationen.de/2008/12/23/die-installation-von-easy_install-ist-unter-python-26-windows-nicht-so-easy/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 11:33:25 +0000</pubDate>
		<dc:creator>Detlef Kreuz</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[easy_install]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.automatische-informationen.de/archives/23-guid.html</guid>
		<description><![CDATA[Endlich bin ich einmal dazu gekommen, meine Installation von Python von Version 2.5.x auf 2.6.x zu aktualisieren. Nur, ein Hindernis gab es dabei: easy_install. easy_install ist ein extrem nützliches Werkzeug, um externe Python-Pakete zu installieren, wie z.B. das vorzügliche docutils oder SQLAlchemy. Es ist bei mir der Dreh- und Angelpunkt für weitere Python-Software, egal für [...]]]></description>
			<content:encoded><![CDATA[<p>Endlich bin ich einmal dazu gekommen, meine Installation von Python von Version 2.5.x auf 2.6.x zu aktualisieren. Nur, ein Hindernis gab es dabei: <a href="http://peak.telecommunity.com/DevCenter/EasyInstall"><tt>easy_install</tt></a>.</p>
<p><tt>easy_install</tt> ist ein extrem nützliches Werkzeug, um externe Python-Pakete zu installieren, wie z.B. das vorzügliche <a href="http://docutils.sourceforge.net/">docutils</a> oder <a href="http://www.sqlalchemy.org/">SQLAlchemy</a>. Es ist bei mir der Dreh- und Angelpunkt für weitere Python-Software, egal für welchen Zweck.</p>
<p>Also, <tt>easy_install</tt> muss nach der Installation von Python 2.6.x als Erstes selbst installiert werden. Schnell zur <a href="http://pypi.python.org/">PyPI</a>-Seite für die <a href="http://pypi.python.org/pypi/setuptools">setuptools</a>, in denen <tt>easy_install</tt> enthalten ist. Nur zu dumm: der aktuellste Installer für Windows unterstützt nur Python 2.5.</p>
<p>Gut, wozu kenne ich Software schon von den Lochkarten her? Die <tt>*.egg</tt>-Datei ist schnell heruntergeladen und noch schneller ausgepackt. Der Inhalt kommt in ein temporäres Verzeichnis und schon kann die Installation losgehen. Sie könnte losgehen. Wenn da nicht die Fehlermeldung wäre: &#8220;pkg_resources.DistributionNotFound: setuptools&#8221;.</p>
<p>Ein klassisches Problem: <tt>setuptools</tt> versucht sich selbst an den Haaren aus dem Sumpf zu ziehen. Aber diesmal findet es sich nicht selbst. Auf Englisch heißt das <em>Bootstrapping</em>. Nach einigem Herumsuchen ist das auch die Lösung.<br />
Die <tt>*.egg</tt>-Datei ist nicht nur etwas ähnliches wie eine ZIP-Datei, sie enthält zu Beginn auch direkt lesbaren Text:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">basename</span> $<span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">`</span> = <span style="color: #ff0000;">&quot;setuptools-0.6c9-py2.6.egg&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span> <span style="color: #7a0874; font-weight: bold;">exec</span> python2.6 <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;import sys, os; sys.path.insert(0, os.path.abspath('$0')); from setuptools.command.easy_install import bootstrap; sys.exit(bootstrap())&quot;</span> <span style="color: #ff0000;">&quot;$@&quot;</span>
<span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> $<span style="color: #000000;">0</span> is not the correct name <span style="color: #000000; font-weight: bold;">for</span> this egg file.
  <span style="color: #7a0874; font-weight: bold;">echo</span> Please rename it back to setuptools-0.6c9-py2.6.egg and try again.
  <span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #c20cb9; font-weight: bold;">false</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>Das ist zwar ein Shellskript und unter Windows so nicht wirklich zu gebrauchen, bringt meiner einen aber auf den richtigen Weg. <tt>*.egg</tt>-Dateien können offenbar in den Suchpfad von Python aufgenommen werden. Den absoluten Pfad meiner <tt>*.egg</tt>-Datei kenne ich, also kann ich einfach aufrufen:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">C:\User\kreuz&gt;python -c &quot;import sys; sys.path.insert<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, 'C:/Users/kreuz/setuptools-0.6c9-py2.6.egg'<span style="color: #66cc66;">&#41;</span>; from setuptools.command.easy_install import bootstrap; sys.<span style="color: #00b100; font-weight: bold;">exit</span><span style="color: #66cc66;">&#40;</span>bootstrap<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>&quot;</pre></div></div>

<p>&#8230; und die (Python-) Welt ist wieder in Ordnung.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.automatische-informationen.de/2008/12/23/die-installation-von-easy_install-ist-unter-python-26-windows-nicht-so-easy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
