<?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>Steve Graegert &#187; Softwaretechnik</title>
	<atom:link href="http://graegert.de/topics/blog/softwaretechnik/feed" rel="self" type="application/rss+xml" />
	<link>http://graegert.de</link>
	<description>Agile Coach &#38; Lean Thinker</description>
	<lastBuildDate>Wed, 24 Mar 2010 14:54:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Astoria: Microsoft&#039;s RESTful Data Services</title>
		<link>http://graegert.de/blog/astoria-microsofts-restful-data-services</link>
		<comments>http://graegert.de/blog/astoria-microsofts-restful-data-services#comments</comments>
		<pubDate>Wed, 07 May 2008 12:59:16 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[astoria]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=288</guid>
		<description><![CDATA[Auf der MIX07-Konferenz stellte Microsoft Project Astoria vor. Dabei handelt es sich um einen Ansatz zur Realisierung von Webservices nach dem REST-Modell, welches im Gegensatz zu herkömmlichen Webservices stateful ist. Microsoft beschreibt die Ziele des laut Astoria Online Service folgendermaßen: Astoria soll Applikation erlauben, Daten als Datendienste zu exponieren, die von Web-Clients innerhalb eines Unternehmensnetzwerkes [...]]]></description>
			<content:encoded><![CDATA[<p>Auf der MIX07-Konferenz stellte Microsoft <a href="http://blogs.msdn.com/aconrad/archive/2007/04/30/project-astoria.aspx">Project Astoria</a> vor.  Dabei handelt es sich um einen Ansatz zur Realisierung von Webservices nach dem REST-Modell, welches im Gegensatz zu herkömmlichen Webservices <em>stateful</em> ist.</p>
<p><span id="more-288"></span></p>
<p>Microsoft beschreibt die Ziele des laut <a href="http://astoria.mslivelabs.com/">Astoria Online Service</a> folgendermaßen:</p>
<blockquote><p>Astoria soll Applikation erlauben, Daten als Datendienste zu exponieren, die von Web-Clients innerhalb eines Unternehmensnetzwerkes und über das Internet konsumiert werden können.  Der Datendienst ist über HTTP zugreifbar und URIs identifizieren unterschiedliche Teile der Informationen, welche durch den Dienst bereitgestellt werden.  Interaktionen mit dem Datendienst geschehen über HTTP-Verben wie GET, POST, PUT oder DELETE und die die Daten der Interaktionen werden über einfache XML-Formate oder mittels JSON repräsentiert.</p></blockquote>
<p>Das <a href="http://www.microsoft.com/DownLoads/details.aspx?FamilyID=1b6f85bc-8933-4d0e-a639-934ef85adce1&#038;displaylang=en">Microsoft Codename &#8220;Astoria&#8221; Overview Document</a> zeigt, wie Daten adressiert und von Astoria Datendiensten dargestellt werden.  Um Daten mit Astoria Datendiensten zu adressieren wird folgendes Adressierungsschema verwendet:</p>
<pre>http://host/vdir/<service></service>/{<entityset></entityset>{&lt;[predicate]&gt;}</pre>
<p>Beispielsweise zeigt <tt>http://myserver/data.svc/Customers</tt> auf eine Resource, die alle <tt>Customer</tt>-Instanzen enthält.  Ein einzelner Kunde könnte beispielsweise mittels</p>
<pre>http://myserver/data.svc/Customers[KEY]</pre>
<p>abgefragt werden, wobei <tt>KEY</tt> einen eindeutigen Schlüssel innerhalb der Kundendaten repräsentiert.</p>
<p>Zusätzlich können Prädikate und Abfragestrings in die URIs integriert werden, welche die Ausgabe beeinflussen können:</p>
<pre>http://myserver/data.svc/Customers?$orderby=City

http://myserver/data.svc/Customers?$top=5

http://myserver/data.svc/Customers?$skip=30&amp;$take=10</pre>
<p>Die Astoria-Daten liegen entweder als XML, JSON (JavaScript Object Notation) oder einer Untermenge von RDF+XML vor.  Standardmäßig wird XML verwendet.  So antwortet der Server auf den URI <tt>http://myserver/data.svc/Customers[KEY]</tt> mit:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataService</span> <span style="color: #000066;">xml:base</span>=<span style="color: #ff0000;">&quot;http://myserver/data.svc&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;customers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;customer</span> <span style="color: #000066;">uri</span>=<span style="color: #ff0000;">&quot;Customers[KEY]&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;customerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>KEY<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/customerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;companyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Steve's Online Shop<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/companyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;contactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Maria Anders<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/contactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;contactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sales Representative<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/contactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Obere Str. 57<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Berlin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;region</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;postalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>12209<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/postalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Germany<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>030-0074321<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>030-0076545<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;orders</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;Customers[KEY]/Orders&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/customer<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/customers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataService<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Die Wurzel <tt>DataService</tt> beinhaltet immer den Basis-URI einer von dem Dienst representierten Resource.  Zusätzliche Navigationsknoten, die assoziierte Resourcem beschreiben sind immer mit relativen URIs versehen.  In diesem Beispiel sind die Bestellungen (orders) des Kunden <tt>KEY</tt> verfügbar indem der relative URI mit dem Basis-URI verknüpft wird:</p>
<pre>http://myserver/data.svc" + "/" + "Customers[ALFKI]/Orders</pre>
<p>Außer GET kann auch HTTP PUT oder HTTP-POST genutzt werden.</p>
<p><a href="http://udidahan.weblogs.us/">Udi Dahan</a> ist ziemlich <a href="http://feeds.feedburner.com/%7Er/UdiDahan-TheSoftwareSimplist/%7E3/113272739/">skeptisch über den Nutzen und die Relevanz</a> von Astoria und Microsoft&#8217;s Datenserviceansatz im Allgemeinen:</p>
<blockquote><p>Ich muß sagen, ich war vom ersten Tag an gegen diese &#8220;Datendienste&#8221;.  Der REST-Stil ist hauptsächlich nützlich für große, stückweise vorliegende Resourcen, während es scheinbar auch auf einzelne Tabellen in einer Datenbank absieht.  Die Diskussion über <a href="http://udidahan.weblogs.us/2007/05/01/does-rest-simplify-communication-more-than-soa/">REST vs SOA</a> gibt einige Beispiele.</p></blockquote>
<p><a href="http://dannyayers.com/">Danny Ayers</a> jedoch denkt, daß Microsoft <a href="http://dannyayers.com/2007/05/01/astoria--microsoft-approaches">mit Astoria dem Symantischen Web näher kommt</a>. Und <a href="http://www.base4.net/Blog.aspx?Tag=Base4.NET">Alex James</a> gibt einen ausführlichen Überblick über den <a href="http://www.base4.net/Blog.aspx?ID=395">Astoria Buzz</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/astoria-microsofts-restful-data-services/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was versuchen uns SOA-Hersteller zu verkaufen?</title>
		<link>http://graegert.de/blog/was-versuchen-uns-soa-hersteller-zu-verkaufen</link>
		<comments>http://graegert.de/blog/was-versuchen-uns-soa-hersteller-zu-verkaufen#comments</comments>
		<pubDate>Tue, 20 Nov 2007 12:42:21 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=261</guid>
		<description><![CDATA[Viele namhafte Hersteller und einige Start-Ups tummeln sich auf dem SOA-Markt. Wenn es denn einen solchen gibt (der Frage gehen wir gleich nach), dann Frage ich mich, was versuchen sie uns da eigentlich zu verkaufen. Mal abgesehen davon: mir ist keine eindeutige Abgrenzung einer SOA bekannt. Viele sagen, SOA ist eine Business-Sache, andere meinen, man [...]]]></description>
			<content:encoded><![CDATA[<p>Viele namhafte Hersteller und einige Start-Ups tummeln sich auf dem SOA-Markt.  Wenn es denn einen solchen gibt (der Frage gehen wir gleich nach), dann Frage ich mich, was versuchen sie uns da eigentlich zu verkaufen.  Mal abgesehen davon: mir ist keine eindeutige Abgrenzung einer SOA bekannt.  Viele sagen, SOA ist eine Business-Sache, andere meinen, man müsse das von IT-Seite betrachten, wieder andere sind der Meinung, beide Bereiche sind Bestandteil einer SOA.</p>
<p><span id="more-261"></span></p>
<p>OK, wir wissen, das SOA noch immer das ist, was ein Unternehmen darin sieht: SOA steht und fällt mit der Bedeutung für ein Unternehmen.  Und welche Rolle können hier nun die Hersteller von SOA-Produkten spielen?  Ich habe keine Ahnung, aber ein paar Überlegungen angestellt, die ich im folgenden kurz darlegen möchte.</p>
<h2>Reden, reden, reden!</h2>
<p>Viele SOA-Hersteller sind so getrieben von den Marketing-Abteilungen und ihren großen Versprechen, daß sie ganz vergessen um was es bei der Einführung einer SOA bei einem Kunden geht.  Es wäre wirklich toll, wenn alle Unternehmen gleiche Problembereiche identifizieren könnten, die auch noch in die gleiche SOA-Definition passen.  Die Realität sieht aber nun einmal anders aus.  Unternehmen sind nie gleich, keines ist mit einem anderen vergleichbar.  Kaum vorstellbar, daß es eine Lösung für die Einführung einer SOA gibt.</p>
<p>Einer Lösung kämen wir aber näher, wenn die Hersteller den SOA-Protagonisten eines Unternehmens mehr zuhören würden.  Das Resultat wäre ein verlässlicheres Werkzeug für die SOA-Einführung, wie maßgeschneidert.  Allerdings stellt sich dann die Frage, wie so ein Produkt in Serie gehen kann.  Ganz einfach: gar nicht!  Eine SOA ist eine Angelegenheit, die jedes Unternehmen auf unterschiedliche Weise angeht.  Es ist ein langfristiges Projekt mit unterschiedlichen Zielsetzungen, beispielsweise gibt es Unternehmen, die lediglich interne Prozesse betrachten, während andere besonderes Augenmerk auf die Interaktion mit externen Diensten und Dienstleistern legen.</p>
<h2>Ich Tarzan, Du Jane!</h2>
<p>Viele Hersteller verkaufen SOA-Produkte mit bestimmten Funktionen.  Jedes Produkt macht eine bestimmte, meist genau definierte Sache.  Von der Einzigartigkeit des Kunden aus betrachtet heißt das, existierende Strukturen und Architekturen an die Fähigkeiten des Produkts anzupassen, da es sonst keine Existenzberechtigung hätte.</p>
<p>Ein Beispiel: Anbieter A hat eine Lösung für die Datenintegration im Portfolio.  Dieses Produkt betrachtet alle SOAs als Datenintegrationsprobleme, die es zu lösen gilt, kann aber, mangels Fähigkeiten, Faktoren wie Verhaltensweisen oder transaktionale Integration der Daten nicht berücksichtigen.  Diese Konzepte passen einfach nicht in die Muster des Produkts.</p>
<h2>Eins, zwei, drei, SOA!</h2>
<p>Interessanterweise lassen sich auf dem &#8220;SOA-Markt&#8221; die gleichen Muster beobachten, wie sie bereits in anderen Bereichen stattfanden, und stets von einer Welle der Euphorie getragen wurden, die dann langsam abflachte um in etwas anderem wieder aufzugehen.  Ich spreche von &#8220;magischer Technologie&#8221;.  Sie kann existierende Geschäftsprozesse und -strukturen in SOA umwandeln.  Auf Knopfdruck!  Das ist natürlich Unsinn!  Und in den meisten Fällen wird alles noch viel schlimmer, denn solche Programme machen die existierende Architektur  noch viel komplexer als sie ohnehin schon ist.</p>
<p>Die Wahrheit ist, daß die Einführung einer Architektur (das &#8220;A&#8221; in SOA drückt das aus) in der IT einen systematischen Wandel in der Nutzung und Konfiguration von IT-Ressourcen bedeutet und in SOA die Abstraktion von atomaren Vorgängen (Prozessen) in Dienste meint, die anschließend in Solutions überführt werden können.  Ein ESB oder ein Governance Tool macht das nicht, denn es kann vorsichtige, langfristige Planung und Ausführung nicht ersetzen.  Hinzu kommt, daß die Auswahl der richtigen Technologie einen ganz wesentlichen Teil zum Erfolg eines SOA-Rollout beiträgt.  Was diesen Prozess begleiten kann sind Best Practices und Tools für das Lifecycle Management.  Eine Technolgie leistet das nicht allein.</p>
<h2>Es gibt einen SOA-Markt&#8230;</h2>
<p>&#8230;aber nicht für Massenprodukte.  Ob SAP, Software AG, IBM, BEA, etc.. Sie alle verkaufen Produkte, die den meisten Unternehmen keinen Vorteil bringen, da sie naturgemäß nicht die Einzigartigkeit eines Unternehmens abbilden können.  Demnach kann Software für die Unterstützung eines SOA-Rollout nur maßgeschneidert sein und muss in dem langen Prozess der Einführung immer wieder neuen Herausforderungen angepaßt werden.</p>
<p>Genau das leisten kleinere Start-Ups, die sich auf die Beratung bei der Einführung einer SOA spezialisiert haben.  Sie passen Softwarelösungen an, stehen dem Unternehmen beratend über alle Phasen hinweg zur Seite und sind in der Lage schnell auf Veränderungen zu reagieren.</p>
<p>Einen Markt für SOA-Produkte im herkömmlichen Sinn gibt es noch nicht.  Und wer jetzt an ESBs denkt, dem sei gesagt, daß es diese Produkte oft schon vor der Definition von SOA existierten und damals bereits einen Markt bedienten.  SOA muß Ihre Niche noch finden.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/was-versuchen-uns-soa-hersteller-zu-verkaufen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET-Entwicklung: Das yield-Schlüsselwort</title>
		<link>http://graegert.de/blog/net-entwicklung-das-yield-schlusselwort</link>
		<comments>http://graegert.de/blog/net-entwicklung-das-yield-schlusselwort#comments</comments>
		<pubDate>Sun, 21 Oct 2007 13:47:06 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[yield]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=178</guid>
		<description><![CDATA[Viele Änderungen sind revolutionär, andere eher aus einer gewissen Logik heraus entstanden, also evolutionär. Manche Änderungen machen das Leben viel leichter, andere nur ein wenig. Das yield-Schlüsselwort ist eines der Dinge, daß Dir ein wenig Arbeit sparen kann, und auf lange Sicht ist das eine gute Sache. In diesem Artikel zeige ich, wie das yield-Schlüsselwort [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Änderungen sind revolutionär, andere eher aus einer gewissen Logik heraus entstanden, also evolutionär.  Manche Änderungen machen das Leben viel leichter, andere nur ein wenig.  Das <tt>yield</tt>-Schlüsselwort ist eines der Dinge, daß Dir ein wenig Arbeit sparen kann, und auf lange Sicht ist das eine gute Sache.  In diesem Artikel zeige ich, wie das <tt>yield</tt>-Schlüsselwort helfen kann, den Footprint eines C#-Programms zu verringern und gleichzeitig kleine Probleme beseitigt.</p>
<p><span id="more-178"></span></p>
<p>Mittels CodeDOM können nette lustige Dinge mit .NET angestellt werden und das Schlüsselwort <tt>yield</tt> ist aus dieser Disziplin hervorgegangen.  Die Paarungen <tt>yield return</tt> und <tt>yield break</tt> sparen uns ein wenig Zeit und Aufwand, und dazu sparen wir der Run-Time das häufige Kopieren von Sublists.</p>
<h2>Collections und Sublisten</h2>
<p>Eines der häufigsten Code-Fragmente sind Schleifen (Loops).  Sie sind überall und tatsächlich so geläufig, daß es sogar ein Behavior Pattern, nämlich das Iterator-Pattern, welches uns maßgeblich von einer Menge Arbeit befreit.</p>
<p>In .NET unterstützen <tt>IEnumerable</tt>, <tt>IEnumerator</tt> und <tt>IEnumerable<t></tt> und <tt>IEnumerator<t></tt> das Durchlaufen von nicht-generischen und generischen Listen.  <tt>IEnumerable</tt> heißt, daß etwas enumeriert werden kann und <tt>IEnumerator</tt> gibt uns ein Objekt zurück, daß uns das Durchlaufen einer Liste zu einfach macht.  Genau diese beiden Dinge sind der Grund, warum die Anbindung von Collections und der intuitive Einsatz von <tt>foreach</tt> so einfach ist.</p>
<p>Das Iterator-Pattern in .NET implementiert zu haben ist in jedem Fall eine gesunde aber auch nicht weiter tragische Erfahrung, die jeder Programmierer einmal gemacht haben sollte.  So ein Pattern müssen wir nicht notwendigerweise immer wieder für jede Anwendung neu Implementieren, aber grundsätzlich erspart sie uns das Schreiben unnötigen und fehlerträchtigen Codes.</p>
<p>Ein zweite, brilliante Erweiterung ist das <tt>yield</tt>-Schlüsselwort.  Was das Schlüsselwort für uns bedeutet erfahren wir am Besten, wenn wir uns anschauen, wie wir foreach für das Kopieren von Listen und Sublisten bisher verwendet haben, und hinterher lernen, was <tt>yield</tt> für uns tun kan.</p>
<p>In den häufigsten Fällen wollen wir mit Loops etwas kleines innerhalb eines großen finden.  Möchten wir beispielsweise die Postleitzahl einer Kundenadresse innerhalb eine Liste von Kunden-Objekten finden, müssen wir die Liste durchsuchen und jedes Objekt nach der PLZ fragen.</p>
<p>Listing 1 zeigt eine Klasse zur Verwaltung von Ereignissen in Bezug auf Termine und nicht in der .NET-Terminologie, während Listing 2 illustriert, wie eine Sublist von <tt>Event</tt>-Objekten mittels <tt>List<t></tt> erstellt werden kann.</p>
<p><strong>Listing 1: Eine einfache Ereignis-Klasse</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">namespace</span> YieldTest <span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Appointment <span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">String</span> description<span style="color: #008000;">;</span>
		<span style="color: #0600FF;">private</span> DateTime occurs<span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF;">public</span> Appointment<span style="color: #000000;">&#40;</span>DateTime occurs, <span style="color: #FF0000;">String</span> description<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">occurs</span> <span style="color: #008000;">=</span> occurs<span style="color: #008000;">;</span>
			<span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">description</span> <span style="color: #008000;">=</span> description<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0600FF;">public</span> DateTime Occurs <span style="color: #000000;">&#123;</span>
			get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> occurs<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
			set <span style="color: #000000;">&#123;</span> occurs <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">String</span> Description <span style="color: #000000;">&#123;</span>
			get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> description<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
			set <span style="color: #000000;">&#123;</span> description <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> ToString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">return</span> <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{0}: {1}&quot;</span>, occurs, description<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Listing 2: Klasse, die eine Subliste mit Elementen zurückgibt.</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> YieldTest <span style="color: #000000;">&#123;</span>
	<span style="color: #FF0000;">class</span> Program <span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> app <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> may<span style="color: #008000;">;</span>
&nbsp;
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Meet Lucy&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Rent car&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Mom's Birthday&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Concert&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			may <span style="color: #008000;">=</span> GetMayEvents<span style="color: #000000;">&#40;</span>app<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> may<span style="color: #000000;">&#41;</span>
				Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;">// 97 bytes MSIL-Code</span>
		<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> GetMayEvents<span style="color: #000000;">&#40;</span>List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> eventList<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> may <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> eventList<span style="color: #000000;">&#41;</span>
				<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Occurs</span>.<span style="color: #0000FF;">Month</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>
					may.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF;">return</span> may<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Solcher Code existiert in vielen Millionen Programmen in vielfältiger Weise.  Abgesehen davon, daß er ziemlich viel Platz benötigt, obwohl wie effektiv nur 5 Zeilen Code geschrieben haben (Abbildung 1) ist ein Problem, das andere ist, daß wir diesen Code immer und immer wieder schreiben müssen, je nach Anwendungsfall.</p>
<div id="attachment_184" class="wp-caption aligncenter" style="width: 310px"><img src="/wp-content/uploads/2009/10/yield1.png" alt="MSIL-Code für die Funktion GetMayEvents" title="yield1" class="size-medium wp-image-184" /><p class="wp-caption-text">MSIL-Code für die Funktion GetMayEvents: der herkömmliche Weg benötigt viel Code, hier: 97 Bytes.</p></div>
<h2><tt>yield</tt> erzeugt dynamische Listen</h2>
<p>Listing 2 erzeugt eine Untermenge aus einer Liste und gibt sie zurück.  Was wir aber eigentlich wollen, ist die Möglichkeit über diese Untermenge iterieren zu können.  Genau diese Funktion liefert <tt>yield</tt>.</p>
<p>In dem wir <tt>yield</tt> verwenden, brauchen wir keine Subliste erstellen und müssen damit auch keine Referenzen in die zweite Liste stopfen.  Das <tt>yield</tt>-Schlüsselwort übernimmt das alles für uns, wie Listing 3 zeigt.</p>
<p><strong>Listing 3: Die Funktion <tt>GetJuneEvents</tt> verwendet <tt>yield</tt>.</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> GetJuneEvents<span style="color: #000000;">&#40;</span>List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> events<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> events<span style="color: #000000;">&#41;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Occurs</span>.<span style="color: #0000FF;">Month</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span>
			yield <span style="color: #0600FF;">return</span> e<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>OK, <tt>yield</tt> ist eigentlich kein eigenständiges Schlüsselwort, Du kannst es also auch als Variablennamen verwenden, aber da es eine spezielle Funktion in bestimmten Kontexten erfüllt, bleibe ich bei der Bezeichnung <em>Schlüsselwort</em>.  <tt>yield</tt> muß <tt>return</tt> oder <tt>break</tt> vorangestellt werden.</p>
<p>Der neue Code sieht zugegebenermaßen irgendwie komisch aus.  Kehrt die Funktion nicht jedesmal zurück, wenn ein Event im April gefunden wurde?  Nein, obwohl es in der Tat so aussieht.  Was passiert ist, daß beim Antreffen von <tt>yield return</tt> das <tt>Current</tt>-Property der Iterators (<tt>IEnumerable</tt>) auf das Objekt im <tt>yield</tt>-Statement gesetzt, der Funktionszustand auf dem Stack gespeichert und die Funktion verlassen wird, außer in Loops.  Hier wird beim nächsten Aufruf von <tt>foreach</tt> der Funktionszustand wiederhergestellt, IEnumerable.Current auf das nächste Element gesetzt und so weiter.  Im Endeffekt erstellt <tt>yield</tt> für uns eine dynamische enumerierbare Liste.</p>
<p>Um die Ereignisse im Juni abfragen zu können müssen wir das Hauptprogram lediglich um ein wichtiges Detail erweitern:</p>
<p><strong>Listing 4: Der vollständige Code mit und ohne <tt>yield</tt>.</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">namespace</span> YieldTest <span style="color: #000000;">&#123;</span>
	<span style="color: #FF0000;">class</span> Program <span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> app <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			IEnumerable<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> list<span style="color: #008000;">;</span>
&nbsp;
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Meet Lucy&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Rent car&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Mom's Birthday&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Concert&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			list <span style="color: #008000;">=</span> GetMayEvents<span style="color: #000000;">&#40;</span>app<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> list<span style="color: #000000;">&#41;</span>
				Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			list <span style="color: #008000;">=</span> GetJuneEvents<span style="color: #000000;">&#40;</span>app<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> list<span style="color: #000000;">&#41;</span>
				Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;">// 97 bytes MSIL-Code</span>
		<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> GetMayEvents<span style="color: #000000;">&#40;</span>List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> events<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> may <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> events<span style="color: #000000;">&#41;</span>
				<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Occurs</span>.<span style="color: #0000FF;">Month</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>
					may.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF;">return</span> may<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;">// 21 bytes MSIL-Code</span>
		<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> GetJuneEvents<span style="color: #000000;">&#40;</span>List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> events<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> events<span style="color: #000000;">&#41;</span>
				<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Occurs</span>.<span style="color: #0000FF;">Month</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span>
					yield <span style="color: #0600FF;">return</span> e<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Da <tt>List<t></tt> das Interface <tt>IEnumerable</tt> implementiert, brauchen wir nur noch eine Variable für den Aufruf der beiden Funktionen<tt>GetMayEvents</tt> und <tt>GetJuneEvents</tt> verwenden, die vom Typ <tt>IEnumerable</tt> ist.  Ein Blick auf den MSIL-Code der Funktion <tt>GetJuneEvents</tt> zeigt, daß <tt>yield</tt> viel effektiver ist.</p>
<div id="attachment_185" class="wp-caption aligncenter" style="width: 310px"><img src="/wp-content/uploads/2009/10/yield2.png" alt="MSIL-Code für die Funktion GetMayEvents: mittels yield reduziert sich der funktional identische Code drastisch, hier: 21 Bytes." title="yield2" class="size-medium wp-image-185" /><p class="wp-caption-text">MSIL-Code für die Funktion GetMayEvents: mittels <tt>yield</tt> reduziert sich der funktional identische Code drastisch, hier: 21 Bytes.</p></div>
<h2><tt>Predicate</tt> bringt maximale Flexibilität</h2>
<p>Natürlich ist die neue Funktion mit yield chic, aber dennoch nicht besonders flexibel.  Fügen wir aber ein <tt>Predicate<t></tt> ein, wird nur ein Iiterator für jede Sublist benötigt.  Alles was wir benötigen ist ein <tt>Predicate<t></tt>-Delegate, welche die Testmethode selbst ist.  Listing 5 zeigt wie es geht.</p>
<p><strong>Listing 5: Der neue Code mit <tt>Predicate</tt>.</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> app <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	IEnumerable<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> list<span style="color: #008000;">;</span>
&nbsp;
	app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Meet Lucy&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Rent car&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">15</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Mom's Birthday&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	app.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Appointment<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2007</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Concert&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #008080; font-style: italic;">// neuer Ansatz mit yield und Predicate</span>
	<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> GetEvents<span style="color: #000000;">&#40;</span>app, Match<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
		Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> Match<span style="color: #000000;">&#40;</span>Appointment a<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">return</span> a.<span style="color: #0000FF;">Occurs</span>.<span style="color: #0000FF;">Month</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">5</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> GetEvents<span style="color: #000000;">&#40;</span>
	List<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> events, Predicate<span style="color: #008000;">&lt;</span>appointment<span style="color: #008000;">&gt;</span> match
<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Appointment e <span style="color: #0600FF;">in</span> events<span style="color: #000000;">&#41;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>match<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
			yield <span style="color: #0600FF;">return</span> e<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Wie wir sehen können ist der Code zwar auf den ersten Blick etwas länger aber viel flexibler, da wir nur noch eine Funktion anpassen müssen, um die Methode zu testen.  Außerdem können wir auch statt <tt>GetEvents</tt> auch einfach <tt>List<t>.FindAll</tt> aufrufen.  Dann muß nur noch das <tt>Predicate</tt> hinzugefügt werden.</p>
<h2>Zusammenfassung</h2>
<p><tt>yield</tt> ist ohne <tt>return</tt> oder <tt>break</tt> kein Schlüsselwort.  In iterativen Schleifen muß <tt>yield return</tt> verwendet werden.  Desweiteren darf <tt>yield</tt> nicht in anonymen Methoden verwendet werden, unsicherer Code (<tt>unsafe</tt>) ist ebenfalls tabu und <tt>ref</tt> und <tt>out</tt> dürfen nicht als Variablen für <tt>yield</tt> verwendet werden.  Und schließlich darf <tt>yield</tt> nicht in einem <tt>catch</tt>-Block oder mit einem <tt>try</tt>-Block mit mehr als einem <tt>catch</tt>-Block vorkommen.</p>
<p>Weiterführende Informationen sind in <a href="http://msdn2.microsoft.com/en-us/vcsharp/bb264519.aspx">Bill Wagners exzellentem Artikel</a> über Prädikate, Iteratoren und Generics auf MSDN zu finden.</p>
<p>In unserem Fall genügt es zu sagen, daß wann immer wir Listen durchlaufen müssen, wir überlegen sollten, ob wir nicht besser mit <tt>yield</tt> arbeiten, da es mehr Flexibilität und Leistungszuwachs bringt, ohne den Code komplexer zu machen.  Das erreichen wir, weil <tt>yield</tt> einen dynamischen Iterator zur Laufzeit erzeugt und uns damit eine Menge Code sparen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/net-entwicklung-das-yield-schlusselwort/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOA: Java immer beliebter, .NET rückläufig</title>
		<link>http://graegert.de/blog/soa-java-immer-beliebter-net-rucklaufig</link>
		<comments>http://graegert.de/blog/soa-java-immer-beliebter-net-rucklaufig#comments</comments>
		<pubDate>Mon, 20 Aug 2007 12:41:12 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=258</guid>
		<description><![CDATA[Nach einem Bericht des Marktforschungsunternehmen Evans Data Corporation (EDC) ist die Zahl der Unternehmen, die SOA auf Basis von Java ausrollen wollen oder bereits dabei sind es zu tun, weiter gestiegen, während die Zahl jener, die auf .NET setzen, in den letzten sechs Monaten um etwa 20% gesunken ist. Das ergab eine Umfrage unter IT-Managern [...]]]></description>
			<content:encoded><![CDATA[<p>Nach einem Bericht des Marktforschungsunternehmen <a href="http://www.evansdata.com/press/viewRelease.php?pressID=119">Evans Data Corporation</a> (EDC) ist die Zahl der Unternehmen, die SOA auf Basis von Java ausrollen wollen oder bereits dabei sind es zu tun, weiter gestiegen, während die Zahl jener, die auf .NET setzen, in den letzten sechs Monaten um etwa 20% gesunken ist.  Das ergab eine Umfrage unter IT-Managern und Entwicklern, die aktiv in die SOA-Projekte eingebunden sind.</p>
<p><span id="more-258"></span></p>
<p>Noch liegt .NET mit etwa 31% vorn, dicht gefolgt von Java mit 28%.  Damit sind beide Technologien quasi gleichermaßen attraktiv für Unternehmen. Nicht zu vernachlässigen ist der Anteil jener Unternehmen, die beide Technologien unterstützen wollen.  Dieser beläuft sich auf etwa 20% der Befragten.</p>
<p>John Andrews, CEO der Evans Data Corp, sieht für diese Entwicklung einen einfachen Grund:</p>
<blockquote><p>Die Open Source-Welt ist in Bezug auf SOA momentan sehr aktiv, ganz besonders im Eclipse-Umfeld.  Die meisten Unternehmen in diesem Bereich stellen neue SOA-Lösungen vor, die fast alle Java-basiert sind.  Open Source SOA scheint dazu verdammt zu sein, eine wichtige Rolle auf dem SOA-Markt zu spielen und .NET echte Konkurrenz zu machen.</p></blockquote>
<p>SOA hat inzwischen an Fahrt gewonnen und mittlerweile seien bereits drei viertel der Unternehmen, die selbst Web Services einsetzen oder implementieren, bereit, SOA-Ausrollungen zu planen oder in Kürze vorzunehmen.  Mehr als ein Fünftel der befragten Unternehmen hätten sich bereits auf die Einführung von SOA unternehmensweit eingestellt.</p>
<p>Andere Fakten, die aus der Befragung von mehr als 400 Entwicklern hervorgegangen sind:</p>
<ul>
<li>Über 70 Prozent der Entwickler, die mit Web Services arbeiten, würden Kostensenkungen spühren.  Die Wiederverwendung von Code und die Automatisierung von Prozessen seien die Hauptgründe für diese Entwicklung.</li>
<li>Web Services zu testen und Validieren sei die größte Herausforderung für die Entwicklung einer SOA, doch sei die Bestimmung des ROI (Return of Investment) eine ebenso große Herausforderung.</li>
<li>Business to Business (B2B) sei die häufigste Anwendungsform von Web Services, gefolgt von der Datenintegration.</li>
</ul>
<p>Der halb-jährliche Report über die Entwicklung von Web Services wurde im Juni erstellt und am Montag veröffentlicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/soa-java-immer-beliebter-net-rucklaufig/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET 3.0: Zu kompliziert für Anfänger?</title>
		<link>http://graegert.de/blog/net-3-0-zu-kompliziert-fur-anfanger</link>
		<comments>http://graegert.de/blog/net-3-0-zu-kompliziert-fur-anfanger#comments</comments>
		<pubDate>Wed, 15 Aug 2007 12:39:30 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=255</guid>
		<description><![CDATA[In seinem Weblog fragt sich Microsoft MVP Jon Skeet ob .NET 3.0 nicht bereits zu groß geworden ist, um für einen Programmieranfänger als Einstieg geeignet zu sein. Ich sage: auf jeden Fall, aber Java auch! Jon Skeet schreibt: I&#8217;ve been looking at C# 3 in a fair amount of detail recently, and likewise going over [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://msmvps.com/blogs/jon.skeet/archive/2007/08/02/is-c-3-too-big-to-learn-from-scratch.aspx">seinem Weblog</a> fragt sich Microsoft MVP Jon Skeet ob .NET 3.0 nicht bereits zu groß geworden ist, um für einen Programmieranfänger als Einstieg geeignet zu sein.  Ich sage: auf jeden Fall, aber Java auch!</p>
<p><span id="more-255"></span></p>
<p>Jon Skeet schreibt:</p>
<blockquote><p>I&#8217;ve been looking at C# 3 in a fair amount of detail recently, and likewise going over the features of C# 2&#8230;.I feel sorry for someone wanting to learn C# 3 from scratch. It&#8217;s becoming quite a big language&#8230;.It&#8217;s often been said in the newsgroups (usually when someone has been moving from another language to C#) that C# itself only takes a few days to learn&#8230;.I suspect it would be hard to do it any sort of justice in less than about 700 pages, which is a pretty off-putting size (at least for me).</p></blockquote>
<p>Ich bin der Meinung, daß C# nicht mehr in ein paar Tagen erlernbar ist, wenn nicht bereits ein paar Grundlagen in C++ oder Java vorhanden sind.  JavaScript macht&#8217;s auch nicht, denn dann hätte man auch erst Dinge wie statische Typisierung, Werttypen und Referenztypen, Vererbungsmodelle, Events / Delegates, anonyme Funktionen, etc. lernen müssen.</p>
<h2>C# 3.0 ist schwer zu erlernen&#8230;</h2>
<p>Mein erstes C#-Buch (für .NET 1.0) war etwa 650 Seiten stark und wurde als &#8220;Intermediate/Advanced&#8221; eingestuft.  Kein Problem, schließlich ging es darum, die Sprache zu lernen und nicht die Konzepte der objekt-orientierten Programmierung zu verstehen.  Das Buch war genau richtig für mich, aber ein Anfänger hätte sich die Zähne ausgebissen und frustriert von der Programmierung abgewendet.</p>
<p>Führt man sich vor Augen, daß diese Dinge alle vor der Einführung von Generics, LINQ, WPF, WCF und WF waren, würde ein Anfänger heute kaum den Durchblick behalten.</p>
<p>Allein die Betrachtung eines einfachen Hello World in C# wirft einige wichtig konzeptionelle Fragen auf: Namespaces, Klassen, Referenzen, Unterschied zwischen statischen und Instanzmethoden und -variabeln.  Und um das wirklich zu verstehen muß man wiederum den <tt>this</tt>-Zeiger und v-Tables verstehen; damit einher geht dann auch die Untersuchung in wie fern sich die CLR von dem zugrundeliegenden Speichermodell unterscheidet.  Versuchen Sie doch einmal einem Anfänger zu erklären, was genau <tt>public static void Main(String[] args)</tt> bedeutet.</p>
<p>Die meisten lernten C# nachdem sie Erfahrungen mit Java, zuvor aber C++ und davor C gesammelt haben.  Keine dieser Programmiersprachen kann in &#8220;ein paar Tagen&#8221; erlernt werden.  Daher auch: Hände weg von den &#8220;Teach yourself [what you want] in [xx] days/hours&#8221; Büchern.</p>
<h2>&#8230;Java aber auch!</h2>
<p>In der Vergangenheit habe ich erfolgreich Kurse in der Programmierung mit Java gegeben.  In etwa 5 Tagen konnten fast alle auf solide Kenntnisse der Sprache zurückblicken, doch von den oben genannten Konzepten, von denen nicht alle auf Java umsetzbar sind, hatten die meisten danach auch keine Ahnung.    Das ist auch nicht verwunderlich, denn die meisten Konzepte erlernt man erst in der Praxis und dazu braucht man mehr Zeit als ein paar Tage.</p>
<p>Es ist mit Java also nicht anders als mit C#.  Während die Sache 1993 ganz harmlos mit ein paar Klassen begann und java schnell viele Freunde machte, dauerte es nicht lange bis einige tausend Klassen hinzukamen und wir heute auf etwa 16.000 Klassen blicken.</p>
<p>Erschwerend kommt hinzu, daß unzählige Packages, APIs und Technologien in das Java-Umfeld schwappten: JMS, EJB, JXP, JSP, JDO, JDBC, JAXP, etc.  Die Liste ließ sich noch lange fortsetzen.</p>
<p>Jedem Einsteiger in die Programmierwelt empfehle ich zunächst C zu lernen und anschließend objekt-orientierte Grundlagen mit C++ zu erwerben, dort aber nicht zu lange zu verweilen (denn C++ ist eine schmutzige Sprache) um gleich zu Java oder C# zu wechseln.  Damit dürften wichtige Probleme im Vorfeld vermieden werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/net-3-0-zu-kompliziert-fur-anfanger/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LOLCode: Nächstes Mitglied in der .NET-Sprachfamilie</title>
		<link>http://graegert.de/blog/lolcode-nachstes-mitglied-in-der-net-sprachfamilie</link>
		<comments>http://graegert.de/blog/lolcode-nachstes-mitglied-in-der-net-sprachfamilie#comments</comments>
		<pubDate>Fri, 10 Aug 2007 12:36:22 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[lolcode]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=244</guid>
		<description><![CDATA[Long Zheng berichtete am zweiten Tag der laufenden TechEd-Konferenz in Australien über Microsoft&#8217;s Bekenntnis, die Programmiersprache LOLCode in den Reigen der .NET-Sprachfamilie neben C#, C++.Net, VB.Net, J#, F# aufzunehmen. Mittels LOLCode sollen besonders junge Menschen und Katzenfreunde angesprochen werden, die das Programmierhandwerk lernen möchten. So würde das nächste Visual Studio in &#8220;Cheezburger Studio&#8221; umbenannt werden [...]]]></description>
			<content:encoded><![CDATA[<p>Long Zheng berichtete am zweiten Tag der laufenden TechEd-Konferenz in Australien über Microsoft&#8217;s Bekenntnis, die Programmiersprache LOLCode in den Reigen der .NET-Sprachfamilie neben C#, C++.Net, VB.Net, J#, F# aufzunehmen.</p>
<p><span id="more-244"></span></p>
<p>Mittels LOLCode sollen besonders junge Menschen und Katzenfreunde angesprochen werden, die das Programmierhandwerk lernen möchten.  So würde das nächste Visual Studio in &#8220;Cheezburger Studio&#8221; umbenannt werden und ausschließlich LOLCode unterstützen.  Der Debugger, genannt &#8220;Cheezburgler&#8221; soll die ganze Sache schmackhaft machen.</p>
<h2>Was ist LOLCode?</h2>
<p>Lolcats bezeichnet <a href="http://www.icanhascheezburger.com/">lustige Bilder von Katzen</a>, die mit ebenso idiosynkratischen Texten versehen sind, welche wie Image Macros eingesetzt werden.  Lolcat ist ein zusammengesetztes Wort aus &#8220;lol&#8221; (<strong>l</strong>aughing <strong>o</strong>ut <strong>l</strong>oud) und &#8220;cat&#8221;.  Image Macros sind Bilder mit einer klaren Aussage, die durch einen ähnlich klingenden Begriff untermalt sind.  So bildet ein Bild eine Waffel ab (engl. <em>waffle</em>) und den Text ROFL (rolling over the floor laughing).   <em>Waffle</em> klingt in der englischen Aussprache wie ROFL, beides hat aber nichts miteinander zu tun und entspricht einem Wortspiel.</p>
<p>Die Programmiersprache basiert auf der idiosynkratischen Verwendung von Überschriften der Lolcats und hat bereits den Status einer esoterischen Programmiersprache erworben.</p>
<h3>Beispiel 1</h3>
<p>Das klassische Hello World in LOLCode:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">HAI
CAN HAS STDIO<span style="color: #008000;">?</span>
VISIBLE <span style="color: #666666;">&quot;HAI WORLD!&quot;</span>
KTHXBYE</pre></div></div>

<p><tt>HAI</tt> und <tt>KTHXBYE</tt> sind Trenner für den Start und das Ende eines Blocks.  <tt>CAN HAS</tt> entspricht den Direktiven <tt>#include</tt> oder <tt>using</tt> und <tt>visible</tt> ist das <tt>print</tt>-Statement in LOLCode.</p>
<p><strong>Ausgabe:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">c<span style="color: #008000;">:</span>\<span style="color: #008000;">&gt;</span> hai.<span style="color: #0000FF;">exe</span>
HAI WORLD<span style="color: #008000;">!</span></pre></div></div>

<h3>Beispiel 2</h3>
<p>Eine Variable deklarieren und Eingaben verarbeiten.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">HAI
CAN HAS STDIO<span style="color: #008000;">?</span>
I HAS A VAR
GIMMEH VAR
VISIBLE <span style="color: #666666;">&quot;You said &quot;</span> N VAR N <span style="color: #666666;">&quot; !!&quot;</span>
KTHXBYE</pre></div></div>

<p>In diesem Beispiel definiert <tt>I HAS A VAR</tt> die (untypisierte) Variable <tt>VAR</tt> und <tt>GIMMEH VAR</tt> fordert Eingaben von der Konsole an. <tt>N</tt> ist ein Verbindungsoperator für Strings.</p>
<p><strong>Ausgabe:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">c<span style="color: #008000;">:</span>\<span style="color: #008000;">&gt;</span> gimmeh.<span style="color: #0000FF;">exe</span>
meeauh<span style="color: #008000;">!</span>
You said meeauh<span style="color: #008000;">!!!</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/lolcode-nachstes-mitglied-in-der-net-sprachfamilie/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaOne dieses Jahr unter dem Einfluß von SOA</title>
		<link>http://graegert.de/blog/javaone-dieses-jahr-unter-dem-einflus-von-soa</link>
		<comments>http://graegert.de/blog/javaone-dieses-jahr-unter-dem-einflus-von-soa#comments</comments>
		<pubDate>Wed, 09 May 2007 12:23:03 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javaone]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=228</guid>
		<description><![CDATA[Serviceorientierte Architektur (SOA), AJAX, and Web 2.0 sind die heißen Themen rund um die neuen Technologien auf der JavaOne-Konferenz, doch es wird auch ein stärkerer Fokus auf die Business-Welt gerichtet. Brian F. Shimmin, Principal Analyst für Application Infrastructure bei Current Analyst LCC, versichert, daß der &#8220;Geek Factor&#8221; nicht verloren gehen wird, obwohl ein wenig mehr [...]]]></description>
			<content:encoded><![CDATA[<p>Serviceorientierte Architektur (SOA), AJAX, and Web 2.0 sind die heißen Themen rund um die neuen Technologien auf der JavaOne-Konferenz, doch es wird auch ein stärkerer Fokus auf die Business-Welt gerichtet.</p>
<p><span id="more-228"></span></p>
<p>Brian F. Shimmin, Principal Analyst für Application Infrastructure bei Current Analyst LCC, versichert, daß der &#8220;Geek Factor&#8221; nicht verloren gehen wird, obwohl ein wenig mehr Weißhemd- und Krawattenträger anwesend sind als in den letzten 5 Jahren:</p>
<blockquote><p>Noch immer ist der Geek Factor vorhanden.  Doch gibt es diesmal nicht so viele abgehobene Themen, die nicht alle mit Enterprise Architektur zu tun haben, aber trotzdem interessant sind.  Vielmehr geht es diesmal mehr um Enterprises, Sicherheit, Performance und Verfügbarkeit.  Es gibt jede Menge wichtige Arbeit was die Entwicklungen im Java EE 5 und Spring-Umfeld angeht.</p></blockquote>
<p>Neu in diesem Jahr ist der Java Technology Business Day, der heute stattfindet.  Es ist ein Tagesprogramm für Geschäftsleute, die erfahren wollen, wie sie die Java Technologie richtig einsetzen und die Marke Java nutzen um Geld zu verdienen, sagt Jean Elliot, Senior Director für Java Software Product Marketing bei Sun Microsystems.</p>
<p>Gestern eröffnete die Show mit dem NetBeans Day mit einem technikorientierten Programm, an dem Sun und die NetBeans-Community eine Vorschau auf die neue Java IDE NetBeans 6.0 gegeben haben.  Die neue IDE geht über eine Entwicklungsumgebung für die Java- und C/C++-Entwicklung hinaus und wird Ruby und JavaScript unterstützen.  Die Unterstützung von Ruby bezieht sich auch auf den NetBeans GUI-Builder, der es Entwicklern nun auch erlaubt, Ruby on Rails mit vorhandenem Java-Code zu verknüpfen.</p>
<p>Gestern stellte auch ICEsoft Technologies seine Unterstützung für NetBeans zur Entwicklung von Rich Internet Applications (RIAs) mit AJAX vor.  Nexaweb Technologies demonstrierte seine neuen Tools für die Entwicklung von Applikationen mit Java und Web 2.0 vor.  Sie lassen sich einfach in die bestehende Java-Umgebung integrieren.</p>
<p>Heute jedoch, erfahren die Teilnehmer neues über Java EE 6, obwohl führende Hersteller wie IBM noch nicht einmal von J2EE auf Java EE 5 umgestiegen sind, welche das Highlight auf der letzten JavaOne war.</p>
<blockquote><p>Ich denke, daß Sun die Bedeutung von Java EE 5 nocheinmal hervorheben wird und ausdrückt, wie wichtig die Plattform ist.  Außerdem wird Sun versuchen, den großen Herstellern, die bereits an Board sind, Raum für ihre Erfolgsgeschichten einzuäumen.  Natürlich werden sie mit hoher Wahrscheinlichkeit neue Funktionen von Java EE 6 zeigen, darunter auch die neuen Technologien für die mobile Entwicklung.  Es sind nur Kleinigkeiten hier und da, nicht so als ob sie jetzt Java EE 6 ausrollen würden.</p></blockquote>
<p>fügte Shimmin hinzu.  Jean Elliot empfiehlt, allen Teilnehmern sich für das JavaOne Camp anzumelden, welches Entwicklern erlaubt, Ihre Wünsche für das neue Release zu äußern.  Das wird eine Sitzung mit &#8220;offenem Mikrophon&#8221; sein, wo die Leute einfach in einer zwanglosen Atmosphäre drauflos reden und sich mit Entwicklern von Sun austauschen können.</p>
<p>Am Mittwoch, also morgen, wird dir Bühne um Java EE 5 Oracle gehören.  Es wird damit gerechnet, daß Oracle bekannt gibt, in welchem Umfang der neue Oracle Application Server EE 5 unterstützen wird.  Desweiteren stehen SOA-Standards, WS-Policy (das momentan in den Mühlen der W3C-Prozesse steckt) und Service Data Objects (SDO) auf dem Programm.  SDO ist nun an die OASIS übergeben worden.</p>
<p>Ted Farrell, Oracles Chefarchitekt und Vizepräsident für Tools and Middleware, sagte, daß Oracle auch seine neue IDE JDeveloper vorstellen wird, die sich speziell an Entwickler für Web Services und SOA richtet.  Außerdem wird das Application Developer Framework (ADF) vorgestellt, daß die Runtime für JDeveloper bereitstellt.</p>
<blockquote><p>Wir haben besonders Rich Internet Applications im Auge gehabt.  Wir sehen den Trend in der Entwicklung von Anwendungen für Web 2.0, die mit Hilfe von AJAX und Adobe Flash völlig neue interaktive Erfahrungen für Benutzer liefern.</p></blockquote>
<p>sagte der Chefarchitekt.  Shimmin fügt hinzu, daß auch die Bekanntgabe des Spring Frameworks für Oracle Application Server eine wichtige Angelegenheit sei.  Spring passe viel besser in den Bereich Enterprise Business dieser Show.</p>
<blockquote><p>Bei Spring geht es nicht um Web 2.0, Ajax und Mashups.  Spring steht für Anwendungen, die auf einem Java EE Server laufen, die möglicherweise eine andere Applikation via Web Services bedient, die wiederum für das Bestellwesen oder ähnliches verantwortlich ist.  Spring ist eben mehr auf Business ausgerichtet.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/javaone-dieses-jahr-unter-dem-einflus-von-soa/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solaris 10: acl()-Aufruf führt zu Kernel Panic</title>
		<link>http://graegert.de/blog/solaris-10-acl-aufruf-fuhrt-zu-kernel-panic</link>
		<comments>http://graegert.de/blog/solaris-10-acl-aufruf-fuhrt-zu-kernel-panic#comments</comments>
		<pubDate>Wed, 09 May 2007 12:20:36 +0000</pubDate>
		<dc:creator>Steve Graegert</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=224</guid>
		<description><![CDATA[Solaris 10: Systemabsturz über acl()-Aufruf möglich &#8212; Sun bestätigt eine Sicherheitslücke im Betriebssystem Solaris 10, über die lokale Benutzer einen Denial-of-Service gegen das System ausführen können. Die Sicherheitslücke betrifft die aktuelle Version 10 des Solaris Betriebssystem von Sun. Betroffen sind die Sparc- und x86-Architektur. Die Schwachstelle basiert auf einem Fehler im Systemaufruf der acl()-Funktion und [...]]]></description>
			<content:encoded><![CDATA[<p>Solaris 10: Systemabsturz über <tt>acl()</tt>-Aufruf möglich &mdash; Sun bestätigt eine Sicherheitslücke im Betriebssystem Solaris 10, über die lokale Benutzer einen Denial-of-Service gegen das System ausführen können.</p>
<p>Die Sicherheitslücke betrifft die aktuelle Version 10 des Solaris Betriebssystem von Sun. Betroffen sind die Sparc- und x86-Architektur. Die Schwachstelle basiert auf einem Fehler im Systemaufruf der <tt>acl()</tt>-Funktion und lässt sich von lokalen Benutzern zum Auslösen einer &#8220;System Panic&#8221; missbrauchen, was gleichbedeutend mit einem Absturz des Systems ist. Geschlossen wird die Sicherheitslücke mit Patch 125100-06 (Sparc) oder 125101-06 (x86). Die Patches stehen auf <a href="http://sunsolve.sun.com/search/document.do?assetkey=1-26-102869-1">SunSolve</a> zur Verfügung.</p>
<h2>Hintergrund</h2>
<p>Die Ausnutzung eines Vorzeichenfehlers in Solaris kann das System zu einem Absturz bringen, folglich führt das zu einer Denial-of-Service-Bedingung auf dem betroffenen System.</p>
<p>Der <tt>acl()</tt>-Systemaufruf wird verwendet, um die Zugriffskontrolle für eine Datei zu setzen.  Durch eine falsche Prüfung des als Argument übergebenen Wertes in einer if-Bedingung wird sie umgangen und der Kernel allokiert einen enormen Speicherbereich, was wiederum zur Kernel Panic führt.</p>
<p>Die Funktion ruft auch andere Funktionen auf, die das Resultat einer Multiplikation in der <tt>if</tt>-Bedingung nutzen, die ebenfalls von diesem Bug betroffen sind.  Der Patch wird damit auch Folge-Probleme beheben.</p>
]]></content:encoded>
			<wfw:commentRss>http://graegert.de/blog/solaris-10-acl-aufruf-fuhrt-zu-kernel-panic/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
