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

<channel>
	<title>startafire</title>
	<atom:link href="http://blog.nik0.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nik0.de</link>
	<description>Blut, Zombies &#38; Gewalt. Und Dings. Undso.</description>
	<lastBuildDate>Tue, 15 May 2012 20:24:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>2 Stunden Diablo 3</title>
		<link>http://blog.nik0.de/2012/05/2-stunden-diablo-3/</link>
		<comments>http://blog.nik0.de/2012/05/2-stunden-diablo-3/#comments</comments>
		<pubDate>Tue, 15 May 2012 20:24:56 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[Gamez]]></category>
		<category><![CDATA[Blizzard]]></category>
		<category><![CDATA[Diablo 3]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2126</guid>
		<description><![CDATA[Nach vielen langen Jahren warten ist es heute so weit gewesen: Diablo III geht live! Nachdem ich viele Stunden meines Lebens bereits mit dem Vorgänger verbracht habe, war ich neugierig auf das, was hier gemacht wurde. Mit Interesse habe ich im Vorfeld Berichte verfolgt und wusste schon, dass einiges anders werden würde. Aber dazu später <a href='http://blog.nik0.de/2012/05/2-stunden-diablo-3/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Nach vielen langen Jahren warten ist es heute so weit gewesen: Diablo III geht live!</p>
<p>Nachdem ich viele Stunden meines Lebens bereits mit dem Vorgänger verbracht habe, war ich neugierig auf das, was hier gemacht wurde. Mit Interesse habe ich im Vorfeld Berichte verfolgt und wusste schon, dass einiges anders werden würde. Aber dazu später mehr.</p>
<p>Zuerst einmal wird installiert, was gefühlt relativ lange gedauert hat. Anschließend gings für mich an die Erstellung eines battle.net-Accounts, ohne den man nicht spielen kann. Einer der Nachteile ist, dass man zum Spielen eine Internetverbindung benötigt &#8211; nicht nur zum Login, sondern dauerhaft. Mir ist es einmal passiert, dass ich aus dem Spiel flog, weil die Verbindung zu den Battle.Net-Servern unterbrochen war. Das ist unschön, muss man die Kunden bei einem nicht billigen Spiel noch derart gängeln? Login-Probleme, wie sie heute in den <a title="Golem: Diablo 3: Shoppingcenter statt Sanktuario" href="http://www.golem.de/news/diablo-3-shoppingcenter-statt-sanktuario-1205-91805.html">frühen Morgenstunden</a> oder <a title="Golem: Diablo 3: Blizzards Server seit Stunden quasi unerreichbar" href="http://www.golem.de/news/diablo-3-blizzards-server-seit-stunden-quasi-unerreichbar-1205-91830.html">am Abend</a> aufgetreten sein sollen, hatte ich nicht.</p>
<p>Nach der Anmeldung gings an die Charakter-Erstellung. <a title="Diablo 3: Charaktäre" href="http://eu.battle.net/d3/de/game/">5 Klassen</a> stehen zur Auswahl und man darf sogar das Geschlecht wählen. Mich hat am meisten die Mönchen gereizt und somit mein erster Char. Altbekannt sind der Barbar und die Zauberin, der Dämonenjäger erinnert mich an die Assassine aus Teil 2 und der Hexendoktor hat ein bisschen was vom Necro.</p>
<p>Ich starte erstaunlicherweise quasi nackt mit nur einem alten Schlagring ausgerüstet. Nach wenigen Metern und den ersten Gegner bin ich in Neu-Tristram angelangt und kümmere mich um die ersten Quests.</p>
<p>Die Story ist gut erzählt, die Gegenden sind wieder zufällig erstellt. Der Eindruck ist gut, immer wieder gibts versteckte Schätze oder auftauchende Gegner. Für große eliminierte Gegnergruppen bekommt man Bonus XP, das gefällt mir gut und gibt Anreize keine Kampfpausen zu machen.</p>
<p>Ich habe einen primären und einen sekundären Angriff. Der erste lädt Seelenenergie auf, der zweite verbraucht sie wieder. Da ich die Energie nur im Kampf aufladen kann, habe ich natürlich auch Interesse daran, dass um mich herum immer Action ist.</p>
<p>Das Skillsystem ist komplett anders. Ich lerne die Skills in <a title="Mönch: Skill-Reihenfolge" href="http://eu.battle.net/d3/de/class/monk/progression">festgelegter Reihenfolge</a> beim Level-Aufstieg. Es gibt eine Reihe von Grundfertigkeiten, welche durch Runen aufgemotzt werden. Meinem Donnerschlag verpasse ich eine Teleportfunktion und bin dadurch sofort am Feind, meine Tritte bekomme mit einer Prise Flammen das gewisse Extra.</p>
<p>Neben primärem und sekundären Angriff kann ich vier unterstützende Fähigkeiten auswählen, auch hier bekommt man nach und nach alles, kann aber immer nur eine Fähigkeit einer Art auswählen.<br />
Die Lösung ist gut und verhindert, dass man sich &#8211; wie es sicherlich vielen in Diablo 2 passiert ist &#8211; verskillt. Wichtiger ist nun, wie man die Fähigkeiten kombiniert und eben auch die eingesetzte Ausrüstung.</p>
<p>Auf <em>Normal</em> kommt man gut gegen die Gegnermassen an. Sollte es doch mal brenzlig werden hat man nun eine Taste, mit welcher man sich einen Heiltrank einwerfen kann. Aber Vorsicht, diese haben nun einen Cooldown!</p>
<p>Die Abwechslung im Gegnerdesign hält sich noch in Grenzen, aber ich habe mit Level 9 noch nicht so viel von der Welt gesehen. Dabei war ich schon stark umtriebig, die Story treibt mich umher. Zwischendurch habe ich immer wieder schmunzeln müssen und mich gefragt, ob dieses oder jenes bewusst eine Anspielung auf alte Zeiten war. Apropo alte Zeiten: man trifft wieder auf alte Bekannte <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Die Grafik in Diablo 3 wirkt anständig. Es gibt keine großen Überraschungen, es hätte durchaus düsterer ausfallen können. Meinem Kentnissstand nach wird hier noch mit Direct X 9 gewerkelt, weswegen auch Spieler mit älteren Rechnern zum Zug kommen können.<br />
Nervig ist leider, dass der Lüfter meiner Grafikkarte relativ laut dreht und ich nicht sehe, weshalb das so ist. Vielleicht legt Blizzard durch einen Patch nach, vielleicht behebt ein neuer Nvidia-Treiber das Problem. Wie auch immer, momentan nervts, da dadurch der Geräuschpegel im Raum relativ konstant auf einem nicht mehr einfach überhörbaren Level sind.</p>
<p>Nach meinen 2 Stunden Spielzeit bin ich insgesamt recht zufrieden. Die deutsche Übersetzung ist gut, ich habe bisher keinen Grund auf Englisch umzustellen. Man kommt sogar in den Genuss von Blutspritzern und auseinanderfallenden Gegnern. Es gibt viel zu entdecken und ich bin gespannt, wie die Story sich weiterentwickelt!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/05/2-stunden-diablo-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jenkins &amp; Python</title>
		<link>http://blog.nik0.de/2012/05/jenkins-und-python/</link>
		<comments>http://blog.nik0.de/2012/05/jenkins-und-python/#comments</comments>
		<pubDate>Sun, 06 May 2012 12:53:47 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[c0ding]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[nosetests]]></category>
		<category><![CDATA[pep8]]></category>
		<category><![CDATA[pylint]]></category>
		<category><![CDATA[PyPI]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2023</guid>
		<description><![CDATA[Ursprünglich wollte ich versuchen Continous Integration (CI) mit Python durchzuführen. Einerseits aus dem Interesse, was in dieser Richtung alles möglich ist, andererseits um regelmäßig durchgeführte Aufgaben zu automatisieren. Mittlerweile nutze ich CI zur Ermittlung von Kennzahlen, zum Verfolgen der Entwicklung und der automatischen Testausführung. CI-Tool meiner Wahl ist Jenkins. Ich bevorzuge Jenkins gegenüber Hudson, weil <a href='http://blog.nik0.de/2012/05/jenkins-und-python/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ursprünglich wollte ich versuchen Continous Integration (CI) mit Python durchzuführen. Einerseits aus dem Interesse, was in dieser Richtung alles möglich ist, andererseits um regelmäßig durchgeführte Aufgaben zu automatisieren. Mittlerweile nutze ich CI zur Ermittlung von Kennzahlen, zum Verfolgen der Entwicklung und der automatischen Testausführung.</p>
<p>CI-Tool meiner Wahl ist Jenkins. Ich bevorzuge Jenkins gegenüber Hudson, weil Jenkins hinter sich eine aktive Community hat und mir Hudson relativ tot aussieht. Nach der Übernahme Suns durch Oracle wurde das Hudson-Projekt geforkt und als Jenkins durch die Community weiterentwickelt. Hudson wurde irgendwann zum Sterben in die Hände der Eclipse Foundation gelegt &#8211; ungefähr so, wie es Oracle bereits mit OpenOffice getan hat.<br />
Die aktive Jenkins Community sorgt für die Weiterentwicklung und es gibt regelmäßig, alle 2 Wochen, Releases.</p>
<p>Ich will hier zeigen, wie wir uns mit wenig Aufwand eine eigene Jenkins-Instanz mit unsere Entwicklung unterstützenden Tools aufbauen können.</p>
<h1>Installation</h1>
<p>Das System habe ich auf einem Ubuntu Server aufgebaut. Die Installation erfolgte mittels den auf der Jenkins-Seite <a title="Installing Jenkins" href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins">beschriebenen Schritten</a>.</p>
<p>Nach der Installation wurde Jenkins automatisch gestartet und war fortan unter <em>localhost:8080</em> zu erreichen.</p>
<h1>Plugins</h1>
<p>Jenkins lässt sich durch eine große Menge an Plugins erweitern. Aber viele davon brauchen wir nicht, der Zugriff auf die Versionverwaltung unserer Wahl und das Violations-Plugin reichen für den Anfang vollkommen aus.</p>
<h2>Violations</h2>
<p>Ich wähle das <a title="Jenkins Plugin: Violations" href="https://wiki.jenkins-ci.org/display/JENKINS/Violations">Violations</a>-Plugin für die spätere Verwendung von <a title="pylint" href="http://www.logilab.org/project/pylint">pylint</a> und <a title="PyPi: pep8" href="http://pypi.python.org/pypi/pep8/">pep8</a>.<br />
Da uns die über die Ubuntu-Repos installierte Version das Violations-Plugin nicht anzeigt, installieren ich es von Hand. Dazu laden wir es <a title="Neueste Version des Jenkins Violations Plugin" href="http://updates.jenkins-ci.org/latest/violations.hpi">über diesen Link</a> herunter und wählen in der Jenkins Verwaltung bei Plugins die <em>Erweiterten Einstellungen</em>. Dort habe ich dann die Möglichkeit eines manuellen Uploads.</p>
<h1>Jobs einrichten</h1>
<p>Nun können wir mit der Einrichtung unseres Projekts in Jenkins beginnen. Wir rufen natürlich Jenkins auf und clicken links auf <em>Neuen Job anlegen</em>. Wir wählen einen aussagekräfitgen Namen und wählen <em><strong>&#8220;Free Style&#8221;-Softwareprojekt bauen</strong></em>. Der Jobname sollte keine Underscores enthalten, da die Jenkins Shell damit Probleme haben kann.</p>
<div id="attachment_2110" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins.png"><img class="size-medium wp-image-2110" title="Jenkins: Job erstellen" src="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins-300x179.png" alt="" width="300" height="179" /></a><p class="wp-caption-text">Jenkins: Job erstellen</p></div>
<p>Auf der folgenden Seite haben wir dann eine Menge an Einstellungsmöglichkeiten. Unter den erweiterten Projekteinstellungen kann auch ein neuer Anzeigename gewählt werden &#8211; diesmal auch mit Leerzeichen.</p>
<h2>Versionskontrolle</h2>
<p>Hier können wir auch den Zugriff auf unser Versionskontrollsystem einstellen. Ich nutze hier ein git-Repository. Damit nicht alle Dateien im Jenkins-Workspace rumliegen, packen wir das Repository in einen Unterordner. Dies gehört bei git zu den erweiterten Einstellungen und ist als <em>Local subdirectory for repo (optional)</em> zu finden. Wir tragen dort den Wert <em>repo</em> ein.</p>
<p>Das automatische Durchführen unserer Build-Schritte ist auch möglich. Entweder wir geben von vornherein Zeiten fest, zu welchen gebaut werden soll, oder aber wir geben an, wann unsere zuvor eingetragenes Repository auf Aktualisierungen überprüft werden soll. Die Angaben folgen der <a href="http://troubadix.dn.fh-koeln.de/unix/cronjobs_syntax.html">cron-Syntax</a>. Wir wollen alle 15 Minuten eine Überprüfung des Repositories, was anschließend ein neuen Build ausgeführt, wenn sich der Inhalt geändert hat. Das erreichen wir mit folgender Zeile:</p>
<pre>*/15 * * * *</pre>
<p>Man kann seine Jobs auch so konfigurieren, dass nach einem Commit in unserem Repo automatisch ein Build ausgeführt wird, aber wir bleiben erstmal bei dieser einfachen Variante.</p>
<p>Bevor es mit der weiteren Einrichtung weitergeht übernehmen wir die Änderungen und starten den ersten Build. So kann festgestellt werden, ob der Zugriff auf die Softwarequelle gelingt oder ob die Konfiguration noch angepasst werden muss. Den Rest der Konfiguration werden wir ähnlich inkrementell fortführen, um die Sicherheit zu haben, dass unsere neuen Einstellungen funktionieren.</p>
<h3>Jenkins &amp; Github</h3>
<p>Wer mit Jenkins Github-Projekte auschecken will, der sollte unter <em>Jenkins Verwalten</em> -&gt; <em>Jenkins Konfigurieren</em> Benutzername und E-Mail für git konfigurieren, da Github keinen anonymen Checkout erlaubt.</p>
<h2>Build-Schritte</h2>
<p>Nach dem erfolgreichen Checkout können wir anfangen unsere Build-Schritte zu erstellen. Hierzu fügen wir in der Job-Konfiguration einen Shell-Build-Schritt hinzu, welchen wir nun nach und nach mit Leben füllen.</p>
<h3>1. Virtualenv einrichten</h3>
<p>Wir beginnen mit der Einrichtung einer isolierten Python-Umgebung mit virtualenv. Das sollte dazu auf dem Hauptsystem bereits installiert sein.</p>
<pre>virtualenv pyenv
. pyenv/bin/activate</pre>
<h3>2. Pakete installieren</h3>
<p>Anschließend installieren wir die für die Automatisierung mit Jenkins ein paar Pakete in unserer Python-Umgebung.</p>
<pre>pip install pylint
pip install pep8
pip install nose</pre>
<h3>3. Requirements installieren</h3>
<p>Bringt unser Repository eine Datei mit Abhängigkeiten mit, so installieren wir auch diese Abhängigkeiten:</p>
<pre>pip install -r repo/requirements.txt</pre>
<h3>4. Pythonpath richtig setzen</h3>
<p>Damit unsere Module importiert werden können, erweitern wir den PYTHONPATH:</p>
<pre>PYTHONPATH=$WORKSPACE/repo:$PYTHONPATH
export PYTHONPATH</pre>
<h3>5. pylint</h3>
<p>Die Ausgabe von pylint lässt sich mittels Violations-Plugin einbetten. Dieses wird in der Job-Konfiguration aktiviert und anschließend tragen wir dort als XML filename pattern das folgende ein: <strong>**pylint.txt</strong></p>
<p>Damit das einen Effekt hat, müssen wir natürlich auch pylint im Build-Schritt aufrufen und die Ausgabe in die Datei pylint.txt umleiten. Und da pylint bei der Ausgabe von Meldungen nicht mit dem exit code 0 beendet wird, bauen wir uns dafür einen kleinen Workaround. Ohne den Workaround bricht der Build nach diesem Schritt ab, ohne die restlichen Schritte durchgeführt zu haben.</p>
<pre>(pylint --output-format=parseable repo/ &gt; pylint.txt) || echo 'pylint did not finish with return code 0'</pre>
<div id="attachment_2111" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins1.png"><img class="size-medium wp-image-2111" title="Jenkins: Erste Ergebnisse von pylint" src="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins1-300x179.png" alt="" width="300" height="179" /></a><p class="wp-caption-text">Jenkins: Erste Ergebnisse von pylint</p></div>
<h3>6. pep8</h3>
<p>Auch für pep8 nutzen wir das Violations-Plugin und einen kleinen Workaround &#8211; aus dem gleichen Grund wie bei pylint. Als Dateinamens-Muster geben wir <strong>**pep8.txt</strong> ein und erweitern den Build-Schritt wie folgt:</p>
<pre>pep8 repo/ &gt; pep8.txt || echo 'pep8 did not finish with return code 0'</pre>
<h3>7. Tests durchführen</h3>
<p>Zuletzt wollen wir Jenkins dafür nutzen, dass er automatisch unsere Tests ausführt. Dazu wird <a title="PyPI: nose" href="http://pypi.python.org/pypi/nose/">nose</a> genutzt. In der Job-Konfiguration aktivieren wir die Veröffentlichung der JUnit-Testergebnisse und tragen dort die Standard-Ausgabedatei <strong>**nosetests.xml</strong> ein. An den Build-Schritt hängen wir folgendes an:</p>
<pre>nosetests --with-xunit repo/tests/</pre>
<div id="attachment_2112" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins2.png"><img class="size-medium wp-image-2112" title="Jenkins: pylint, pep8 &amp; unittests" src="http://blog.nik0.de/wp-content/uploads/2012/05/jenkins2-300x179.png" alt="" width="300" height="179" /></a><p class="wp-caption-text">Jenkins: Die Tests laufen auch</p></div>
<h3>8. Zusammenfassung</h3>
<p>Wir haben mit wenigen Schritten unser Projekt so konfiguriert, dass wir einige Aussagen über den Code-Stil bekommen und automatisch unsere Tests ausgeführt bekommen.</p>
<p>Der Build-Schritt sieht zusammengefasst so aus:</p>
<pre>virtualenv pyenv
. pyenv/bin/activate

pip install pep8
pip install pylint
pip install nose

pip install -r repo/requirements.txt

PYTHONPATH=$WORKSPACE/repo:$PYTHONPATH
export PYTHONPATH

pylint --output-format=parseable repo/ &gt; pylint.txt || echo 'pylint did not finish with return code 0'
pep8 repo/ &gt; pep8.txt || echo 'pep8 did not finish with return code 0'
nosetests --with-xunit repo/tests/</pre>
<h2>Kleine Verbesserungen</h2>
<p>Der Stand, den wir nun haben, ist erstmal lauffähig. Aber wir können uns mit ein paar Kleinigkeiten noch ein angenehmeres Leben bescheren.</p>
<h3>Build-Anzahl beschränken</h3>
<p>Da ich zu selten arg alte Ergebnisse anschauen möchte, beschränke ich die Aufbewahrung der Builds mit einem Haken bei <strong>Alte Builds Verwerfen</strong> und trage dort die Anzahl an aufzuhebenden Builds ein, z.B. 25. Auch kann man dort bestimmen, dass alle Builds älter als <em>n</em> Tage gelöscht werden. Kleiner Nebeneffekt ist, dass der Festplattenplatz nicht unendlich belegt wird.</p>
<h3>Build-Schritte in Shellscripte packen</h3>
<p>Wenn man zu dem Punkt gekommen ist, an dem man daran denkt einen Job zu kopieren, sollte man kurz innehalten und sich folgende Frage stellen: Wieviel Prozent meiner Build-Schritte werde ich einfach kopieren?</p>
<p>Meine Erfahrung ist, dass es oftmals mehr als 75% sind. Hier und da wird PYTHONPATH angepasst oder ein Schritt weggelassen, weil er keinen Sinn macht (z.B. weil es keine Tests gibt). Das sind alles Fälle, die man wunderbar durch ein Shell-Script abdecken kann. Der einfachste Weg ist die Build-Schritte in ein Shellscript zu kopieren und dann in Jenkins die vielen einzelnen Schritte durch den Aufruf des Shellscripts zu ersetzen.</p>
<p>Nachdem ich einmal die Erfahrung gemacht habe, welcher Aufwand es ist bei einer kleinen Änderung im Ablauf eine Reihe von Jobs anpassen zu müssen, bin ich mittlerweile froh, dass ich (fast) alles durch ein Shell-Script abdecken kann. Hier wird anhand diverser Bedingungen entschieden, welche Schritte nötig sind und mit welchen Optionen sie gestartet werden müssen.</p>
<h3>Python-Pakete lokal laden</h3>
<p>Für die eigenen Unabhängigkeit vom PyPI sollte man sich überlegen, dass man die zu installierenden Pakete lokal vorhält. Auch kann man nicht überall uneingeschränkt auf das Internet zugreifen, um sich von dort seine Pakete zu installieren. Andererseits kann es eine Zeit dauern, bis alle Pakete heruntergeladen und installiert sind (insbesondere, wenn virtualenv mit der <em>&#8211;clean</em> Option gestartet wird).</p>
<p>Möglichkeiten so etwas umzusetzen reichen von der einfachen Alternative alle Files lokal zu lagern und pip den kompletten Pfad mitzugeben (bspw. pip install /home/niko/nose-1.1.2.tar.gz) bis zum Aufsetzen eines eigenen, lokalen PyPI-Spiegels. Die Angabe des kompletten Pfads hat den Nachteil, dass man damit natürlich noch nicht die Requirements-Datei abdeckt.</p>
<p>Aufwändiger ist das Aufstellen eines eigenen PyPI-Mirrors. Ich denke aber, dass er mit der Anzahl der Nutzer immer nützlicher wird. Möglichkeiten gibt es viele, dazu kann man z.B. <a title="What to do when PyPI goes down?" href="http://jacobian.org/writing/when-pypi-goes-down/">hier</a> lesen, einen Blick auf die <a title="pip: Alternate Package Repositories" href="http://www.pip-installer.org/en/latest/usage.html#alternate-package-repositories">von pip  dargebotenen Möglichkeiten</a> oder bereits fertige Module wie <a title="PyPI: collective.eggproxy" href="http://pypi.python.org/pypi/collective.eggproxy">collective.eggproxy</a> werfen. $Suchmaschine ist dein Freund <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>Und das wars auch schon. Ich bin auf Anregungen und Meinungen gespannt <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/05/jenkins-und-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Win8 kann keine DVDs</title>
		<link>http://blog.nik0.de/2012/05/win8-kann-keine-dvds/</link>
		<comments>http://blog.nik0.de/2012/05/win8-kann-keine-dvds/#comments</comments>
		<pubDate>Sat, 05 May 2012 21:01:40 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[Leben oder so...]]></category>
		<category><![CDATA[DVD]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Patente]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2101</guid>
		<description><![CDATA[Sehr interessant finde ich die Entwicklung, dass Microsoft beschlossen hat einem Windows 8 standardmäßig nichts zur DVD-Wiedergabe mitzugeben. Wer das Feature benötigt, kann es gegen Aufpreis nachkaufen. Die Begründung für diese Entscheidung sind Lizenzkosten. Nun frage ich mich, ob Microsoft in Zukunft auch für andere Features bezahlt werden will. Könnte durchaus eine Ergänzung in einem <a href='http://blog.nik0.de/2012/05/win8-kann-keine-dvds/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Sehr interessant finde ich die Entwicklung, dass Microsoft <a title="Golem: Sparmaßnahmen: Windows 8 spielt keine DVDs mehr ab" href="http://www.golem.de/news/sparmassnahmen-windows-8-spielt-keine-dvds-mehr-ab-1205-91564.html">beschlossen</a> hat einem Windows 8 standardmäßig nichts zur DVD-Wiedergabe mitzugeben. Wer das Feature benötigt, kann es gegen Aufpreis nachkaufen. Die Begründung für diese Entscheidung sind Lizenzkosten.</p>
<p>Nun frage ich mich, ob Microsoft in Zukunft auch für andere Features bezahlt werden will. Könnte durchaus eine Ergänzung in einem Windows-App-Store sein, oder nicht?</p>
<p>Wie siehts eigentlich aus mit alternativen Playern unter Windows 8. Ist es eventuell schon genug, dass man sich eine aktuelle Version von z.B. VLC installiert?</p>
<p>Zu guter letzt kann ich eigentlich nur darauf verweisen, dass sowas einerseits die Folgen von geschlossenen und unfreien Standards sind und anderseits, ja andererseits, passiert mir sowas bei Linux nicht <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/05/win8-kann-keine-dvds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Borg Pattern</title>
		<link>http://blog.nik0.de/2012/04/python-borg-pattern/</link>
		<comments>http://blog.nik0.de/2012/04/python-borg-pattern/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 11:44:59 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[c0ding]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2077</guid>
		<description><![CDATA[Das Borg Pattern habe ich diese Woche kennen gelernt und wollte es kurz hier verewigen. Das Borg Pattern sorgt dafür, dass jede erstellte Instanz den gleichen Zustand hat. Oft wird das Borg Pattern in Verbindung mit dem Singleton Pattern genannt. Von einem Singleton kann nur eine Instanz erstellt werden, von einem Borg können beliebig viele <a href='http://blog.nik0.de/2012/04/python-borg-pattern/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Das Borg Pattern habe ich diese Woche kennen gelernt und wollte es kurz hier verewigen. Das Borg Pattern sorgt dafür, dass jede erstellte Instanz den gleichen Zustand hat. Oft wird das Borg Pattern in Verbindung mit dem Singleton Pattern genannt. Von einem Singleton kann nur eine Instanz erstellt werden, von einem Borg können beliebig viele Instanzen erstellt werden.</p>
<p>Implementieren kann man es so:</p>
<pre>class Borg:
    _state = {}
    def __init__(self):
        self.__dict__ = self._state</pre>
<p>Hier noch ein Beispiel zum Verständnis:</p>
<pre>&gt;&gt;&gt; b = Borg()
&gt;&gt;&gt; b.foo = 42
&gt;&gt;&gt; b.__dict__
{'foo': 42}
&gt;&gt;&gt; c = Borg()
&gt;&gt;&gt; c.__dict__
{'foo': 42}
&gt;&gt;&gt; c.cheese = True
&gt;&gt;&gt; b.cheese
True
&gt;&gt;&gt; b == c
False</pre>
<p>Wie man sieht, teilen sich die Instanzen zwar ihren Zustand, sind aber nicht das gleiche Objekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/04/python-borg-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blood, Sweat and Tears</title>
		<link>http://blog.nik0.de/2012/04/blood-sweat-and-tears/</link>
		<comments>http://blog.nik0.de/2012/04/blood-sweat-and-tears/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 15:52:38 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[Leben oder so...]]></category>
		<category><![CDATA[Zitat]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2075</guid>
		<description><![CDATA[If you hire people just because they can do a job, they’ll work for your money. But if you hire people who believe what you believe, they’ll work for you with blood and sweat and tears. -Simon Sinek via Journal of An Open Sourcee &#160;]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you hire people just because they can do a job, they’ll work for your money. But if you hire people who believe what you believe, they’ll work for you with blood and sweat and tears.<br />
-Simon Sinek</p></blockquote>
<p>via <a href="http://ogmaciel.tumblr.com/post/20587581508/if-you-hire-people-just-because-they-can-do-a">Journal of An Open Sourcee</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/04/blood-sweat-and-tears/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KDE: Maximierte Fenster ohne Deko</title>
		<link>http://blog.nik0.de/2012/04/kde-maximierte-fenster-ohne-deko/</link>
		<comments>http://blog.nik0.de/2012/04/kde-maximierte-fenster-ohne-deko/#comments</comments>
		<pubDate>Sun, 08 Apr 2012 10:35:57 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[KDE SC]]></category>
		<category><![CDATA[KWin]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2071</guid>
		<description><![CDATA[Ich nutze seit einiger Zeit ein KWin-Feature, welches meine maximierten Fenster ohne Dekorationen (Ränder, Titelleiste) anzeigt. Ich habe mich bisher immer einem Setting in meiner kwinrc bedient, wie hier beschrieben. Nun habe ich gesehen, dass man diese Einstellung auch bequem über die KDE Systemeinstellungen vornehmen kann. Dort gibts unter Fensterverhalten -&#62; Fensterverhalten -&#62; Verschieben den Punkt <a href='http://blog.nik0.de/2012/04/kde-maximierte-fenster-ohne-deko/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ich nutze seit einiger Zeit ein KWin-Feature, welches meine maximierten Fenster ohne Dekorationen (Ränder, Titelleiste) anzeigt. Ich habe mich bisher immer einem Setting in meiner kwinrc bedient, wie <a title="Hide window border for maximized windows" href="http://hanschen.org/2010/04/01/hide-window-border-for-maximized-windows/">hier beschrieben</a>.</p>
<p>Nun habe ich gesehen, dass man diese Einstellung auch bequem über die KDE Systemeinstellungen vornehmen kann. Dort gibts unter <em>Fensterverhalten -&gt; Fensterverhalten -&gt; Verschieben</em> den Punkt &#8220;Ränder bei maximierten Fenstern anzeigen&#8221;. Super <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://blog.nik0.de/wp-content/uploads/2012/04/borderless_windows.png"><img class="aligncenter size-medium wp-image-2072" title="KDE: Setting für Randlose Fenster in KWin" src="http://blog.nik0.de/wp-content/uploads/2012/04/borderless_windows-300x187.png" alt="" width="300" height="187" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/04/kde-maximierte-fenster-ohne-deko/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Movies as Code</title>
		<link>http://blog.nik0.de/2012/04/movies-as-code/</link>
		<comments>http://blog.nik0.de/2012/04/movies-as-code/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 15:35:14 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[c0ding]]></category>
		<category><![CDATA[Unterhaltung]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2062</guid>
		<description><![CDATA[Der Humor von Programmierern ist ja manchmal etwas merkwürdig. Und deshalb wird Movies as Code vermutlich auch hauptsächlich solche ansprechen. Hier eine kleine Auswahl: A-Team (die Serie) The Big Lebowski Die Hard (PHP) Die Hard (Shell) Fear and Loathing in Las Vegas Walk the Line]]></description>
			<content:encoded><![CDATA[<p>Der Humor von Programmierern ist ja manchmal etwas merkwürdig. Und deshalb wird <a title="Movies as Code" href="http://moviesascode.net/">Movies as Code</a> vermutlich auch hauptsächlich solche ansprechen.</p>
<p>Hier eine kleine Auswahl:</p>
<ul>
<li><a href="http://moviesascode.net/action/a-team-episodes/">A-Team (die Serie)</a></li>
<li><a href="http://moviesascode.net/action/the-big-lebowski/">The Big Lebowski</a></li>
<li><a href="http://moviesascode.net/action/die-hard-2/">Die Hard (PHP)</a></li>
<li><a href="http://moviesascode.net/action/die-hard-5/">Die Hard (Shell)</a></li>
<li><a href="http://moviesascode.net/documentary/fear-and-loathing-in-las-vegas/">Fear and Loathing in Las Vegas</a></li>
<li><a href="http://moviesascode.net/drama/walk-the-line/">Walk the Line</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/04/movies-as-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonista</title>
		<link>http://blog.nik0.de/2012/03/pythonista/</link>
		<comments>http://blog.nik0.de/2012/03/pythonista/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 17:02:42 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[c0ding]]></category>
		<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2058</guid>
		<description><![CDATA[Mit Python habe ich eine Sprache gefunden, die mir durch ihre Klarheit und Möglichkeiten extrem viel Spaß bereitet. Gelernt habe ich Python größtenteils autodidaktisch, schließlich kenne ich bereits einige anderen Programmiersprachen. Man merkt mir dabei durchaus meine Java-Vergangenheit an, besonders beim Erstellen von Klassen. Vermutlich hatte deshalb auch David Goodgers Code Like a Pythonista: Idiomatic <a href='http://blog.nik0.de/2012/03/pythonista/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Mit Python habe ich eine Sprache gefunden, die mir durch ihre Klarheit und Möglichkeiten extrem viel Spaß bereitet. Gelernt habe ich Python größtenteils autodidaktisch, schließlich kenne ich bereits einige anderen Programmiersprachen. Man merkt mir dabei durchaus meine Java-Vergangenheit an, besonders beim Erstellen von Klassen.</p>
<p>Vermutlich hatte deshalb auch David Goodgers <a title="David Goodger: Code Like a Pythonista: Idiomatic Python" href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html">Code Like a Pythonista: Idiomatic Python</a> einen so großen Einfluss auf mich. Ich kehre immer wieder gerne für ein paar Minuten dorthin zurück, gehe in mich und anschließend beschwingt zurück an meine Arbeit.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/03/pythonista/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BrowserQuest</title>
		<link>http://blog.nik0.de/2012/03/browserquest/</link>
		<comments>http://blog.nik0.de/2012/03/browserquest/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 17:28:48 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[Gamez]]></category>
		<category><![CDATA[Browsergame]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2052</guid>
		<description><![CDATA[Die Jungs von Mozilla haben ein MMORPG für den Browser veröffentlicht: BrowserQuest. Eigentlich eine TechDemo für HTML5 Canvas und Websockets, aber dann doch irgendwie ein cooles Browsergame mit einer Reihe von Eastereggs. Wer sich für die Technik interessiert darf hier lesen oder gleich in den Code einsteigen &#8211; ist nämlich OpenSource! Leider läuft es bei <a href='http://blog.nik0.de/2012/03/browserquest/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Die Jungs von Mozilla haben ein MMORPG für den Browser veröffentlicht: <a title="BrowserQuest" href="http://browserquest.mozilla.org/">BrowserQuest</a>. Eigentlich eine TechDemo für HTML5 Canvas und Websockets, aber dann doch irgendwie ein cooles Browsergame mit einer Reihe von Eastereggs. Wer sich für die Technik interessiert darf <a title="BrowserQuest – a massively multiplayer HTML5 (WebSocket + Canvas) game experiment" href="http://hacks.mozilla.org/2012/03/browserquest/">hier</a> lesen oder gleich in den <a title="Github: BrowserQuest" href="https://github.com/mozilla/BrowserQuest">Code</a> einsteigen &#8211; ist nämlich OpenSource!</p>
<div id="attachment_2053" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.nik0.de/wp-content/uploads/2012/03/browserquest_.png"><img class="size-medium wp-image-2053" title="BrowserQuest" src="http://blog.nik0.de/wp-content/uploads/2012/03/browserquest_-300x154.png" alt="" width="300" height="154" /></a><p class="wp-caption-text">BrowserQuest: &quot;You feel the Power of Firefox&quot;</p></div>
<p>Leider läuft es bei mir nur im Firefox, unter Chromium kommt keine Verbindung zustande. Macht aber nix, ist nämlich eher kurzweilig.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/03/browserquest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3. Treffen der Softwerkskammer Rhein-Main</title>
		<link>http://blog.nik0.de/2012/03/swkrm03/</link>
		<comments>http://blog.nik0.de/2012/03/swkrm03/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 17:14:27 +0000</pubDate>
		<dc:creator>Niko</dc:creator>
				<category><![CDATA[c0ding]]></category>
		<category><![CDATA[Persönliches]]></category>
		<category><![CDATA[Code Kata]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[Softwerkskammer]]></category>

		<guid isPermaLink="false">http://blog.nik0.de/?p=2047</guid>
		<description><![CDATA[Am Montag traf sich das Softwerkskammer-Chapter Rhein-Main zum dritten Mal und bescherte einen interessanten Abend. Zu Beginn gabs spontane Vorträge &#8211; mal mit technischer Unterstützung, mal ohne. Die Vortragenden habe gute Arbeit geleistet und Ihre Themen &#8211;  Twitters Bootstrap, Abstracte Datentypen,  Selenium &#8211; so dargestellt, dass man selbst als Themenfremder nicht komplett abgehangen wurde. Besonders <a href='http://blog.nik0.de/2012/03/swkrm03/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Am Montag traf sich das Softwerkskammer-Chapter <a title="Softwerkskammer Rhein-Main" href="http://groupspaces.com/softwerkskammer/wiki/SoftwerkskammerFfm">Rhein-Main</a> zum dritten Mal und bescherte einen interessanten Abend.</p>
<p>Zu Beginn gabs spontane Vorträge &#8211; mal mit technischer Unterstützung, mal ohne. Die Vortragenden habe gute Arbeit geleistet und Ihre Themen &#8211;  <a title="Twitters Bootstrap" href="http://twitter.github.com/bootstrap/">Twitters Bootstrap</a>, Abstracte Datentypen,  <a title="Selenium" href="http://seleniumhq.org/">Selenium</a> &#8211; so dargestellt, dass man selbst als Themenfremder nicht komplett abgehangen wurde. Besonders faszinierend fand ich die abstrakten Datentypen, auch wenn ich bis jetzt keine Anwendungsfall dafür habe. Bedeutet aber vermutlich, dass ich mir mal <a title="99 Bottles of Beer: Eiffel" href="http://99-bottles-of-beer.net/language-eiffel-231.html">Eiffel</a> anschauen muss.</p>
<p>Der zweite Teil des Abends war geprägt durch Hands On. Es sollte eine Code Kata im Team &#8211; als Pair Programming &#8211; gelöst werden. Für mich war beides das erste Mal und ich fands definitiv interessant. Beim Pair Programming habe ich gedacht, dass man sich mehr an der Tastatur abwechselt, aber es war eher so, dass man einer programmierte und vom Rest des Teams Input zur weiteren Vorgehensweise kam. Für die <a title="Code Kata: Roman Numeral" href="http://codingdojo.org/cgi-bin/wiki.pl?KataRomanNumerals">Roman Numeral Kata</a> hatten wir eine Stunde Zeit, natürlich durfte auch danach noch weitergemacht werden <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Wir sind nicht fertig geworden, aber lehrreich fand ich die Zeit auf jeden Fall &#8211; ein Erfolg!</p>
<p>Den Rest des Abends verbrachten wir mit Smalltalk über dieses und jenes, ein gemütlicher Abschluss.<br />
Es ist schön zu sehen, dass die Gruppe wächst und weiterhin offen für alle bleibt. Deshalb freue ich mich schon auf das nächste Treffen <img src='http://blog.nik0.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nik0.de/2012/03/swkrm03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

