<?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>andreas-schlapsi.at</title>
	<atom:link href="http://www.andreas-schlapsi.at/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andreas-schlapsi.at</link>
	<description>Software-Entwicklung, .NET &#38; Co.</description>
	<lastBuildDate>Sat, 17 Sep 2011 16:28:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Zweites Python-Coding-Dojo in Wien</title>
		<link>http://www.andreas-schlapsi.at/2011/09/17/zweites-python-coding-dojo-in-wien/</link>
		<comments>http://www.andreas-schlapsi.at/2011/09/17/zweites-python-coding-dojo-in-wien/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 16:24:54 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1234</guid>
		<description><![CDATA[Am Mittwoch, dem 21. September 2011, findet beim monatlichen Treffen der Python-User-Group Austria im Metalab das nächste Python-Coding-Dojo statt. Python-Entwickler aller Erfahrungsstufen und Python-Interessierte sind herzlich willkommen. Was ist ein Coding-Dojo? Ein Coding-Dojo ist ein Treffen, bei dem eine Reihe von Programmierern zusammenkommen, um an einer Programmieraufgabe zu arbeiten. Dabei geht es hauptsächlich darum, in [...]]]></description>
			<content:encoded><![CDATA[<p>Am Mittwoch, dem 21. September 2011, findet beim <a href="http://www.pyug.at/Treffen/2011-09">monatlichen Treffen</a> der <a href="http://www.pyug.at">Python-User-Group Austria</a> im <a href="http://www.metalab.at">Metalab</a> das nächste <a href="http://www.pyug.at/PythonDojo">Python-Coding-Dojo</a> statt. Python-Entwickler aller Erfahrungsstufen und Python-Interessierte sind herzlich willkommen.</p>
<h2>Was ist ein Coding-Dojo?</h2>
<p>Ein Coding-Dojo ist ein Treffen, bei dem eine Reihe von Programmierern zusammenkommen, um an einer Programmieraufgabe zu arbeiten. Dabei geht es hauptsächlich darum, in einer lockeren Atmosphäre die Aufgabe gemeinsam zu lösen und dabei Neues zu lernen. Ein Dojo ist kein Wettbewerb, sondern der Lerneffekt steht im Vordergrund.</p>
<p>Das Konzept der Coding-Dojos gibt es bereits länger. In den letzten Jahren wurden Coding-Dojos immer beliebter, was unter anderem auch daran liegt, dass sich jeder Teilnehmer einbringen kann.</p>
<p>Mehr Informationen gibt es auf <a href="http://codingdojo.org">http://codingdojo.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/09/17/zweites-python-coding-dojo-in-wien/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Context-Manager in Python</title>
		<link>http://www.andreas-schlapsi.at/2011/09/09/context-manager-in-python/</link>
		<comments>http://www.andreas-schlapsi.at/2011/09/09/context-manager-in-python/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 20:11:37 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1221</guid>
		<description><![CDATA[Beim letzten Python-Coding-Dojo im August war mir aufgefallen, dass man im unittest-Modul der Python-Standardbibliothek Exceptions auf folgende Art testen kann: with self.assertRaises&#40;SomeException&#41;: do_something&#40;&#41; Bisher dachte ich, dass das with-Statement wie das using-Statement in C# funktioniert. Das Äquivalent in C# wäre dann: using &#40;this.AssertRaises&#40;typeof&#40;SomeException&#41;&#41;&#41; DoSomething&#40;&#41;; In C# kann das nicht funktionieren, weil die Dispose-Methode des IDisposable-Objekts, [...]]]></description>
			<content:encoded><![CDATA[<p>Beim letzten <a href="http://www.pyug.at/PythonDojo">Python-Coding-Dojo</a> im August war mir aufgefallen, dass man im <a href="http://docs.python.org/library/unittest.html">unittest-Modul</a> der Python-Standardbibliothek Exceptions auf folgende Art testen kann:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">self</span>.<span style="color: black;">assertRaises</span><span style="color: black;">&#40;</span>SomeException<span style="color: black;">&#41;</span>:
    do_something<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Bisher dachte ich, dass das <a href="http://docs.python.org/reference/compound_stmts.html#the-with-statement">with-Statement</a> wie das <a href="http://msdn.microsoft.com/en-us/library/yh598w02.aspx">using-Statement</a> in C# funktioniert. Das Äquivalent in C# wäre dann:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">AssertRaises</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>SomeException<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>In C# kann das nicht funktionieren, weil die <a href="http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx">Dispose-Methode</a> des <a href="http://msdn.microsoft.com/en-us/library/aax125c9.aspx">IDisposable-Objekts</a>, das von AssertRaises zurückgegeben würde, keine Referenz auf die Exception, die von <code>DoSomething</code> geworfen wurde, erhält.<br />
Wenn man außerdem weitere Eigenschaften der Exception überprüfen will, kann man in Python Folgendes schreiben:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">self</span>.<span style="color: black;">assertRaises</span><span style="color: black;">&#40;</span>SomeException<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> cm:
    do_something<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
the_exception = cm.<span style="color: black;">exception</span>
<span style="color: #008000;">self</span>.<span style="color: black;">assertEquals</span><span style="color: black;">&#40;</span>the_exception.<span style="color: black;">error_code</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Für mich war das einmal ein Grund, mich einmal mit dem with-Statement zu beschäftigen, das es erst seit Python 2.5 gibt.<br />
<span id="more-1221"></span></p>
<h2>Das with-Statement</h2>
<p>Das with-Statement wird verwendet, um vor und nach der Ausführung eines Codeblocks Methoden auf einem Context-Manager auszuführen. Auf diese Art und Weise kann man in Python Ähnliches erreichen wie in C# mit dem using-Muster, z.B.:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">filename = “hello.<span style="color: black;">txt</span>”
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, ‘w’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #008000;">file</span>:
    <span style="color: #008000;">file</span>.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>“first line\n”, “second line\n”<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, ‘r’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> f:
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> f:
        <span style="color: #ff7700;font-weight:bold;">print</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>In älteren Python-Versionen (älter als 2.5) musste man mit <code>try...finally</code> das File-Objekt selbst schließen:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">filename = “hello.<span style="color: black;">txt</span>”
&nbsp;
<span style="color: #008000;">file</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, ‘w’<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #008000;">file</span>.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>“first line\n”, “second line\n”<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">finally</span>:
    <span style="color: #008000;">file</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, ‘r’<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> f:
        <span style="color: #ff7700;font-weight:bold;">print</span> line.<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;">finally</span>:
    f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Aber wie funktioniert with eigentlich?</p>
<h2>Über Pythons und Enten</h2>
<p>Das using-Statement in C# erwartet sich ein Objekt, das die IDisposable-Schnittstelle implementiert. Wenn der dem using-Statement folgende Codeblock verlassen wird, wird die Dispose-Methode auf dem IDisposable-Objekt aufgerufen. Dabei ist es egal, ob im Codeblock eine Exception geworfen wird oder der Codeblock auf normalem Weg verlassen wird.<br />
Interfaces gibt es in Python nicht, aber es gibt <a href="http://de.wikipedia.org/wiki/Duck-Typing">Duck-Typing</a>:</p>
<blockquote><p>
“Wenn es wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente schnattert,<br />
dann ist es eine Ente.”
</p></blockquote>
<p>Das bedeutet, dass der Typ eines Objekts nicht durch die Klasse bestimmt wird, sondern durch die Methoden, die es implementiert. Eine Menge an Methoden, die ein Objekt für ein bestimmtes Feature implementieren muss, heißt Protokoll. Es entspricht somit einem Interface, nur dass man bei einem Protokoll nicht angeben muss, das eine Klasse es implementiert. Solange alle Methoden des Protokolls vorhanden sind, ist alles in Ordnung.</p>
<p>Das with-Statement erwartet sich ein Objekt, das das Context-Management-Protokoll implementiert.</p>
<h2>Der Context-Manager</h2>
<p>Dieses Objekt wird <a href="http://docs.python.org/library/stdtypes.html#typecontextmanager">Context-Manager</a> genannt. Das Context-Management-Protokoll besteht aus zwei Methoden:</p>
<ul>
<li><code>contextmanager.__enter__()</code></li>
<li><code>contextmanager.__exit__(exc_type, exc_value, exc_tb)</code></li>
</ul>
<p>Methoden, die dafür bestimmt sind, von der Python-Runtime selbst aufgerufen zu werden, haben einen Namen, der mit zwei Unterstrichen (__) beginnt und mit zwei Unterstrichen endet.</p>
<p>Die Methode <code>__enter__</code> wird aufgerufen, bevor der Codeblock aufgerufen wird, die Methode <code>__exit__</code> danach.</p>
<p>Ein Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> HelloContext:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, text<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._text = text
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __enter__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Enter”
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __exit__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, exc_type, exc_val, exc_tb<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Exit”
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> show<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">self</span>._text
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> HelloContext<span style="color: black;">&#40;</span>“Hello, world<span style="color: #66cc66;">!</span>”<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> hc:
    hc.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Zugegeben, ein wenig viel Code für “Hello, world!”, aber es geht ja hier um den Context-Manager. Das, was die Methode <code>__enter__</code> zurückgibt, wird im with-Statement der Variable zugewiesen, die nach der Instanzierung des Context-Managers mit as angegeben ist. In unserem Beispiel ist das <code>hc</code>, das auf den Context-Manager verweist, weil <code>__enter__</code> den Context-Manager (self) zurückgibt. Das kann anders sein:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Hello:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._name = name
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> show<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Hello, <span style="color: #66cc66;">%</span>s<span style="color: #66cc66;">!</span>” <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>._name
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> HelloContext:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._name = name
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __enter__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Enter”
        <span style="color: #ff7700;font-weight:bold;">return</span> Hello<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __exit__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, exc_type, exc_value, exc_tb<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Exit”
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> HelloContext<span style="color: black;">&#40;</span>“world”<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> hc:
    hc.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Die Variable <code>hc</code> verweist auf eine Instanz der Klasse <code>Hello</code>, die von der Methode <code>__enter__</code> des Context-Managers erzeugt und zurückgegeben wird. Das with-Statement ruft trotzdem <code>__enter__</code> und <code>__exit__</code> am Context-Manager auf.</p>
<h2>Die Behandlung von Exceptions</h2>
<p>In den bisherigen Beispielen gibt die Methode <code>__exit__</code> <code>False</code> zurück. Was bedeutet das? Und was sind das für Argumente, die an <code>__exit__</code> übergeben werden?<br />
Wenn alles gut geht und der ausgeführte Codeblock keine Exception wirft, wird an <code>__exit__</code> für alle Argumente (außer self natürlich) <code>None</code> übergeben und der Rückgabewert ignoriert. Wurde eine Exception geworfen, wird an <code>__exit__</code> der Typ, der Wert und die <a href="http://docs.python.org/library/traceback.html">Traceback-Informationen</a> (entspricht in .NET dem Stacktrace) übergeben.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> HelloContext:
    <span style="color: #ff7700;font-weight:bold;">def</span> __enter__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Enter”
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __exit__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, exc_type, exc_value, exc_tb<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Exit”
        <span style="color: #ff7700;font-weight:bold;">if</span> exc_type <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> exc_type
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>exc_value<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> exc_tb
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyError<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, message, item<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">message</span> = message
        <span style="color: #008000;">self</span>.<span style="color: black;">item</span> = item
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">message</span> + ‘ ‘ + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">item</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> HelloContext<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> “Hello, world<span style="color: #66cc66;">!</span>”
    <span style="color: #ff7700;font-weight:bold;">raise</span> MyError<span style="color: black;">&#40;</span>“<span style="color: #008000;">Exception</span><span style="color: #66cc66;">!</span>”, <span style="color: #ff4500;">42</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> “But life goes on...”</pre></div></div>

<p>Wenn man diesen Code ausführt, wird folgendes ausgegeben:</p>
<p><pre><code>
Enter
Hello, world!
Exit
&lt;class ‘__main__.MyError’&gt;
Exception! 42
&lt;traceback object at 0x1e45320&gt;
But life goes on...
</code></pre></p>
<p>Der Rückgabewert von <code>__exit__</code> gibt an, ob die Exception unterdrückt werden soll. Deshalb wird in unserem Beispiel der Text “But life goes on&#8230;” ausgegeben. Würde <code>__exit__</code> <code>False</code> zurückgeben, käme stattdessen der normale Python-Traceback und das Programm würde unterbrochen.</p>
<h2>Verschachtelte Context-Manager</h2>
<p>Das with-Statement kann mit mehr als einem Context-Manager aufgerufen werden:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘a.<span style="color: black;">txt</span>’, ‘r’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> a, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘b.<span style="color: black;">txt</span>’, ‘w’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> b:
    b.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span>a.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Dieser Code ist gleichbedeutend mit Folgendem:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘a.<span style="color: black;">txt</span>’, ‘r’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> a:
    <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘b.<span style="color: black;">txt</span>’, ‘w’<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> b:
        b.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span>a.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>Context-Manager in der Standardbibliothek</h2>
<p>Neben dem bereits erwähnten <code>unittest.TestCase.assertRaises</code> und <code>io.open</code> gibt es noch weitere Beispiele für Context-Manager in der Python-Standardbibliothek, z.B. im <a href="http://docs.python.org/library/threading.html">Modul threading</a>. Objekte vom Typ Lock, RLock, Condition, Semaphore und BoundedSemaphore können mit dem with-Statement benutzt werden.</p>
<p>Ein weiteres Modul mit einem Context-Manager ist das <a href="http://docs.python.org/library/decimal.html">Modul decimal</a>, das bei der Fließkommaarithmetik unterstützt. Mit decimalcontext kann man einen Bereich mit anderer Genauigkeit definieren als der umgebende Code.</p>
<h2>Das Modul contextlib der Standardbibliothek</h2>
<p>Die Python-Standardbibliothek kennt das <a href="http://docs.python.org/library/contextlib.html">Modul contextlib</a>. Es enthält einige Hilfsmittel für allgemeine Aufgaben, die mit dem with-Statement zu tun haben.</p>
<h3>Der contextmanager-Decorator</h3>
<p>Eines dieser Hilfsmittel ist ein Decorator, der die Implementierung eines Context-Managers vereinfacht. Wir können unser obiges Beispiel auch so schreiben:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> contextlib <span style="color: #ff7700;font-weight:bold;">import</span> contextmanager
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
&nbsp;
@contextmanager
<span style="color: #ff7700;font-weight:bold;">def</span> hello<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> “Enter”
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #ff7700;font-weight:bold;">yield</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> “Exit”
    <span style="color: #ff7700;font-weight:bold;">except</span>:
        exc_type, exc_value, exc_tb = <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> exc_type
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>exc_value<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> exc_tb
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyError<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, message, item<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">message</span> = message
        <span style="color: #008000;">self</span>.<span style="color: black;">item</span> = item
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">message</span> + ‘ ‘ + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">item</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> hello<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> “Hello, world<span style="color: #66cc66;">!</span>”
    <span style="color: #ff7700;font-weight:bold;">raise</span> MyError<span style="color: black;">&#40;</span>“<span style="color: #008000;">Exception</span><span style="color: #66cc66;">!</span>”, <span style="color: #ff4500;">42</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> “But life goes on...”</pre></div></div>

<p>Ein früheres Beispiel würde so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> contextlib <span style="color: #ff7700;font-weight:bold;">import</span> contextmanager
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Hello:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._name = name
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> show<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Hello, <span style="color: #66cc66;">%</span>s<span style="color: #66cc66;">!</span>” <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>._name
&nbsp;
&nbsp;
@contextmanager
<span style="color: #ff7700;font-weight:bold;">def</span> hello<span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> “Enter”
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #ff7700;font-weight:bold;">yield</span> Hello<span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">finally</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> “Exit”
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> hello<span style="color: black;">&#40;</span>“world”<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> h:
    h.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Wenn bei <code>yield</code> ein Argument angegeben wird, kann dieses beim with-Statement mit as referenziert werden.</p>
<h3>Der Context-Manager closing</h3>
<p>Ein weiteres wichtiges Hilfsmittel aus dem contextlib-Modul ist die Klasse <code>closing</code>. Damit kann man Klassen wrappen, die zwar eine Methode mit dem Namen <code>close</code> haben, aber selbst kein Context-Manager sind und daher die Methoden <code>__enter__</code> und <code>__exit__</code> nicht implementieren. In der Methode <code>__exit__</code> wird die close-Methode des gewrappten Objekts aufgerufen.</p>
<p>Zum Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> contextlib <span style="color: #ff7700;font-weight:bold;">import</span> closing
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> closing<span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>‘http://www.<span style="color: black;">python</span>.<span style="color: black;">org</span>’<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> page:
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> page:
        <span style="color: #ff7700;font-weight:bold;">print</span> line</pre></div></div>

<h3>Der nested-Decorator</h3>
<p>Der nested-Decorator verbindet mehrere Context-Manager zu einem und ermöglicht somit verschachtelte Context-Manager. Seit Version 2.7 bzw. 3.1 unterstützt das with-Statement verschachtelte Context-Manager und dieser Decorator wurde damals als deprecated markiert und sollte daher nicht mehr verwendet werden. Wenn man ältere Python-Versionen unterstützen muss, kann man den nested-Decorator z.B. so anwenden:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> contextlib <span style="color: #ff7700;font-weight:bold;">import</span> nested
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> nested<span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘a.<span style="color: black;">txt</span>’, ‘r’<span style="color: black;">&#41;</span>, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘b.<span style="color: black;">txt</span>’, ‘w’<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> cms:
    cms<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span>cms<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Ein Vorteil des nested-Decorators gegenüber dem with-Statement ist, dass man eine Liste von Context-Manager angegeben kann:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> contextlib <span style="color: #ff7700;font-weight:bold;">import</span> nested
&nbsp;
cms = <span style="color: black;">&#91;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘a.<span style="color: black;">txt</span>’, ‘r’<span style="color: black;">&#41;</span>, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>‘b.<span style="color: black;">txt</span>’, ‘w’<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> nested<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>cms<span style="color: black;">&#41;</span>:
    cms<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span>cms<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Der Stern bei nested ist notwendig, damit an nested die Elemente der Liste als Argumente übergeben werden und nicht die Liste als einzelnes Argument.</p>
<p>Mehr über das Modul contextlib findet man in der <a href="http://docs.python.org/library/contextlib.html">Referenzdokumentation</a> oder im <a href="http://hg.python.org/cpython/file/2.7/Lib/contextlib.py">Source-Code</a>.</p>
<h2>Python 3</h2>
<p>In Python 3 hat sich bei der Funktionsweise der Context-Manager nichts geändert. Die Beispiele in diesem Artikel wurden mit Python 2.7 getestet und müssten für Python 3 angepasst werden, weil nicht alle benutzten Module und Statements mit Python 3 kompatibel sind.</p>
<h2>Zusammenfassung</h2>
<p>Obwohl es auf dem ersten Blick so aussieht wie das using-Statement in .NET, ist Pythons with-Statement wesentlich mächtiger. Die IDisposable-Schnittstelle ermöglicht nur das Aufräumen von Ressourcen, wenn ein Codeblock verlassen wird. Ein Context-Manager kann schon am Anfang eines Codeblocks aktiv werden. Außerdem kann ein Context-Manager beim Verlassen eines Codeblocks eine eventuell aufgetretene Exception behandeln und unterdrücken. So ist auch klar, warum man in Unit-Tests mit dem with-Statement Exceptions testen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/09/09/context-manager-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wenn .NET-Entwickler über den Tellerrand schauen</title>
		<link>http://www.andreas-schlapsi.at/2011/08/24/wenn-net-entwickler-uber-den-tellerrand-schauen/</link>
		<comments>http://www.andreas-schlapsi.at/2011/08/24/wenn-net-entwickler-uber-den-tellerrand-schauen/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 19:41:04 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1201</guid>
		<description><![CDATA[In letzter Zeit ist es in der .NET-Welt wieder modern, sich mit anderen Programmiersprachen und Plattformen auseinanderzusetzen. Zunächst war es Ruby, über das geschrieben und berichtet wurde. Beim letzten .NET Open Space Süd in Karlsruhe gab es je eine Session über Ruby und Ruby on Rails. In letzter Zeit hört man auch immer mehr von [...]]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit ist es in der .NET-Welt wieder modern, sich mit anderen Programmiersprachen und Plattformen auseinanderzusetzen. Zunächst war es <a href="http://www.ruby-lang.org">Ruby</a>, über das geschrieben und berichtet wurde. Beim letzten <a href="http://karlsruhe.netopenspace.de/2011/MainPage.ashx">.NET Open Space Süd in Karlsruhe</a> gab es je eine Session über <a href="http://rubyonrails.org/">Ruby und Ruby on Rails</a>. In letzter Zeit hört man auch immer mehr von <a href="http://www.python.org/">Python</a>.</p>
<p>Ich kenne Python seit Version 1.5.2, also schon seit über 10 Jahren. Ich habe mich aber in den letzten Jahren nicht damit beschäftigt. Vor ca. 1 Jahr habe ich beschlossen, mich wieder mehr mit Python zu beschäftigen.</p>
<p>Am letzten Montag, dem 22. August 2011, hielt <a href="http://dotnet-forum.de/blogs/rainerschuster/">Rainer Schuster</a> im Rahmen der <a href="http://online-usergroup.de/">.NET Online User Group</a> einen <a href="http://online-usergroup.de/termine.20110822.ashx">Online-Vortrag über Python</a>. Einen Tag darauf reagierte <a href="http://blog.schelian.de/2011/08/phyton-leicht-zu-durchschauen-these-oder-wirklichkeit/">Hans-Peter Schelian mit einem Blogartikel</a>, nachdem er sich einen Tag lang mit Python beschäftigt hat, “um den Hype um diese Sprache besser verstehen zu können”.<br />
<span id="more-1201"></span></p>
<h2>Python ist kein Hype</h2>
<p>Python 1.0 wurde lange vor .NET 1.0 veröffentlicht, nämlich im Jänner 1994 (siehe <a href="http://en.wikipedia.org/wiki/History_of_Python">Wikipedia</a>). Python wird seit vielen Jahren von namhaften Organisationen verwendet, darunter Google, Yahoo!, NASA und CERN (siehe <a href="http://en.wikipedia.org/wiki/Python_(programming_language)#Usage">Wikipedia</a>). Daher glaube ich nicht dass Python ein Hype ist, der bald wieder abflaut. Python ist eine bewährte Technologie, die ihre Tauglichkeit bereits vielfach bewiesen hat.<br />
Python ist leicht zu durchschauen</p>
<p>Es wird immer wieder behauptet, dass Python-Code für Programmieranfänger leicht zu durchschauen und zu lesen sei. Ich glaube, dass das auch stimmt. Möglicherweise sieht man das anders, wenn man die Syntax von C-basierten Programmiersprachen wie C#, C/C++ oder Java gewöhnt ist. Auch der Unterschied von Hello-World-Programmien in Python und in C# zeigen, dass C# sehr viel unnötiges Rauschen enthält.</p>
<p>Hier ein bekanntes Programm in Python:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #ff7700;font-weight:bold;">print</span> “Hello, world<span style="color: #66cc66;">!</span>”</pre></div></div>

<p>Und hier in C#:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Hello
<span style="color: #008000;">&#123;</span>
  <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #000000;">System</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Console</span><span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span> <span style="color: #008000;">&#40;</span>“Hello, world<span style="color: #008000;">!</span>”<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Natürlich wächst der &#8220;Signalanteil&#8221; bei größeren Programmen. Aber als Programmieranfänger muss man bei C# für einfache Programme wesentlich mehr wissen als bei Python.</p>
<h2>Python wird vielseitig eingesetzt</h2>
<p>Jeder, der sich ein Video auf Youtube.com ansieht, verwendet Software, die zumindest teilweise in Python geschrieben ist. Jeder, der in diesem Blog einen Kommentar schreiben möchte, verwendet Disqus, das das Python-Webframework Django verwendet. Jeder, der Ubuntu Linux installiert hat, hat Python-Software verwendet. Die verteilten Versionsverwaltungssysteme Mercurial und Bazaar sind in Python geschrieben. Die Windows-GUIs dafür, TortoiseHG und TortoiseBzr, sind ebenfalls in Python geschrieben. Seit Jahren verwenden Hersteller von 3D-Animationssoftware Python als eingebettete Skriptsprache. </p>
<p>Es gibt einen <a href="http://lamsonproject.org/">Mailserver in Python</a>. Es gibt Klassen in der <a href="http://docs.python.org/library/">Python-Standardbibliothek</a>, die die <a href="http://docs.python.org/library/smtpd.html">Implementierung eines SMTP-Servers vereinfachen</a>.</p>
<p>Und wenn wir schon bei E-Mails sind: <a href="http://www.list.org/">Mailman</a> ist ein beliebter Mailinglistenmanager, der sogar vom Mono-Team verwendet wird (z.B. <a href="http://lists.ximian.com/mailman/listinfo/mono-list">Mono-list</a>). Und wenn man <a href="http://android.xamarin.com/">Android-Apps mit C#</a> entwickeln will und sich an die MonoDroid-Mailingliste anmeldet, wird man ebenfalls <a href="http://lists.ximian.com/mailman/listinfo/monodroid">Mailman verwenden</a>.</p>
<h2>Kann man Python für größere Projekte verwenden?</h2>
<p>Ja, man kann. Es ist aber nicht jedermanns Sache. Wer lieber eine statische Programmiersprache verwendet, wird keine Freude mit Python haben.</p>
<p>Ein Compiler ersetzt keine Unit- und Integrationstests. Auch wenn der Code ohne Fehler compiliert werden kann und daher keine syntaktischen Fehler enthalten sind, können noch immer semantische Fehler enthalten sein. Daher sind für größere Projekte automatisierte Unit-Tests in der professionellen Software-Entwicklung Pflicht. In einer dynamischen Programmiersprache tut man sich da in einigen Fällen leichter. Dafür braucht man aber erfahrene Software-Entwickler, die sich damit auskennen.</p>
<p>Übrigens, in der Python-Standardbibliothek gibt es <a href="http://docs.python.org/library/unittest.html">zwei</a> <a href="http://docs.python.org/library/doctest.html">Testframeworks</a> für die Automatisierung von Tests.</p>
<h2>Fazit</h2>
<p>Also Python ist kein Hype, dafür ist es schon zu lange in Verwendung. Python hat möglicherweise für Programmieranfänger eine einfachere Syntax und es wird in vielen Projekten verwendet. Außerdem lassen sich damit auch größere Programme realisieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/08/24/wenn-net-entwickler-uber-den-tellerrand-schauen/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Python-Coding-Dojo in Wien</title>
		<link>http://www.andreas-schlapsi.at/2011/08/19/python-coding-dojo-in-wien/</link>
		<comments>http://www.andreas-schlapsi.at/2011/08/19/python-coding-dojo-in-wien/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 20:12:33 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1195</guid>
		<description><![CDATA[Am Sonntag, dem 21.&#160;August&#160;2011, findet beim August-Treffen der Python-User-Group Austria im Metalab ein Python-Coding-Dojo statt. Voraussichtlich werden wir das FizzBuzz-Kata trainieren. Python-Entwickler aller Erfahrungsstufen und Python-Interessierte sind herzlich willkommen. Was ist ein Coding-Dojo? Ein Coding-Dojo ist ein Treffen, bei dem eine Reihe von Programmierern zusammenkommen, um an einer Programmieraufgabe zu arbeiten. Dabei geht es hauptsächlich [...]]]></description>
			<content:encoded><![CDATA[<p>Am Sonntag, dem 21.&nbsp;August&nbsp;2011, findet beim August-Treffen der <a href="http://pyug.at">Python-User-Group Austria</a> im <a href="http://www.metalab.at">Metalab</a> ein Python-Coding-Dojo statt. Voraussichtlich werden wir das <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz-Kata</a> trainieren. Python-Entwickler aller Erfahrungsstufen und Python-Interessierte sind herzlich willkommen.</p>
<h2>Was ist ein Coding-Dojo?</h2>
<p>Ein Coding-Dojo ist ein Treffen, bei dem eine Reihe von Programmierern zusammenkommen, um an einer Programmieraufgabe zu arbeiten. Dabei geht es hauptsächlich darum, in einer lockeren Atmosphäre die Aufgabe gemeinsam zu lösen und dabei Neues zu lernen. Ein Dojo ist kein Wettbewerb, sondern der Lerneffekt steht im Vordergrund.</p>
<p>Das Konzept der Coding-Dojos gibt es bereits länger. In den letzten Jahren wurden Coding-Dojos immer beliebter, was unter anderem auch daran liegt, dass sich jeder Teilnehmer einbringen kann.</p>
<p>Mehr Informationen gibt es auf <a href="http://codingdojo.org">http://codingdojo.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/08/19/python-coding-dojo-in-wien/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD und CQRS mit Greg Young in Wien</title>
		<link>http://www.andreas-schlapsi.at/2011/08/04/ddd-und-cqrs-mit-greg-young-in-wien/</link>
		<comments>http://www.andreas-schlapsi.at/2011/08/04/ddd-und-cqrs-mit-greg-young-in-wien/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 21:35:50 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1186</guid>
		<description><![CDATA[(Gastbeitrag von Jörg Egretzberger) Am 16. September spricht Greg Young auf der Community-Konferenz &#8220;Professional .Net 2011&#8243; in Wien über Domain Driven Design (DDD) und wie man dieses in Projekten mit der von ihm beschriebenen Softwarearchitektur Command and Query Responsibility Segregation (CQRS) erfolgreich umsetzen kann. Aus Wikipedia: &#8220;Domain-Driven Design ist nicht nur eine Technik oder Methode. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>(Gastbeitrag von Jörg Egretzberger)</strong></p>
<p>Am 16. September spricht Greg Young auf der Community-Konferenz &#8220;Professional .Net 2011&#8243; in Wien über Domain Driven Design (DDD) und wie man dieses in Projekten mit der von ihm beschriebenen Softwarearchitektur Command and Query Responsibility Segregation (CQRS) erfolgreich umsetzen kann.</p>
<p>Aus Wikipedia:</p>
<blockquote><p>
&#8220;Domain-Driven Design ist nicht nur eine Technik oder Methode. Es ist viel mehr eine Denkweise und Priorisierung zur Steigerung der Produktivität von Softwareprojekten im Umfeld komplexer fachlicher Zusammenhänge.&#8221;
</p></blockquote>
<p>In DDD möchte man nicht nur Daten manipulieren (CRUD), sondern auch in einer gemeinsamen Sprache festhalten aus welchem Grund sich Daten geändert haben und welches Verhalten das System hat. Die Intention der Benutzeraktion soll erfasst werden. So sind beispielsweise die Aktionen &#8220;Kunde eröffnet ein Konto&#8221; und &#8220;Geld wird abgehoben&#8221; wesentliche Aktionen eines Bankensystems. Mit DDD kann das System und dessen Verhalten (Behavior) modelliert werden.</p>
<p>Hinter diesen Aktionen stecken allerdings oftmals auch Business-Regeln wie etwa, dass nur max. 3.000 Euro pro Tag über Automaten von einem Konto behoben werden können. CQRS bietet eine elegante und skalierbare Lösung um dies in Software umzusetzen. Die Business Regeln enden nicht im Client, sondern werden zentral in der Domäne (dort wo der meiste Business Nutzen entsteht) gehalten.</p>
<p>Greg zeigt auch, wie dadurch das automatisierte Testen mit Unit Tests vereinfacht und expliziter wird. Weiters wird auch aufgezeigt, wie durch das Speichern der durchgeführten Aktionen zu einem späteren Zeitpunkt Auswertungen die im Vorhinein nicht definiert wurden, einfach umgesetzt werden können. </p>
<p>Beispiel: der Bankdirektor möchte eine Auswertung wie viele Kunden ihr Bankkonto schließen, nachdem sie umgezogen sind um durch Werbemaßnahmen dem gegenzusteuern. Dabei handelt es sich um einen wesentlichen Business-Vorteil.</p>
<p>CQRS wird nicht nur in sehr großen Softwareprojekte eingesetzt, die enorme Skalierbarkeit benötigen. Es hilft bereits bei Projekten die nicht nur &#8220;Create, Read, Update, Delete&#8221; Befehle haben, sondern bei denen auch Validierung und Business Regeln umgesetzt werden sollen.</p>
<p>Ganz treu dem Motto der heurigen Professional .Net: Einfach bessere Software entwickeln!</p>
<p>Mehr Infos zur Professional .Net 2011 findet ihr unter <a href="http://www.dotnet-austria.at">www.dotnet-austria.at</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/08/04/ddd-und-cqrs-mit-greg-young-in-wien/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Link-Einblick #1</title>
		<link>http://www.andreas-schlapsi.at/2011/06/10/link-einblick-1/</link>
		<comments>http://www.andreas-schlapsi.at/2011/06/10/link-einblick-1/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 23:07:49 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[JavaScript & HTML]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1147</guid>
		<description><![CDATA[Ich habe fast immer so viele Seiten in meinem Browser offen, dass ich meistens nicht weiß, wann ich sie jemals lesen soll. In meinem Blog ist außerdem schon länger nichts mehr passiert. Ich gewähre euch hiermit in unregelmäßigen Abständen Einblick in meine offenen Tabs. Web Development, HTML5 und JavaScript CoffeeScript Basics (RailsCasts) 10 CoffeeScript One [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe fast immer so viele Seiten in meinem Browser offen, dass ich meistens nicht weiß, wann ich sie jemals lesen soll. In meinem Blog ist außerdem schon länger nichts mehr passiert. Ich gewähre euch hiermit in unregelmäßigen Abständen Einblick in meine offenen Tabs.</p>
<h2>Web Development, HTML5 und JavaScript</h2>
<ul>
<li><a href="http://railscasts.com/episodes/267-coffeescript-basics">CoffeeScript Basics</a> (RailsCasts)</li>
<li><a href="http://ricardo.cc/2011/06/02/10-CoffeeScript-One-Liners-to-Impress-Your-Friends.html">10 CoffeeScript One Liners to Impress Your Friends</a> (Ricardo Tomasi)</li>
<li><a href="http://addyosmani.com/toolsforjqueryapparchitecture/">Tools For jQuery Application Architecture (Extended Slides)</a> (Addy Osmani)</li>
<li><a href="http://blog.vjeux.com/2011/javascript/how-prototypal-inheritance-really-works.html">Javascript – How Prototypal Inheritance really works</a> (Christopher Chedeau)</li>
<li><a href="http://functionsource.com/post/a-prototypal-discussion">A Prototypal Discussion</a> (Dion Almaer)</li>
<li><a href="http://blog.chromium.org/2011/05/chrome-developer-tools-put-javascript.html">Chrome Developer Tools: Put JavaScript memory under control</a> (Mikhail Naganov)</li>
<li><a href="http://thechangelog.com/post/6108679805/episode-0-6-2-ironjs-with-fredrik-holmstrom">Episode 0.6.2 &#8211; IronJS with Fredrik Holmström</a> (The Changelog, Wynn Netherland)</li>
<li><a href="http://net.tutsplus.com/tutorials/html-css-techniques/responsive-web-design-a-visual-guide/">Responsive Web Design: A Visual Guide</a> (Andrew Gormley)</li>
<li><a href="http://blogs.sitepoint.com/a-basic-html5-template/">A Basic HTML5 Template</a> (Louis Lazaris)</li>
</ul>
<h2>F# und Funktionale Programmierung</h2>
<ul>
<li><a href="http://fssnip.net/">F# Snippets</a></li>
<li><a href="http://blogs.msdn.com/b/dsyme/archive/2011/05/30/nice-f-syntax-for-rx-reactive-extensions.aspx">Nice F# Syntax for Rx (Reactive Extensions)</a> (Don Syme)</li>
</ul>
<h2>ASP.NET</h2>
<ul>
<li><a href="http://www.codethinked.com/what-asp.net-mvc-could-learn-from-rails">What ASP.NET MVC Could Learn From Rails</a> (Justin Etheredge)</li>
<li><a href="http://wekeroad.com/post/6012451652/referencing-routes-in-asp-net-mvc-the-rails-way">Referencing Routes in ASP.NET MVC The Rails Way</a> (Rob Conery)</li>
</ul>
<h2>.NET-Community Wien</h2>
<ul>
<li><a href="http://www.codefest.at/post/2011/06/07/Professional-NET-2011e28093Die-NET-Community-Konferenz-in-Wien.aspx">Professional .NET 2011–Die .NET Community Konferenz in Wien</a> (Mario Meir-Huber)</li>
<li><a href="http://www.codefest.at/post/2011/06/07/Wien-14-Mai-2011-18h-Usergroup-treffen-jQuery.aspx">Wien, 14. Juni 2011, 18h: Usergroup treffen jQuery</a> (Mario Meir-Huber)</li>
</ul>
<h2>Methodology</h2>
<ul>
<li><a href="https://elearning.industriallogic.com/gh/submit?Action=PageAction&#038;album=blog2009&#038;path=blog2009/2011/horizontalSlicing&#038;devLanguage=Java">Return of the Horizontal Slice</a> (Joshua Kerievsky)</li>
<li><a href="http://www.samihonkonen.fi/2011/05/breaking-team-silos-with-kanban/">Breaking Team Silos With Kanban</a> (Sami Honkonen)</li>
<li><a href="http://arlobelshee.com/essay/quantifying-technical-debt">Quantifying Technical Debt</a> (Arlo Belshee)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/06/10/link-einblick-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CQRS und die Oberfläche</title>
		<link>http://www.andreas-schlapsi.at/2011/03/11/cqrs-und-die-oberflache/</link>
		<comments>http://www.andreas-schlapsi.at/2011/03/11/cqrs-und-die-oberflache/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 22:44:54 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1141</guid>
		<description><![CDATA[Am 15.&#160;März gibt es das nächste Treffen der .NET&#160;Open&#160;Space&#160;Austria User&#160;Group. Dieses Mal gibt es den dritten Teil der CQRS-Serie mit dem Titel &#8220;CQRS und die Oberfläche&#8221;. Jörg und Adrian zeigen uns, wie die Commands zur Domäne kommen und in weiterer Folge über den Event-Store und die Leseseite wieder zurück zur Oberfläche. Dieses Mal findet das [...]]]></description>
			<content:encoded><![CDATA[<p>Am 15.&nbsp;März gibt es das nächste Treffen der .NET&nbsp;Open&nbsp;Space&nbsp;Austria User&nbsp;Group. Dieses Mal gibt es den dritten Teil der CQRS-Serie mit dem Titel &#8220;CQRS und die Oberfläche&#8221;.  Jörg und Adrian zeigen uns, wie die Commands zur Domäne kommen und in weiterer Folge über den Event-Store und die Leseseite wieder zurück zur Oberfläche.</p>
<p>Dieses Mal findet das Treffen bei meinem Arbeitgeber, der Firma <a href="http://www.rubicon.eu">rubicon informationstechnologie gmbh</a> statt.</p>
<p>Details gibt es wie immer auf der <a href="http://dotnetopenspace.ning.com/forum/topics/1532011-cqrs-und-die">NING-Seite der Gruppe</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/03/11/cqrs-und-die-oberflache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Treffen der .NET Open Space Austria: CQRS und Event-Sourcing</title>
		<link>http://www.andreas-schlapsi.at/2011/01/07/treffen-der-net-open-space-austria-cqrs-und-event-sourcing/</link>
		<comments>http://www.andreas-schlapsi.at/2011/01/07/treffen-der-net-open-space-austria-cqrs-und-event-sourcing/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 20:22:23 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[event sourcing]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1131</guid>
		<description><![CDATA[Am 11.&#160;Jänner findet das nächste Treffen der .NET Open Space Austria User Group statt. Dieses Mal stellen uns Jörg und Adrian das CQRS-Pattern und Event-Sourcing vor. Zur Vorbereitung hat Jörg die Informationen auf der Seite http://www.cqrsinfo.com vorgeschlagen. Das Treffen findet bei der Unisys im Andromedatower statt. Details gibt es wie immer auf der NING-Seite der [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.andreas-schlapsi.at/wp-content/uploads/2011/01/cqrs.jpg" alt="" title="CQRS" width="150" height="150" class="alignleft size-full wp-image-1132" />Am 11.&nbsp;Jänner findet das nächste Treffen der .NET Open Space Austria User Group statt. Dieses Mal stellen uns Jörg und Adrian das CQRS-Pattern und Event-Sourcing vor. Zur Vorbereitung hat Jörg die Informationen auf der Seite <a href="http://cqrsinfo.com">http://www.cqrsinfo.com</a> vorgeschlagen.</p>
<p>Das Treffen findet bei der Unisys im Andromedatower statt.</p>
<p>Details gibt es wie immer auf der <a href="http://dotnetopenspace.ning.com/forum/topics/1112010-cqrs-event-sourcing">NING-Seite der Gruppe</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2011/01/07/treffen-der-net-open-space-austria-cqrs-und-event-sourcing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Treffen der .NET Open Space Austria: F# und funktionale Programmierung</title>
		<link>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/</link>
		<comments>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 21:48:25 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Funktionale Programmierung]]></category>
		<category><![CDATA[Wien]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1121</guid>
		<description><![CDATA[Am 7. Dezember findet wieder ein Treffen der .NET Open Space Austria User Group statt. Dieses Mal bereite ich etwas über das Thema F# und funktionale Programmierung vor. Das Treffen findet bei Microsoft Österreich GmbH statt. Details gibt es wie immer auf der NING-Seite der Gruppe und auf der Codefest-Seite.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.andreas-schlapsi.at/wp-content/uploads/2010/12/LAMBDA_capital_and_small.png"><img src="http://www.andreas-schlapsi.at/wp-content/uploads/2010/12/LAMBDA_capital_and_small-150x150.png" alt="" title="LAMBDA_(capital_and_small)" width="150" height="150" class="alignleft size-thumbnail wp-image-1124" /></a>Am 7. Dezember findet wieder ein Treffen der .NET Open Space Austria User Group statt. Dieses Mal bereite ich etwas über das Thema F# und funktionale Programmierung vor.</p>
<p>Das Treffen findet bei Microsoft Österreich GmbH statt.</p>
<p>Details gibt es wie immer auf der <a href="http://dotnetopenspace.ning.com/forum/topics/07122010-dotnet">NING-Seite der Gruppe</a> und auf der <a href="http://www.codefest.at/post/2010/11/26/07122010-Wien-F-und-funktionale-Programmierung-in-C-Treffen-der-NET-Open-Space-Austria.aspx">Codefest-Seite</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2010/12/04/treffen-der-net-open-space-austria-f-und-funktionale-programmierung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Source-Code von IronPython jetzt auf Github</title>
		<link>http://www.andreas-schlapsi.at/2010/11/25/source-code-von-ironpython-jetzt-auf-github/</link>
		<comments>http://www.andreas-schlapsi.at/2010/11/25/source-code-von-ironpython-jetzt-auf-github/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 22:49:13 +0000</pubDate>
		<dc:creator>Andreas Schlapsi</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[IronPython]]></category>

		<guid isPermaLink="false">http://www.andreas-schlapsi.at/?p=1095</guid>
		<description><![CDATA[Vor einigen Wochen hat Microsoft die Open-Source-Projekte IronPython und IronRuby an die Community übergeben. Der Quellcode von IronPython wurde bis jetzt in TFS auf Codeplex verwaltet. IronRuby verwendete schon länger ein Repository auf Github für die Quellcodeverwaltung. Darin befindet sich auch die DLR (Dynamic Language Runtime), die von beiden Projekten benötigt wird. Das IronPython-Team entschied [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1096" class="wp-caption alignleft" style="width: 160px"><a href="http://www.andreas-schlapsi.at/wp-content/uploads/2010/11/python.jpg"><img src="http://www.andreas-schlapsi.at/wp-content/uploads/2010/11/python-150x150.jpg" alt="Foto: Nasmac (http://www.flickr.com/photos/nasmac/531138641/)" title="Grüne Baumpython" width="150" height="150" class="size-thumbnail wp-image-1096" /></a><p class="wp-caption-text">Foto: <a href='http://www.flickr.com/photos/nasmac/531138641/'>Nasmac</a></p></div>Vor einigen Wochen hat Microsoft die Open-Source-Projekte IronPython und IronRuby <a href="http://blogs.msdn.com/b/jasonz/archive/2010/10/21/new-components-and-contributors-for-ironpython-and-ironruby.aspx">an die Community übergeben</a>. Der Quellcode von IronPython wurde bis jetzt in TFS auf <a href="www.codeplex.com">Codeplex</a> verwaltet.</p>
<p>IronRuby verwendete schon länger ein Repository auf <a href="http://github.com">Github</a> für die Quellcodeverwaltung. Darin befindet sich auch die DLR (Dynamic Language Runtime), die von beiden Projekten benötigt wird. Das IronPython-Team entschied daher, dieses <a href="https://github.com/IronLanguages/main">Repository mitzubenutzen</a>. Das Issue-Tracking bleibt aber <a href="http://ironpython.codeplex.com/">auf Codeplex</a>.</p>
<p>Die Mehrheit der IronPython-Community <a href="http://lists.ironpython.com/pipermail/users-ironpython.com/2010-October/013921.html">sprach sich für BitBucket und damit Mercurial aus</a>, das in der Python-Community beliebter ist. Für alle, die am IronPython-Quellcode interessiert sind, aber nicht auf Git umsteigen möchten, hat <a href="http://jdhardy.blogspot.com/">Jeff Hardy</a> einen Mirror auf <a href="http://bitbucket.org/">BitBucket</a> eingerichtet und <a href="http://jdhardy.blogspot.com/2010/11/developing-ironpython-with-mercurial.htm">dessen Verwendung für die Entwicklung an IronPython dokumentiert</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-schlapsi.at/2010/11/25/source-code-von-ironpython-jetzt-auf-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

