<?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>RENEMT_DE &#187; Software Development</title>
	<atom:link href="http://www.renemt.de/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.renemt.de</link>
	<description>Transparency might be frightening.</description>
	<lastBuildDate>Sun, 29 Jan 2012 14:37:51 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Intranet-Wikis mit Mediawiki und Extensions</title>
		<link>http://www.renemt.de/2010/05/07/intranet-wikis-mit-mediawiki-und-extensions/</link>
		<comments>http://www.renemt.de/2010/05/07/intranet-wikis-mit-mediawiki-und-extensions/#comments</comments>
		<pubDate>Fri, 07 May 2010 16:26:01 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Agile and Lean]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[referenz]]></category>

		<guid isPermaLink="false">http://www.renemt.de/?p=814</guid>
		<description><![CDATA[In den letzten Tagen haben wir bei Zalando ein neues, internes Development-Wiki an den Start gebracht. Das dürfte eine häufig wiederkehrende Aufgabe in vielen Unternehmen sein. Daher möchte ich an dieser Stelle meine bisherigen Erfahrungen für ein funktionierendes Setup zum &#8230; <a href="http://www.renemt.de/2010/05/07/intranet-wikis-mit-mediawiki-und-extensions/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In den letzten Tagen haben wir bei Zalando ein neues, internes Development-Wiki an den Start gebracht. Das dürfte eine häufig wiederkehrende Aufgabe in vielen Unternehmen sein. Daher möchte ich an dieser Stelle meine bisherigen Erfahrungen für ein funktionierendes Setup zum Besten geben.</p>
<p><strong><br />
Wiki-Engine</strong><br />
Ich benutze <a href="http://www.mediawiki.org" target="_blank">Mediawiki</a> &#8211; kostenlos, Open Source, PHP + MySQL. Läuft auf jedem <a href="http://www.apachefriends.org/xampp.html" target="_blank">XAMPP</a>-basierenden Webserver bzw. auf jedem Webserver, der PHP und MySQL unterstützt. XAMPP gibt es wiederum für jedes halbwegs verbreitete Betriebssystem.</p>
<p>Hat man Mediawiki installiert kann man eigentlich schon loslegen. Allerdings gibt es in der Regel bei internen Wikis noch ein paar zusätzliche Bedürfnisse. Dafür stehen diverse <a href="http://www.mediawiki.org/wiki/Category:Extensions" target="_blank">Extensions</a> zur Verfügung.</p>
<p><strong>Benutzerregistrierung und Freischaltung</strong><br />
Um eine Registrierung neuer Benutzer mit einer administrativen Freischaltung zu verbinden bietet sich die Extension <em>Confirm user accounts</em> an (<a href="http://www.mediawiki.org/wiki/Extension:ConfirmAccount" target="_blank">http://www.mediawiki.org/wiki/Extension:ConfirmAccount</a>). Von Hause aus besitzt Mediawiki nämlich keinen derartigen Workflow, sondern es kann sich einfach jeder registrieren.</p>
<p><strong>Letzte Änderungen anzeigen</strong><br />
In meinen Augen ein wirklich wichtiges Plugin: <em>News </em>(<a href="http://mediawiki.org/wiki/Extension:News" target="_blank">http://mediawiki.org/wiki/Extension:News</a>). Zeigt die letzten Änderungen im Wiki an, kann auch nach Kategorien filtern und bietet noch etliche weitere Einstellungen. So kann man z.B. eine Startseite bauen, welche die neuesten Einträge pro Abteilung anzeigt.</p>
<p><strong><br />
Alte Artikelversionen löschen</strong><br />
<em>Special:DeleteOldRevisions2</em> (<a href="http://www.mediawiki.org/wiki/Extension:SpecialDeleteOldRevisions2" target="_blank">http://www.mediawiki.org/wiki/Extension:SpecialDeleteOldRevisions2</a>) ermöglicht das Löschen alter Artikelversionen. So kann man z.B. Platz sparen oder sensitive Informationen aus der History eines Artikels verschwinden lassen.</p>
<p><strong><br />
Benutzer Löschen</strong><br />
Möchte man Benutzeraccounts löschen, weil der betroffene Anwender z.B. ausgeschieden ist oder es sich um einen Testaccount handelte, ist man mit <em>User Merge and Delete</em> (<a href="http://www.mediawiki.org/wiki/Extension:User_Merge_and_Delete" target="_blank">http://www.mediawiki.org/wiki/Extension:User_Merge_and_Delete</a>) gut beraten. Die Extension löscht nicht nur den Account. Sie sorgt auch dafür, dass der Datenbestand konsistent bleibt, indem die Beiträge des gelöschten Users einem anderen (im Zweifel anonymen) Benutzer zugeordnet werden.</p>
<p><strong>Syntax Highlighting</strong><br />
Für IT/Entwickler-Wikis, welche Quellcode enthalten, interessant: <a href="http://de.wikipedia.org/wiki/Syntaxhervorhebung" target="_blank">Syntax Highlighting</a> für bessere Lesbarkeit. Hier habe ich mit<em> SyntaxHighlight GeSHi</em> (<a href="http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi" target="_blank">http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi</a>) gute Erfahrungen gemacht.</p>
<p><strong><br />
Skype Links</strong><br />
Wird Skype im Unternehmen (oder wo auch sonst) eingesetzt bietet sich noch die <em>Skype-Extension</em> (<a href="http://www.mediawiki.org/wiki/Extension:Skype" target="_blank">http://www.mediawiki.org/wiki/Extension:Skype</a>) an. Diese muss zwar vor der Installation erst von Hand in eine PHP-Datei kopieren, anschließend kann man aber Skype-Links direkt ins Wiki-Markup einbauen und so Ansprechpartner quasi per Klick erreichen.</p>
<p>Die Extensions laufen übrigens alle problemlos mit der Mediawiki-Software 1.15.3.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2010/05/07/intranet-wikis-mit-mediawiki-und-extensions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IDEs In The Cloud</title>
		<link>http://www.renemt.de/2010/05/06/ides-in-the-cloud/</link>
		<comments>http://www.renemt.de/2010/05/06/ides-in-the-cloud/#comments</comments>
		<pubDate>Thu, 06 May 2010 17:33:16 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://www.renemt.de/?p=811</guid>
		<description><![CDATA[Der Trend zu Cloud Computing macht auch vor Entwicklungsumgebungen nicht halt. Aktuelles Beispiel: Das Mozilla Bespin-Projekt. Das Bespin-Projekt baut einen webbasierenden, einfach erweiterbaren Code-Editor mittels des HTML5-Standards. Der Editor läuft komplett im Browser . Er kann entweder in eigene Anwendungen &#8230; <a href="http://www.renemt.de/2010/05/06/ides-in-the-cloud/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Der Trend zu <a href="http://de.wikipedia.org/wiki/Cloud_Computing" target="_blank"><em>Cloud Computing</em></a> macht auch vor Entwicklungsumgebungen nicht halt. Aktuelles Beispiel: Das <a href="https://mozillalabs.com/bespin/" target="_blank">Mozilla Bespin</a>-Projekt.</p>
<p><img id="6ae3bfe6-6b6a-420e-9f9c-5d9cfc91d3a9" title="mozilla_bespin.jpg" src="http://www.renemt.de/wp-content/uploads/2010/05/mozilla_bespin.jpg" alt="mozilla_bespin.jpg" width="450" /></p>
<p>Das Bespin-Projekt baut einen webbasierenden, einfach erweiterbaren Code-Editor mittels des HTML5-Standards. Der Editor läuft komplett im Browser . Er kann entweder in eigene Anwendungen eingebettet oder auf einem Server installiert werden. Bei Mozilla Labs gibt es unter <a href="https://bespin.mozillalabs.com/" target="_blank">https://bespin.mozillalabs.com/</a> eine Demo-Installation. Der Editor beherrscht bereits Syntax Highlight für diverse Programmiersprachen und die Anbindung an ein Version Control System.</p>
<p>Weitere Beispiele für den &#8220;IDE-in-the-cloud&#8221; &#8211; Trend sind <a href="http://ecco.sourceforge.net/" target="_blank">Ecco</a> oder der <a href="http://creator.zoho.com/" target="_blank">Zoho Creator</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2010/05/06/ides-in-the-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Risiken von Drittanbieter-Komponenten</title>
		<link>http://www.renemt.de/2010/02/13/risiken-von-drittanbieter-komponenten/</link>
		<comments>http://www.renemt.de/2010/02/13/risiken-von-drittanbieter-komponenten/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 13:39:32 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/?p=715</guid>
		<description><![CDATA[Falls jemandem &#8220;Risiko beim Einsatz von Drittanbieter-Komponenten&#8221; nichts sagt dann braucht er sich eigentlich nur die aktuelle Situation bei Toyota anzuschauen: Das klemmende Gaspedal, welches gerade dabei ist, das Markenimage zu ramponieren, kommt vom Zulieferer CTS, einem Drittanbieter also. In &#8230; <a href="http://www.renemt.de/2010/02/13/risiken-von-drittanbieter-komponenten/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Falls jemandem &#8220;Risiko beim Einsatz von Drittanbieter-Komponenten&#8221; nichts sagt dann braucht er sich eigentlich nur die aktuelle Situation bei Toyota anzuschauen: Das klemmende Gaspedal, welches gerade dabei ist, das Markenimage zu ramponieren, <a href="www.auto-motor-und-sport.de/.../toyota-rueckruf-neues-gaspedal-soll-problem-loesen-1712555.html" target="_blank">kommt vom Zulieferer CTS</a>, einem Drittanbieter also.</p>
<p>In der Produktion Teile von Drittanbietern einzusetzen ist gang und gäbe. Ob in der Autoindustrie oder in der Softwareentwicklung. Die Motivation dahinter ist letzendlich, Zeit und Geld zu sparen. Warum sollte ich das Rad neu erfinden? Der Drittanbieter hat in der Regel bereits beträchtliche Summen in die Perfektion seiner Komponente investiert und meine eigenen Ausgaben würden höchst wahrscheinlich ähnlich hoch sein, bis ich ein vergleichbares Produkt selbst entwickelt habe.</p>
<p>Allerdings birgt die Abhängigkeit von einem externen Anbieter immer Risiken, auch in der Sofwareentwicklung. Beispiel aus der Praxis: Wir entwickeln in meiner Firma ein geschäftskritisches, internes Projektmanagement-System, eine Windows-Client/Server-Anwendung auf Basis von Microsoft .NET. Für die Benutzeroberfläche setzen wir stark auf die <a href="http://www.telerik.com/products/winforms.aspx" target="_blank">telerik RadControls for WinForms</a>, ein (auf den ersten Blick) ziemlich beeindruckendes Framework von UI-Controls. Allerdings stoßen wir hier immer wieder auf ärgerliche Bugs. Für viele lässt sich in der Regel ein schneller Workaround finden, so dass die Investitionen in die RadControls insgesamt noch deutlich unter dem Aufwand für eine entsprechende Eigenentwicklung liegen.</p>
<p>Allerdings gibt es momentan ein Problem, für dass wir keinen Workaround entwickeln können: Die ganze Anwendung stürzt beim Drücken einer Akzent-Taste ab. Da wir ein Übersetzungsdienstleister sind, der u.a. auch Französisch anbietet und mit Kunden und Lieferanten in aller Welt zusammenarbeitet, ist das natürlich kritisch. Mehrmals pro Tag hört man hier im Büro die Flüche der Anwender, die gerade wieder einmal ihren Client per Akzent ins Nirvana befördert haben. Der Fehler ist nun bereits an telerik gemeldet und bestätigt worden, für dessen Behebung gibt es allerdings noch keinen Termin.</p>
<p>Diese Situation ist natürlich extrem unbefriedigend. Was haben wir für Alternativen? Wir könnten auf die RadControls verzichten. Das bedeutet aber entweder extrem hohen Aufwand für die Eigenentwicklung brauchbarer Alternativen oder Investitionen in eine Controlsuite eines Konkurrenzanbieters, einschließlich des Lernaufwandes der Entwickler &#8211; und wer garantiert uns, dass diese Control letztendlich fehlerfreier sind? Wir könnten auch den Sourcecode der betroffenen Controls selbst anpassen, der uns aufgrund unserer Lizenz zur Verfügung steht. Damit läuft man aber wieder in Probleme beim Update auf ein neues Release der Controls. Oder wir warten einfach, bis telerik den Fehler behoben hat, gegebenenfalls kann man versuchen, den Prozess durch regelmäßiges Nachfragen beschleunigen.</p>
<p>Alles in allem also nur die Wahl zwischen Pest und Cholera. Hier ist wie gesagt &#8220;nur&#8221; unser internes PM-System betroffen. Nicht auszudenken, wenn es sich um eine extern releaste Software handeln würde. Die Nutzen und Risiken sollten in dem Fall also tatsächlich gut abgewogen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2010/02/13/risiken-von-drittanbieter-komponenten/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lavalampen-Buildstatus</title>
		<link>http://www.renemt.de/2008/03/10/lavalampen-buildstatus/</link>
		<comments>http://www.renemt.de/2008/03/10/lavalampen-buildstatus/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 18:47:38 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2008/03/10/lavalampen-buildstatus/</guid>
		<description><![CDATA[Dass Entwickler kreative Menschen sein müssen sieht man an diesem Projekt: http://mark.michaelis.net/Blog/BuildStatusUsingLavaLampsByKenNichols.aspx Da lässt doch tatsächlich jemand den Build-Status seines Projekts computergesteuert von verschiedenfarbigen Lavalampen anzeigen. Sehenswert]]></description>
			<content:encoded><![CDATA[<p>Dass Entwickler kreative Menschen sein müssen sieht man an diesem Projekt:</p>
<p><a href="http://mark.michaelis.net/Blog/BuildStatusUsingLavaLampsByKenNichols.aspx" target="_blank">http://mark.michaelis.net/Blog/BuildStatusUsingLavaLampsByKenNichols.aspx</a></p>
<p>Da lässt doch tatsächlich jemand den Build-Status seines Projekts computergesteuert von verschiedenfarbigen <a href="http://de.wikipedia.org/wiki/Lavalampe" target="_blank">Lavalampen</a> anzeigen.</p>
<p>Sehenswert <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2008/03/10/lavalampen-buildstatus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NHibernate + MySqlDateTime: Solved</title>
		<link>http://www.renemt.de/2008/02/26/nhibernate-mysqldatetime-solved/</link>
		<comments>http://www.renemt.de/2008/02/26/nhibernate-mysqldatetime-solved/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 19:27:03 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2008/02/26/nhibernate-mysqldatetime-solved/</guid>
		<description><![CDATA[In letzer Zeit setze ich bei Webprojekten vermehrt Castle ActiveRecord ein, das ja bekanntlich auf NHibernate basiert. An sich eine super Sache, ActiveRecord (respektive NHibernate) ist wirklich ein ziemlich komfortabler O/R-Mapper, der wahre Produktivitäts-Sprünge beschert. Allerdings gibt es ein kleines &#8230; <a href="http://www.renemt.de/2008/02/26/nhibernate-mysqldatetime-solved/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In letzer Zeit setze ich bei Webprojekten vermehrt <a href="http://www.castleproject.org/" target="_blank">Castle</a> <a href="http://www.castleproject.org/activerecord/index.html" target="_blank">ActiveRecord</a> ein, das ja bekanntlich auf <a href="http://www.nhibernate.org" target="_blank">NHibernate</a> basiert. An sich eine super Sache, ActiveRecord (respektive NHibernate) ist wirklich ein ziemlich komfortabler <a href="http://de.wikipedia.org/wiki/Objektrelationale_Abbildung" target="-blank">O/R-Mapper</a>, der wahre Produktivitäts-Sprünge beschert.</p>
<p>Allerdings gibt es ein kleines <a href="http://www.hibernate.org/361.html#A8" target="_blank">Problem bei der Zusammenarbeit von NHibernate und MySQL</a> im Zusammenhang mit dem <a href="http://www.mysql.de/products/connector/net/" target="_blank">MySQL Connector/NET</a>: MySQL bietet, warum auch immer, so genannte &#8220;Null-DateTimes&#8221; an, d.h. Daten der Art <em>00/00/0000</em>. Außer MySQL kann damit allerdings niemand so recht etwas anfangen, schon gar nicht das <em>System.DateTime</em>-Struct von .NET. Die Eigenintelligenz von NHibernate gibt sich nun zwar alle Mühe, den Inhalt eines nicht-leeres DATE(TIME)-Feld in der DB in ein <em>DateTime</em> zu konvertieren, erntet aber leider eine Exception, da .NET, verständlicher Weise, keine Null-DateTimes akzeptiert.</p>
<p>Eine in meinen Augen schlaue Lösung wäre, die Null-DateTimes wie ein leeres Feld (NULL) zu behandel und dementsprechend statt eines normalen <em>DateTime</em>s ein <em>DateTime?</em>, also ein nullable DateTime für die entsprechende Porperty zu benutzen. Was nun noch fehlt ist die Möglichkeit, das Feld in der Datenbank ohne Exception entsprechend zu konvertieren, d.h. die Intelligenz von NHibernate durch einen eigenen &#8220;Konverter&#8221; zu erweitern.</p>
<p>Genau für solche Zwecke bietet NHibernate den <a href="http://www.surcombe.com/nhibernate-1.2/api/html/T_NHibernate_UserTypes_IUserType.htm" target="_blank">IUserType</a> an. Eine Klasse, die dieses Interface implementiert, kann für die entsprechenden Properties einer O/R-Klasse als ColumnType angegeben werden. Das Lesen und Schreiben der Property, bzw. dessen Vorbereitung, erledigt dann die IUserType-Implementierung. Im folgenden nun ein Beispiel für eine geeignete Vorgehensweise bezüglich der MySqlDateTime-Problematik:</p>
<p><strong>UserType:</strong><br />
<code><br />
namespace ReneMt.Data<br />
{<br />
public class HibernateNullableDateTime : NHibernate.UserTypes.IUserType<br />
{<br />
public object Assemble(object cached, object owner)<br />
{<br />
return DeepCopy(cached);<br />
}</p>
<p>public object DeepCopy(object value)<br />
{<br />
return value;<br />
}</p>
<p>public object Disassemble(object value)<br />
{<br />
return DeepCopy(value);<br />
}</p>
<p>public new bool Equals(object x, object y)<br />
{<br />
if (null == x &amp;&amp; null == y)<br />
return true;<br />
else if (null != x)<br />
return x.Equals(y);<br />
else<br />
return y.Equals(x);<br />
}</p>
<p>public int GetHashCode(object x)<br />
{<br />
return x.GetHashCode();<br />
}</p>
<p>public bool IsMutable<br />
{<br />
get { return false; }<br />
}</p>
<p>public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)<br />
{<br />
if (names.Length == 1)<br />
{<br />
object obj = rs[names[0]];</p>
<p>if (null == obj || obj is DBNull)<br />
return new DateTime?();</p>
<p>if (obj is MySqlDateTime)<br />
{<br />
MySqlDateTime mySqlDateTime = (MySqlDateTime)obj;<br />
if (mySqlDateTime.IsNull)<br />
return new DateTime?();<br />
else<br />
{<br />
if (0 == mySqlDateTime.Day || 0 == mySqlDateTime.Month || 0 == mySqlDateTime.Year)<br />
return new DateTime?();<br />
return new DateTime?(mySqlDateTime.GetDateTime());<br />
}<br />
}<br />
else if (obj is DateTime)<br />
return new DateTime?((DateTime)obj);</p>
<p>throw new InvalidCastException("Can not convert object of type " +<br />
obj.GetType().FullName + " to " + typeof(MySqlDateTime?).FullName);<br />
}<br />
throw new InvalidCastException("Single column expected.");<br />
}</p>
<p>public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)<br />
{<br />
System.Data.IDataParameter param = cmd.Parameters[index] as System.Data.IDataParameter;</p>
<p>param.DbType = System.Data.DbType.DateTime;</p>
<p>if (null == value)<br />
{<br />
param.Value = DBNull.Value;<br />
}<br />
else if (value is MySqlDateTime)<br />
{<br />
MySqlDateTime mySqlDateTime = (MySqlDateTime)value;<br />
if (mySqlDateTime.IsNull)<br />
param.Value = DBNull.Value;<br />
else<br />
param.Value = mySqlDateTime.GetDateTime();<br />
}<br />
else if (value is DateTime)<br />
{<br />
param.Value = value;<br />
}</p>
<p>throw new ArgumentException("Object of type " + typeof(MySqlDateTime).FullName +<br />
" expected, but object of type " + value.GetType().FullName + " has been passed.");<br />
}</p>
<p>public object Replace(object original, object target, object owner)<br />
{<br />
return original;<br />
}</p>
<p>public Type ReturnedType<br />
{<br />
get<br />
{<br />
return typeof(DateTime?);<br />
}<br />
}</p>
<p>public NHibernate.SqlTypes.SqlType[] SqlTypes<br />
{<br />
get<br />
{<br />
return new NHibernate.SqlTypes.SqlType[] { NHibernate.NHibernateUtil.DateTime.SqlType };<br />
}<br />
}</p>
<p>}<br />
}<br />
</code></p>
<p><strong>O/R-Klasse:</strong><br />
<code><br />
using Castle.ActiveRecord;</p>
<p>namespace ReneMt.Data<br />
{<br />
[ActiveRecord("TEST")]<br />
public class NaturalPerson : ActiveRecordBase<br />
{<br />
privateint m_id;<br />
private DateTime? m_dayOfBirth;</p>
<p>[Property("dayofbirth",<br />
ColumnType = "ReneMt.Data.HibernateNullableDateTime, ReneMt.Data")]<br />
public DateTime? DayOfBirth<br />
{<br />
get { return m_dayOfBirth; }<br />
set { m_dayOfBirth = value; }<br />
}<br />
}<br />
}<br />
</code></p>
<p>That&#8217;s it <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2008/02/26/nhibernate-mysqldatetime-solved/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Ring für Entwickler</title>
		<link>http://www.renemt.de/2007/12/19/the-ring-fur-entwickler/</link>
		<comments>http://www.renemt.de/2007/12/19/the-ring-fur-entwickler/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 18:51:32 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/12/19/the-ring-fur-entwickler/</guid>
		<description><![CDATA[Ich arbeite gelegentlich für eine Firma, die vermutlich genau den Code geschrieben hat Hoffentlich wird da nie Open Source draus.]]></description>
			<content:encoded><![CDATA[<p><a class="imagelink" href="http://www.renemt.de/wp-content/uploads/2007/12/thering.jpg" target="_blank" title="thering.jpg"><img id="image626" src="http://www.renemt.de/wp-content/uploads/2007/12/theringVorschaubild.jpg" alt="thering.jpg" /></a></p>
<p>Ich arbeite gelegentlich für eine Firma, die vermutlich genau den Code geschrieben hat <img src='http://www.renemt.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hoffentlich wird da nie Open Source draus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/12/19/the-ring-fur-entwickler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entwicklerfrust ;)</title>
		<link>http://www.renemt.de/2007/11/27/entwicklerfrust/</link>
		<comments>http://www.renemt.de/2007/11/27/entwicklerfrust/#comments</comments>
		<pubDate>Tue, 27 Nov 2007 18:51:57 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/11/27/entwicklerfrust/</guid>
		<description><![CDATA[Mitunter hat man mal so richtig Lust, es diesem blöden Visual Studio zu zeigen. Aber da steht es wohl drüber Könnte aber auch daran liegen, dass wir in der Firma mit einer deutschen Version arbeiten &#8211; wobei alleine das oftmals &#8230; <a href="http://www.renemt.de/2007/11/27/entwicklerfrust/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p align="center">
<a class="imagelink" href="http://www.renemt.de/wp-content/uploads/2007/11/entwicklerfrust.jpg" target="_blank" title="entwicklerfrust.jpg"><img id="image619" src="http://www.renemt.de/wp-content/uploads/2007/11/entwicklerfrustVorschaubild.jpg" alt="entwicklerfrust.jpg" /></a>
</p>
<p>
Mitunter hat man mal so richtig Lust, es diesem blöden Visual Studio zu zeigen. Aber da steht es wohl drüber <img src='http://www.renemt.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p>
<p>
<small>Könnte aber auch daran liegen, dass wir in der Firma mit einer deutschen Version arbeiten &#8211; wobei alleine das oftmals schon die Pest ist.)<br />
</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/11/27/entwicklerfrust/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paradigmenwechsel</title>
		<link>http://www.renemt.de/2007/11/24/paradigmenwechsel/</link>
		<comments>http://www.renemt.de/2007/11/24/paradigmenwechsel/#comments</comments>
		<pubDate>Sat, 24 Nov 2007 21:36:18 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/11/24/paradigmenwechsel/</guid>
		<description><![CDATA[Ich sitze hier, am Samstag morgen, und hacke (nach längerer Zeit) diese Zeilen in mein Blog. Was daran jetzt so außergewöhnlich sein soll? Ich sitze an meinem Laptop, auf dem Linux läuft Nein, ich werde jetzt nicht der Microsoft-Welt abschwören &#8230; <a href="http://www.renemt.de/2007/11/24/paradigmenwechsel/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich sitze hier,  am Samstag morgen, und hacke (nach längerer Zeit) diese Zeilen in mein Blog. Was daran jetzt so außergewöhnlich sein soll?</p>
<p>Ich sitze an meinem Laptop, auf dem Linux  läuft <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nein, ich werde jetzt nicht der Microsoft-Welt abschwören (zumindest nicht komplett), und auch statt &#8220;richtigem&#8221; .NET nur noch Mono machen. Die Geschichte geht so:<br />
<span id="more-618"></span><br />
Dass ich mich  mit Linux eingehender beschäftig habe ist schon etwas her. Klar lese ich im Netz und in der Fachpresse öfter mal interessante Sachen &#8211; aber dabei schwingen immer solche Gedanken mit wie &#8220;Wer MACHT sich denn so ein Stress? Ich nehm einfach Windows (-Server) und gut ist!&#8221; Das ist auch die schöne Realität in der Firma &#8211; aber außerhalb sieht das natürlich etwas anders aus, hauptsächlich weil alles Gute von Microsoft auch gut Geld kostet. Linux testete ich daher vor etwa 10 Jahren etwas  ausgiebiger, und dann nochmal während meiner Studienzeit. Ergebnis damals: Ganz nett teilweise &#8211; aber richtig sinnvoll nur für Nerds, da es noch zu viele Probleme gab.</p>
<p>Nun arbeite  ich, abseits der Firma, an einem neuen Web-Projekt, und zwar mit mehreren Leuten. Für die verteilte  Entwicklung ist natürlich ein zentrales  Sourcecode-Repository so ziemlich unerlässlich. Und viel Geld kosten sollte das auch nicht. Wir setzen Subversion ein, mit dem ich in der Firma schon sehr gute Erfahrungen gemacht habe. Um einen entsprechenden Server aufzusetzen brauche ich dort quasi administrativen Vollzugriff, um die Konfiguration funktionstüchtig einzurichten. Webhosting scheidet somit quasi komplett aus, und managed Server kosten Geld.</p>
<p>Allerdings habe ich noch meinen guten, alten Laptop &#8216;rumliegen. Einen 2001er Dell Latitude CPxH, Pentium III 450MHz, 256MB RAM, 30GB HD, Xircom RBEM100-56G PCMCIA-Netzwerkkarte. Stromverbrauch ohne Akku: Knapp 20 Watt mit eingeschaltetem Display, ohne sogar weniger. Außerdem haben wir bei Flexstrom ein 2.400kWh-Ã–kostrom-Paket gebucht, bleiben aber beim Verbrauch wohl deutlich darunter, nämlich bei etwa 1.500 bis 1.800kWh. Wenn der Laptop-Server nun 24/365 durchliefe wären das wohl max. 200kWh im Jahr. Somit entstand die Idee, auf dem Laptop einen Linux-basierenden Subversion-Server zu installieren.</p>
<p>Allerdings klingt das einfacher, als es war <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Zunächst einmal war das Original-CD-ROM-Laufwerk defekt. Ich konnte also keine Systeminstallation von CD booten. Und da sowohl CD als auch Disketten-Laufwerk bei diesem Notebook Wechsellaufwerke sind, die in ein und den selben Schacht kommen, erwies sich die Idee, von Diskette zu booten und dann die CD zu mounten auch als etwas schwierig. So entschloss ich mich, noch einmal EUR 30,00 in meine antiquarische Rechenmaschine zu investieren und kaufte ein neues CD-RW/DVD-ROM-Laufwerk. Die nächste Hürde: Das passte nur prinzipiell ins Wechselgehäuse. Das Problem war die Frontblende. Die Original Dell-Blende passte nicht aufs neue Laufwerk und die neue Blende war zu breit für den Laufwerkskäfig. Da dieser aus Kunststoff besteht und ich auch Besitzer eines Cutter-Messers bin wurde er kurzerhand zurechtgeschnitten. Sieht nicht mehr unbedingt original aus, aber dafür passt das Laufwerk.</p>
<p>&#8220;Puh&#8221;, dacht ich, &#8220;das Schmlimmste ist überstanden. Nur noch schnell installieren.&#8221; Denkste. Beim Selbsttest nach dem Einschalten meldete das Notebook: &#8220;Ich kann das Laufwerk im Wechselschacht nicht erkennen!&#8221; &#8211; und ließ sich nur noch herunterfahren. Die Linux-Installation von CD zu booten schied also aus. Damit flog auch der erste dafür auserwählte Kandidat aus dem Rennen: Der Debian-basierende c&#8217;t-Server ließ sich nur von einer Boot-CD starten &#8211; und erkannte außerdem die Xircom-Netzwerkkarte nicht. Auf dem Notebook befand sich noch eine Windows-Installation &#8211; und unter dieser funktionierte das CD-Laufwerk problemlos. Das machte Hoffnung und legte folgende Strategie nah: CD-Laufwerk entfernen, Notebook starten, nach dem Selbsttest Laufwerk wieder einsetzen. Mit booten von CD/DVD war da zwar immer noch nix mehr, aber nutzen konnte man das Laufwerk wenigstens ansonsten. </p>
<p>Jetzt lud ich mir openSUSE 10.3 herunter. Und welche Freude: Da gibt es einen Windows-Installer. Man kann die Installation unter Windows anstoßen, neu starten und dann weiter installieren. Und das funktionierte auch mit der zurecht gelegten CD-Laufwerks-Strategie problemlos. Weiterhin erkannte SUSE auch die Xircom-Netzwerkkarte: Während des Setups synchronisierte sich das Notebook bereits mit einem NTP-Server im Internet. Klasse!</p>
<p>30min später war die Freude allerdings nicht mehr los: Obwohl das System zwar die Netzwerkkarte erkannte und korrekt für DHCP konfiguriert war erhielt die Karte keine IP-Adresse und der Netzwerk-Zugriff war somit unmöglich. Und zwar schon während des letzten Teils des Setups, als eigentlich online nach Updates gesucht werden sollte. Nach einer Nacht drüber schlafen dämmerte mir eine Lösung: Beim Setup konnte man für die Konfiguration der Netzwerkkarte zwischen &#8220;User Controlled with Network Manager&#8221; oder &#8220;Traditional Method with ifup&#8221; wählen. Ich, ganz dem Fortschritt huldigend, wählte natürlich den Network Manager. Als ich dann im Yast-Control Panel auf &#8220;ifup&#8221; umstellte hatte ich auch eine funktionierende Netzwerkverbindung.</p>
<p>Der Rest war dann schnell erledigt: Den SSH-Dämon konfigurieren, bei opensuse.org das Subversion-Paket herunterladen und installieren, Repository-Ordner anlegen und Rechte setzen. Nun läuft bei mir ein knapp 20W verbrauchender Subversion-Server mit für den derzeitigen Umfang des Projekts völlig ausreichender Performance.</p>
<p>Weiterhin muss ich feststellen: Sofern man nicht auf irgendwelche Windows-Programme unbedingt angewiesen ist, ist so ein Linux als Betriebssystem völlig ausreichend. OpenSUSE mit KDE als Desktop sieht meiner Meinung nach super aus, ist XP bedientechnisch teilweise deutlich voraus, fühlt sich selbst auf meiner alten Hardware agil an und läuft stabil und zuverlässig mit der gesamten, vorhandenen Hardware. Hätte ich noch OpenOffice sowie die Multimedia-Komponenten installiert hätte ich vermutlich ein ziemlich vollwertiges Desktop-System. Eigentlich sehe ich nur bei zwei Punkten Schwierigkeiten für einen konsequenten Linux-Einsatz:</p>
<p>1. Ich bin Gamer &#8211; die meisten aktuellen Spiele gibt es nun mal auf Windows/DirectX-Basis<br />
2. Ich bin auf bestimmte Windows-Software angewiesen. Stichwort: Visual Studio / .NET-Entwicklung</p>
<p>Aber ggf. lässt sich hier ja auch eine Lösung in Form von Emulatoren/APIs (Wine) oder dem Einsatz einer VM finden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/11/24/paradigmenwechsel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Threads beenden mit Thread.Abort</title>
		<link>http://www.renemt.de/2007/10/16/threads-beenden-mit-threadabort/</link>
		<comments>http://www.renemt.de/2007/10/16/threads-beenden-mit-threadabort/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 19:15:51 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/10/16/threads-beenden-mit-threadabort/</guid>
		<description><![CDATA[Mitten im Umzugs- und Renovierungs-Stress nach langer Zeit nun wieder mal ein Artikel aus dem .NET-Bereich. Über das Thema bin ich heute bei der Arbeit gestolpert. Hintergrund: Ich bastle gerade eine Multithreading-Anwendung, eigentlich eher eine Dualthread-Anwendung: Ein Thread für die &#8230; <a href="http://www.renemt.de/2007/10/16/threads-beenden-mit-threadabort/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mitten im Umzugs- und Renovierungs-Stress nach langer Zeit nun wieder mal ein Artikel aus dem .NET-Bereich. Über das Thema bin ich heute bei der Arbeit gestolpert.</p>
<p>Hintergrund: Ich bastle gerade eine Multithreading-Anwendung, eigentlich eher eine Dualthread-Anwendung: Ein Thread für die eigentliche Arbeit, einer für die Benutzeroberfläche inklusive &#8220;Abbrechen&#8221;-Schaltfläche <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Die Idee ist altbekannt: Der Workerthread läuft im Hintergrund und soll seine Arbeit abbrechen, wenn der User in der Oberfläche auf den entsprechenden Button klickt. Da die Teilergebnisse seiner Arbeit in meinem Fall bei einem Abbruch uninteressant sind kann der Thread also tatsächlich sofort aufhören zu arbeiten, wenn der User das will.<br />
Die simpelste Möglichkeit, ohne irgendwelche Flags als synchronisierte Membervariablen o.ä. zu implementieren, ist ein Aufruf von <a href=" http://msdn2.microsoft.com/en-us/library/system.threading.thread.abort.aspx" target="blank"><code>Thread.Abort</code></a>. Der Aufruf führt dazu, dass &#8211; sowohl im aufrufenden als auch im Workerthread &#8211; eine <a href=" http://msdn2.microsoft.com/en-us/library/system.threading.threadabortexception.aspx" target="_blank"><code>ThreadAbortException</code></a> geworfen und der Thread (in der Regel) unverzüglich termniniert wird.</p>
<p>Die <code>ThreadAbortException</code> kann allerdings etwas lästig werden, sie ist nämlich nicht tot zu kriegen. Wie die MSDN dazu ausführt:</p>
<blockquote><p>&quot;<strong>ThreadAbortException</strong> is a special exception that can be caught, but it will automatically be raised again at the end of the <strong>catch</strong> block. &quot;</p></blockquote>
<p>.</p>
<p>Das kann zur Folge haben, dass die <code>ThreadAbortException</code> an mehreren Stellen in diversen Exception-Handlern hängen bleibt, und der Anwender z.B. in einer MessageBox darüber benachrichtigt wird. Folglich sind diverse Sonderbehandlungen notwendig.</p>
<p>Allerdings ergibt sich hier eine interessante Möglichkeit: Man kann die <code>ThreadAbortException</code> auch dazu benutzen, den WorkerThread davon zu benachrichtigen, dass er sich beenden soll. Möglich wird das, weil die Exception ja auch in ihm (also in seinem Thread) geworfen wird &#8211; und dort auch gefangen werden kann. So kann z.B. eine aufgerufene Methode sauber <code>null</code> zurückliefern. Wenn da nicht dass Problem wäre, dass die Exception immer erneut geworfen wird.</p>
<p>Abhilfe schafft hier die Methode <code>Thread.ResetAbort </code>. Diese bricht einen Abort-Request für einen Thread wieder ab, so dass dieser im Prinzip völlig desinteressiert weiterlaufen könnte &#8211; oder sich aber auch selbst beenden. In beiden Fällen verschwindet auch die <code>ThreadAbortException</code> wieder. Somit ließe sich ein &quot;sauberer&quot; Abbruch des WorkerThreads nach folgendem Muster realisieren:</p>
<p><code><br />
class MainForm<br />
{<br />
&nbsp;&nbsp;protected void btnCancelWorkerThread_Click(object sender, EventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_workerThread.Abort;<br />
&nbsp;&nbsp;}<br />
}</p>
<p>class HeavyWorker<br />
{<br />
&nbsp;&nbsp;public byte[] DoHeavyWork(string params)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return InternalHeavyWork(params);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;catch (ThreadAbortExcpetion)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.ResetAbort();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/10/16/threads-beenden-mit-threadabort/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Murphy&#8217;s Gesetz&#8230;</title>
		<link>http://www.renemt.de/2007/07/26/murphys-gesetz/</link>
		<comments>http://www.renemt.de/2007/07/26/murphys-gesetz/#comments</comments>
		<pubDate>Thu, 26 Jul 2007 18:11:36 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/07/26/murphys-gesetz/</guid>
		<description><![CDATA[Man stelle sich vor, man habe eine Menge, sagen wir 15, Dateien nach einen Begriff zu durchsuchen. Manuell, weil aus verschiedenen Gründen eine automatisierte Suche nicht möglich ist. Das Ã–ffnen einer Datei dauert dabei gute 20 Sekunden. Also öffnet man &#8230; <a href="http://www.renemt.de/2007/07/26/murphys-gesetz/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Man stelle sich vor, man habe eine Menge, sagen wir 15, Dateien nach einen Begriff zu durchsuchen. Manuell, weil aus verschiedenen Gründen eine automatisierte Suche nicht möglich ist. Das Ã–ffnen einer Datei dauert dabei gute 20 Sekunden. Also öffnet man die ersten drei Dateien, um festzustellen, dass der Begriff hier nicht enthalten ist. Dann die letzten drei, hier ist er natürlich auch nicht zu finden. Resignierend durchsucht man darauf von vorn angefangen alle verbleibenden Dateien.</p>
<p>Quizfrage: In welcher versteckt sich der Begriff?</p>
<p>Antwort: Richtig, in der viertletzten&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/07/26/murphys-gesetz/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gemischtwarenladen</title>
		<link>http://www.renemt.de/2007/05/10/gemischtwarenladen/</link>
		<comments>http://www.renemt.de/2007/05/10/gemischtwarenladen/#comments</comments>
		<pubDate>Thu, 10 May 2007 17:09:45 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/05/10/gemischtwarenladen/</guid>
		<description><![CDATA[Telerik bietet eine Suite von ziemlich schicken Controls für ASP.NET an. Dazu gibt es online natürlich auch Beispiele zu sehen. Unter anderem das Folgende: Das lustige daran: Hier soll so eine Art Online-Konfigurator für Autos nachgebildet werden. Die Datenquelle für &#8230; <a href="http://www.renemt.de/2007/05/10/gemischtwarenladen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.telerik.com" target="_blank">Telerik</a> bietet eine Suite von ziemlich schicken Controls für ASP.NET an. Dazu gibt es online natürlich auch Beispiele zu sehen. Unter anderem das <a href="http://www.telerik.com/demos/aspnet/Combobox/Examples/Functionality/WhatsNew/DefaultCS.aspx" target="_blank">Folgende</a>:</p>
<p align="center"><a href="http://www.telerik.com/demos/aspnet/Combobox/Examples/Functionality/WhatsNew/DefaultCS.aspx" target="_blank"><img id="image602" src="http://www.renemt.de/wp-content/uploads/2007/05/rad_comboVorschaubild.jpg" alt="Rad ComboBox" /></a></p>
<p>Das lustige daran: Hier soll so eine Art Online-Konfigurator für Autos nachgebildet werden. Die Datenquelle für die Auswahl des Händlers ist allerdings die gute, alte &#8220;Northwind&#8221;-Datenbank. So kann ich meinen neuen Golf dann in &#8220;Ottilies Käseladen&#8221; erwerben.</p>
<p>Allerdings scheint das Ganze nicht völlig realitätsfremd zu sein: Gegenüber meiner Firma ist ein Laden mit der Überschrift &#8220;D.G. Punjabi &#8211; Imbiss &#038; Autohandel&#8221;. Das nenne ich doch mal &#8220;Cross-Selling&#8221; <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/05/10/gemischtwarenladen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Excel &#8211; nicht tot zu kriegen</title>
		<link>http://www.renemt.de/2007/02/27/excel-nicht-tot-zu-kriegen/</link>
		<comments>http://www.renemt.de/2007/02/27/excel-nicht-tot-zu-kriegen/#comments</comments>
		<pubDate>Tue, 27 Feb 2007 19:53:24 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Allerhand]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/02/27/excel-nicht-tot-zu-kriegen/</guid>
		<description><![CDATA[Original uploaded to flickr by pikkus Momentan schlage ich mich mit einem lästigen Problem herum: Der Webserver unseres in der Entwicklung befindlichen, ASP.NET / AJAX &#8211; basierenden Projektmanagement-Systems soll eine Excel-Datei erstellen. Dafür benutzen wir momentan tatsächlich ein auf dem &#8230; <a href="http://www.renemt.de/2007/02/27/excel-nicht-tot-zu-kriegen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="float:left; padding: 5px; text-align: center;"><a href="http://www.flickr.com/photos/pikkus/398984031/" target="_blank"><img src="http://farm1.static.flickr.com/121/279815194_1aa7e4e72c.jpg?v=0" alt="Help!"/></a><br /><small>Original uploaded to flickr by <a href="http://www.flickr.com/photos/pikkus/" target="_blank">pikkus</a></small></div>
<div>
<p>Momentan schlage ich mich mit einem lästigen Problem herum: Der Webserver unseres in der Entwicklung befindlichen, ASP.NET / AJAX &#8211; basierenden Projektmanagement-Systems soll eine Excel-Datei erstellen. Dafür benutzen wir momentan tatsächlich ein auf dem Server installiertes Excel (ist ja nur im Intranet&#8230;), angesteuert über die .NET-Com-Interop &#8211; Schnittstelle.</p>
<p>Das Problem: Die Excel-Application bleibt hartnäckig am Leben, trotz Schließens aller aktiven Workbooks, Aufruf von <code>Application.Quit</code> und Einsatz von <a href="http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(VS.80).aspx" target="_blank">System.Runtime.InteropServices.Marshal.ReleaseComObject</a> bist zum Ref-Count 0. Seltsamer Weise tritt das Phänomen aber anscheinend nur auf dem Produktivsystem (Windows Server 2003, IIS 6, Office 2003) auf, auf dem Enwicklungsrechner (Windows XP, IIS 5.1, Office 2003) verschwindet Excel nach getaner Arbeit wie gewünscht aus dem Speicher.</p>
<p>Hat jemand zufällig eine Idee, wo hier das Problem &#8211; oder noch besser: Die Lösung &#8211; liegen könnte?</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/02/27/excel-nicht-tot-zu-kriegen/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>IIS 6.0 Session State Management</title>
		<link>http://www.renemt.de/2007/02/16/iis-60-session-state-management/</link>
		<comments>http://www.renemt.de/2007/02/16/iis-60-session-state-management/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 18:31:53 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/02/16/iis-60-session-state-management/</guid>
		<description><![CDATA[Der IIS bietet zwei verschiedene Möglichkeiten zur Session-Verwaltung: In-Proc(ess) Beim In-Process &#8211; Sessionmanagement werden die Session-Daten im selben Speicher gehalten wie der ASP.NET Arbeits-Prozess, welcher die aktuelle Anwendung hostet. Dieses ist die bei weitem schnellste Möglichkeit der Session-Verwalttung, birgt aber &#8230; <a href="http://www.renemt.de/2007/02/16/iis-60-session-state-management/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Der IIS bietet zwei verschiedene Möglichkeiten zur Session-Verwaltung:</p>
<ul>
<li><strong>In-Proc(ess)</strong><br />
Beim In-Process &#8211; Sessionmanagement werden die Session-Daten im selben Speicher gehalten wie der ASP.NET Arbeits-Prozess, welcher die aktuelle Anwendung hostet. Dieses ist die bei weitem schnellste Möglichkeit der Session-Verwalttung, birgt aber auch Risiken: Sollte die ASP.NET-Anwendung aus irgend einem Grund neu starten so sind auch sämtliche Session-Daten verloren.</li>
<li><strong>Out-Of-Process</strong><br />
Beim Out-Of-Process &#8211; Sessionmanagement werden die Session-Daten &#8211; wie der Name schon vermuten lässt &#8211; in einem separaten Prozess verwaltet. Dieser kann entweder auf dem gleichen Server wie der IIS (und der ASP.NET Arbeitsprozess) laufen oder aber auch auf einem anderen Rechner. Dadurch erreicht man hier eine gewisse Skalierbarkeit, denn gerade bei vielen Benutzern (Sessions) und vielen in der Session gespeicherten Daten geht der IIS merklich in die Knie. Weiterhin bleiben die Session-Daten bei einem Reset der ASP.NET-Anwendung erhalten. Der Preis dafür ist jedoch ein gewisser Geschwindigkeitsnachteil gegenüber der In-Proc &#8211; Sessionverwaltung.<br />
&quot;Physisch&quot; gesehen gibt es hier zwei Möglichkeiten:</p>
<ul>
<li>
<strong>ASP.NET State Server</strong><br />
Der IIS 6 bringt von Hause aus den <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/0d9dc063-dc1a-46be-8e84-f05dbb402221.mspx?mfr=true" target="_blank"><em>ASP.NET State Service</em></a> mit, welcher für die Speicherung der Session-Daten verwendet werden kann. Der State Service kann so konfiguriert werden, dass er auf dem gleichen Server läuft, um einen Web Garden zu unterstützen (selbst wenn nur ein einzelner Worker-Prozess genutzt wird) oder auf einem anderen Server, um eine Web Farm aufzuauen (was theoretisch aber auch mit einem einzelnen Server möglich sein müsste). Die Verwendung des State Servers ist verschiedenen Quellen zufolge etwa 15% langsamer als das In-Proc &#8211; Sessionmanagement.
</li>
<li>
<strong>SQL-Server</strong><br />
Wie auch der State Server so kann der SQL-Server für die Session-Verwaltung entweder auf dem gleichen Server oder auf einer anderen Maschine laufen. Seine Verwendung ist etwa 25% langsamer also die In-Proc &#8211; Methode.
</li>
</ul>
<p>Wichtiger Weise zu beachten ist hierbei noch, dass komplexe Objekte, die in der Session gespeichert werden sollen, beim Out-Of-Process &#8211; Sessionmanagement serialisierbar sein müssen.
</li>
</ul>
<p>Arbeitet eine ASP-NET &#8211; Anwendung mit Out-Of-Process &#8211; Sessionmanagement gibt es eigentlich kaum Punkte, um die man sich zu sorgen braucht. Bei der In-Process &#8211; Verwaltung ist das anders &#8211; denn folgende Features des IIS 6 können hier zu Fallstricken werden:</p>
<ul>
<li><strong>Application Pools</strong><br />
Ein Application Pool bietet die Möglichkeit, eine oder mehrere Webseiten von anderen Webseiten zu isolieren. Das wird durch die Verwendung mehrerer getrennter Worker-Prozesse realisiert, welche natürlich auch die Session-Daten getrennt verwalten. Ein virtueller Host im IIS 6 kann mehr als eine Application beinhalten. Steuert man das Anlegen der ASP.NET-Application nicht kann es passieren, dass eine Anwendung von mehreren Worker-Prozessen verwaltet wird. In diesem Fall springt die Anwendung zwischen mehreren Prozessen hin und her. Die Session-Daten sind dann nach dem ersten Request in einem Prozess &quot;verloren&quot;, dafür existiert die gleiche Session mit inkonsistenten Daten (da diese nicht geupdatet werden) nun in mehreren Worker-Prozessen.</li>
<li><strong>Web Gardens</strong><br />
Web Gardens sind kleine, skalierbare Webfarmen (wer hätte es gedacht&#8230;), bei denen auf einem Server mehrere Worker-Prozesse einen Application Pool verwalten. Weil jeder Worker-Prozess seinen eigenen Speicher für die Session-Verwaltung nutzt treten auch hier oben geschilderte Probleme auf. Web Gardens und In-Proc &#8211; Sessionmanagement ist also böse.</li>
<li><strong>Worker-Prozess Recycling</strong><br />
Der IIS 6 bietet die Möglichkeit, Worker-Prozesse nach bestimmten zeitlichen Schemen zu recyclen, d.h. die alten Prozesse zu beenden und neue dafür zu starten, um den Server gesund und sauber zu halten. Das klingt zwar erst einmal super, hat aber den Haken dass beim Recycling eines Worker-Prozesses auch alle in ihm enthaltenen Session-Daten verschwinden. Füllt man gerade ein umfangreiches Formular auf einer Webseite aus oder hat seinen Einkaufswagen voll gepackt so kann dies ziemlich frustrierend werden.</li>
</ul>
<p>Zusammenfassend bleibt also zu sagen: Generell ist bei ASP.NET-Anwendungen auf dem IIS 6 Out-Of-Process &#8211; Sessionmanagement die erste Wahl. Weiterhing sollte man zur vermeidung von Problemen auch möglichst nur einen einzigen Worker-Prozess pro Anwendung einsetzen. Dann kann auch so gut wie nichts mehr schief gehen <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/02/16/iis-60-session-state-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET: IIS 6 und die verschwundenen Sessions</title>
		<link>http://www.renemt.de/2007/02/16/aspnet-iis-6-und-die-verschwundenen-sessions/</link>
		<comments>http://www.renemt.de/2007/02/16/aspnet-iis-6-und-die-verschwundenen-sessions/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 18:30:55 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/02/16/aspnet-iis-6-und-die-verschwundenen-sessions/</guid>
		<description><![CDATA[Original uploaded to flickr by TaranRampersad Bei der Entwicklung unseres ASP.NET / AJAX basierenden Projektmanagement-Problems stießen wir gestern auf eines dieser lustigen Probleme, die an sich eine simple Ursache haben, aber erst einmal stundenlanges Nachforschen mit sich bringen. Folgendes war &#8230; <a href="http://www.renemt.de/2007/02/16/aspnet-iis-6-und-die-verschwundenen-sessions/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://www.flickr.com/photos/knowprose/101872870/" target="_blank"><img src="http://farm1.static.flickr.com/41/101872870_2fe9a936a9.jpg?v=0" alt="Debugging"/></a><br /><small>Original uploaded to flickr by <a href="http://www.flickr.com/photos/knowprose/" target="_blank">TaranRampersad</a></small></p>
<p>Bei der Entwicklung unseres <a href="http://www.asp.net" target="_blank">ASP.NET</a> / <a href="http://ajax.asp.net" target="_blank">AJAX</a> basierenden Projektmanagement-Problems stießen wir gestern auf eines dieser lustigen Probleme, die an sich eine simple Ursache haben, aber erst einmal stundenlanges Nachforschen mit sich bringen. Folgendes war passiert:</p>
<p>Abgesehen vom <a href="http://www.microsoft.com/germany/msdn/library/net/aspnet/CassiniWebServerALaNET.mspx?mfr=true" target="_blank">internen Entwicklungs-Webserver des Visual Studio 2005</a> nutzen wir zum Test der Entwicklung auch einen <a href="http://www.microsoft.com/windowsserver2003/iis/default.mspx" target="_blank">IIS&nbsp;5</a> auf unserem lokalen Development-Server. Bevor der aktuelle Entwicklungsstand auf die Produktivmaschine deployed wird erfolgt hier noch einmal ein halbwegs gründlicher Vorab-Test &#8211; und gegebenenfalls kann man so auch relativ simpel &quot;IIS-spezifische&quot; Probleme debuggen. Alles funktionierte prima. Auf der Produktiv-Maschine traten jedoch plötzlich und nicht wirklich reproduzierbar seltsame Fehler im Verhalten der Web-Oberfläche auf. Nach einigem Herumgerate instrumentalisierte ich die <a href="http://www.microsoft.com/germany/msdn/library/net/aspnet/SinnvolleVerwendungDerGlobalasax.mspx?mfr=true" target="_blank">Global.asax</a> mit ins Eventlog schreibendem Diagnostik-Code. Mit dessen Hilfe wurde recht schnell deutlich, was hier schief lief:</p>
<p><span id="more-583"></span></p>
<p>Anscheinend wurden ständig neue Sessions und auch neue Applications gestartet, wenn der Benutzer mit der Anwendung interagierte. Mitunter landeten Aktionen zwar auch in der richtigen Session (und alles funktionierte wie gewünscht), oftmals aber auch nicht. Der Status der Anwendung ging somit natürlich komplett flöten.</p>
<p>Nach einigem Herumprobieren, Überlegen und Recherchieren war dann die Wurzel des Übels gefunden: Auf der Produktiv-Maschine läuft die Anwendung in einem <a href="http://www.microsoft.com/windowsserver2003/iis/default.mspx" target="_blank">IIS&nbsp;6</a>. Dieser bietet eine Menge <a href="http://www.microsoft.com/windowsserver2003/evaluation/overview/technologies/iis.mspx" target="_blank">toller, neuer Features</a> wie z.B. mehere Worker-Prozesse und deren automatisiertes Recycling, mehrere unabhängige Application Pools sowie hübsche Web Gardens. Der Haken daran: Komplexe ASP.NET-Anwendungen laufen aufgrund des ASP-eigenen Session-Managements eigentlich nur dann stabil, wenn man auf alle diese Neuerungen verzichtet. Das Hauptproblem ist dabei das <em><a href="http://msdn2.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemode(VS.80).aspx" target="_blank">InProc &#8211; Session State Management</a></em>, mit welchem ASP.NET-Anwendungen per Default laufen. Stellt man dieses auf den ASP.NET <a href="http://msdn2.microsoft.com/en-us/library/ms178586(VS.80).aspx" target="_blank">State Server</a> um, welcher als separater Dienst außerhalb des IIS läuft, wird die Sache schon wesentlich besser. Allerdings hatten wir immer noch Probleme, wenn wir mehr als einen Worker-Prozess zu ließen, da bei PostBacks gelegentlich noch neue Applications gestartet wurden. Nachdem nur noch ein einziger davon zugelassen war lief die Anwendung aber sauber und stabil.</p>
<p><strong>Update:</strong> Ein paar weiterführende Informationen zum Thema Session State Management im IIS 6 habe ich <a href="http://www.renemt.de/2007/02/16/iis-60-session-state-management/">hier</a> zusammen gefasst.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/02/16/aspnet-iis-6-und-die-verschwundenen-sessions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bye-bye Microsoft?</title>
		<link>http://www.renemt.de/2007/02/03/bye-bye-microsoft/</link>
		<comments>http://www.renemt.de/2007/02/03/bye-bye-microsoft/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 20:50:44 +0000</pubDate>
		<dc:creator>ReneMT</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.renemt.de/2007/02/03/bye-bye-microsoft/</guid>
		<description><![CDATA[Original uploaded to flickr by Daniel Petry Als ich heute beim Flori war, um unser Moped-Renovierungs-Projekt voran zu treiben hatte ich eine interessante Unterhaltung mit Stephan, dem CEO von Mindquarry. Stephan ist, könnte man sagen, ein waschechter Web 2.0-ler, mit &#8230; <a href="http://www.renemt.de/2007/02/03/bye-bye-microsoft/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://www.flickr.com/photos/fokss/310729988/" target="_blank"><img alt="MacBook" src="http://farm1.static.flickr.com/103/310729988_c0cc88a000.jpg?v=0" width="400" /></a><br /><small>Original uploaded to flickr by <a href="http://www.flickr.com/photos/fokss/" target="_blank">Daniel Petry</a></small></p>
<p>Als ich heute beim Flori war, um unser <a href="http://www.flickr.com/photos/stephansplace/378434211/" target="_blank">Moped-Renovierungs-Projekt</a> voran zu treiben hatte ich eine interessante Unterhaltung mit <a href="http://iqupi.wordpress.com/" target="_blank">Stephan</a>, dem CEO von <a href="http://www.mindquarry.de" target="_blank">Mindquarry</a>. Stephan ist, könnte man sagen, ein waschechter <em>Web 2.0-ler</em>, mit all den Auswirkungen wie neu entdeckte Liebe zum Mac, Überzeugung bezüglich Open Source und freien Betriebssystemen usw. Stephan machte Aussagen, die mich aufhorchen ließen:</p>
<blockquote><p>So gut wie jedes innovative Unternehmen im Software-Bereich arbeitet heute doch mit Open-Source-Software und Macs. Windows ist hier doch kaum noch gefragt &#8211; und in großen Unternehmen gehört Linux auf dem Desktop doch schon zum Alltag. Und wenn ich Software entwickeln will, die auch in Windows-Umgebungen läuft, greife ich zu J2EE.</p>
<p align="right">(Gedankenzitat &#8211; müsste aber in etwa seine Worte treffen <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  )</p>
</blockquote>
<p>Das machte mich neugierig. Open Source? Mac? J2EE? Alles keine Fremdwörter für mich, trotzdem ich eigentlich im .NET/Windows-Umfeld zu Hause bin. Aber ich bin schließlich noch halbwegs jung und lass mich von guten Argumenten auch gern zum Umdenken bewegen. Nichts desto Trotz habe ich ein wenig recherchiert um zu versuchen, mir selbst einen Blick vom Stand der Dinge im Software-Bereich zu machen.</p>
<p><span id="more-576"></span></p>
<p>Zunächst: Aktuelle Statistiken sind relativ schwer zu finden (wer anderer Meinung ist darf mir gern Quellen zukommen lassen). Allerdings habe ich doch einiges ab dem Jahr 2006 gefunden. Hier nun also die Fakten:</p>
<p>Laut eines aktuellen Reports von <a href="http://www.netapplications.com" target="_blank">netapplications</a> sah die Verteilung der Betriebssysteme im Januar 2006 aus wie folgt:</p>
<p align="center"><img id="image577" src="http://www.renemt.de/wp-content/uploads/2007/02/os_marketshare_jan07Vorschaubild.png" alt="Marktanteil Betriebssysteme Januar 2007" /><br /><small>Quelle: <a href="http://marketshare.hitslink.com/report.aspx?qprid=2#" target="_blank">MarketShare by net applications</a></small></p>
<p>Die wesentlichen Fakten hieraus:</p>
<ul>
<li>Windows XP: 85.02%</li>
<li>Windows 2000: 4.93%</li>
<li>Mac OS: 4.34%</li>
<li>MacIntel: 1.88%</li>
<li>Linux: 0.35%</li>
</ul>
<ul></ul>
<p>Für manchen traurig aber wahr: Windows dominiert immer noch mehr als deutlich den Markt der Betriebssysteme. Woraus weiterhin folgt, dass die Windows-Plattform auch das attraktivste Umfeld für Software-Projekte ist und bleibt. Was meine persönlichen Beobachtungen, welche ich in letzter Zeit in mehreren mittelständischen und auch großen, international agierenden Unternehmen gemacht habe, bestätigt: Hier kommt immer noch Microsoft auf den Tisch &#8211; und gut ist. Ähnlich sieht es auch bei der Entwicklung der Marktanteile aus:</p>
<p align="center"><img id="image578" src="http://www.renemt.de/wp-content/uploads/2007/02/os_marketshare_trend_jan07Vorschaubild.png" alt="Trend Marktanteil Betriebssysteme" /><br /><small>Quelle: <a href="http://marketshare.hitslink.com/report.aspx?qprid=5" target="_blank">MarketShare by net applications</a></small></p>
<p>Trotzdem der Marktanteil von MacOS und Intel Macs marginal gestiegen ist bleibt Windows XP deutlich über 80%. Sollte die Aufholjagd von Apple in dem Tempo weiter gehen werden sich Windows und MacOS den Markt in ca. 40 Jahren wohl teilen <img src='http://www.renemt.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Und Linux? So, wie es aussieht, hat es nach wie vor etwas von einem Genie, dass zwar seiner Zeit weit voraus ist und einen guten Leumund hat, aber trotzdem sein Nischendasein fristet, von der Welt bestaunt, aber nicht wirklich angenommen. In den oben genannten Studien liegt die Linux-Verbreitung noch deutlich hinter MacOS. Auch Initiativen wie &quot;Linux für die öffentliche Verwaltung&quot; scheinen daran nicht viel zu ändern. Bei <a href="http://www.osnews.com" target="_blank">OSNews.com</a> schreibt <a href="http://www.osnews.com/story.php/10984/Linux-Market-Share-and-the-Desktop/">Richard Schwalb</a>:</p>
<blockquote><p>But, in order for Linux to actually reach that 10% point (remember, the Mac right now is only somewhere around 3 &#8211; 5%) usability absolutely needs to be on par and/or better (mostly better) than Windows. Forget about the Mac. Apple is ease of use. The best anyone else can hope for is to be firmly in the shadow of Apple. Now, what do I mean by usability? Well, the ability to fix things, everything, through a GUI environment. The command line is for geeks like myself and old schoolers (although, I do prefer a good GUI). The ability to switch from Gnome to KDE to Fluxbox to AfterStep to WindowMaker (you get my point) and have the identical desktop icon layout. The ability to plug in any hardware and have it just work (well, at least at the level of Windows). Inconsistencies fixed (hmm, no one is immune from that one). Windows compatibility on par with OS X. Many of these issues have been greatly resolved in just a couple of years. Many of these issues are still only perception, the fix already exists, the ease of use is already there. Some of these issues still need work. I leave it to the marketplace to decide what&#8217;s what.</p></blockquote>
<p>In meinen Augen eine durchaus realistische Einschätzung der Lage. Das Hauptumfeld, in dem ich bisher mit Linux in Kontakt gekommen bin, sind Universitäten und Webserver. Die Gründe dafür hat Richard Schwalb ausreichend dargelegt, denke ich.</p>
<p>Etwas anders sieht es beim Einsatz von Open-Source-Software aus: Wie <a href="http://www.pro-linux.de/news/2006/10311.html" target="_blank">pro-linux</a> mit Berufung auf das <a href="http://www.diw.de/" target="_blank">Deutsche Institut für Wirtschaftsforschung, Berlin</a> berichtet ist hier ein deutlicher Bedeutungszuwachs zu bemerken. Gründe dafür in der Regel hohe Anforderungen an firmeninterne und -externe Systeminteroperabilität, höhere Stabilität und Sicherheit (wobei dieser Punkt bei aktuellen Windows-Serversystemen z.B. auch nicht mehr so richtig fruchten will wie man z.B. <a href="http://www.microsoft.com/germany/diefakten/topics/reliability.mspx" target="_blank">hier</a><a> oder </a><a href="http://www.microsoft.com/germany/diefakten/topics/tco.mspx" target="_blank">hier</a> lesen kann) sowie teilweise reduzierte Kostenbelastungen. Dieser Trend ist natürlich besonders auffällig im Web 2.0 &#8211; Bereich: Kostenlose CMS und Blog-Engines, Social-irgendwas-Plattformen, Gadgets, Statistik-Tool etc. sind in Hülle und Fülle vorhanden und werden auch genutzt. Im kommerziellen Bereich fristet aber auch Open Source &#8211; zumindest innerhalb der EU &#8211; eher noch ein Lückendasein: durchschnittlich 9% der befragten Unternehmen nutzen OS-Betriebssysteme, 7% OS-Datenbanken. In Deutschland sind es im Schnitt ein paar Prozent mehr, in Polen und Tschechien bemerkenswerter Weise sogar 23 bzw. 20%. Insgesamt also zwar ein durchaus beachtlicher Markt, sofern man mit entsprechenden Geschäftsmodellen aufwarten kann (Stichwort: <a href="http://en.wikipedia.org/wiki/Software_as_a_Service" target="_blank">SaaS &#8211; Software as a Service</a>), aber noch lange kein Grund, Microsoft sofort in die Tonne zu treten.</p>
<p>Bleibt als letzter Punkt noch: J2EE oder .NET? Oder beides? Das <em>Word-Of-Mouth</em> sagt ja gemeinhin: J2EE ist <strong>der</strong> Standard. Was auch nicht ganz falsch ist: Eine <a href="http://www.theregister.co.uk/2003/09/10/j2ee_bigger_than_net/" target="_blank">Umfrage von QNB Intelligence aus dem Jahr 2003</a> unter 415 IT-Entscheidern ergab: 75% von ihnen setzen für die Entwicklung ihrer Software-Infrastruktur auf J2EE. 52% allerdings auch auf .NET. Weiterhin ergab die Umfrage:</p>
<blockquote><p>Many organisations (41 per cent) saw dual-platform as the route forward. Those with a single-platform strategy tend to plumb for J2EE (31 per cent), compared to .NET, (23 per cent).</p></blockquote>
<p>Insgesamt scheint sich dieser Trend auch aktuell fortzusetzen: J2EE ist vor .NET der Marktführer für komponentenbasierende, (teilweise) plattformunabhängige Softwaresysteme.</p>
</p>
<p>Und der Tenor des ganzen: Nein, wir müssen unseren Focus nicht gleich morgen von .NET und der Windows-Welt wegbewegen, um uns am Markt behaupten zu können. Nein, nicht jeder zweite ist heute schon Apple-Jünger oder Linux-Crack. Ja, Open-Source-Software setzt sich aus gutem Grund vermehrt am Markt durch &#8211; was aber letztendlich nicht unbedingt etwas mit der ewigen Diskussion &quot;Windows oder nicht&quot; zu tun hat. Und ja, .NET ist inzwischen auch in der Business-IT angekommen, was nicht zu letzt die stark erhöhte Nachfrage nach .NET-Entwicklern in allen Job- und Projektbörsen belegt.</p>
<p>PS: Falls mir übrigens auch mal jemand ein MacBook zum Testen zur Verfügung stellen will &#8211; ich sag nicht nein <img src='http://www.renemt.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.renemt.de/2007/02/03/bye-bye-microsoft/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

