<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Michaels Weblog</title>
	<atom:link href="http://sentinel101.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sentinel101.wordpress.com</link>
	<description>über Software-Entwicklung und andere Sportarten</description>
	<lastBuildDate>Sun, 08 May 2011 06:20:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='sentinel101.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Michaels Weblog</title>
		<link>http://sentinel101.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://sentinel101.wordpress.com/osd.xml" title="Michaels Weblog" />
	<atom:link rel='hub' href='http://sentinel101.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Unf&#246;rmige 14km</title>
		<link>http://sentinel101.wordpress.com/2011/02/06/unfrmige-14km/</link>
		<comments>http://sentinel101.wordpress.com/2011/02/06/unfrmige-14km/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 16:52:33 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2011/02/06/unfrmige-14km/</guid>
		<description><![CDATA[… will heissen, die Laufform lässt noch zu wünschen übrig. Aller (Jahres)-Anfang ist schwer.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=592&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>… will heissen, die Laufform lässt noch zu wünschen übrig. Aller (Jahres)-Anfang ist schwer.</p>
<p><a href="http://sentinel101.files.wordpress.com/2011/02/image.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://sentinel101.files.wordpress.com/2011/02/image_thumb.png?w=244&#038;h=81" width="244" height="81" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/592/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=592&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2011/02/06/unfrmige-14km/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>

		<media:content url="http://sentinel101.files.wordpress.com/2011/02/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>S21-Lauf am 2.1.</title>
		<link>http://sentinel101.wordpress.com/2011/01/03/s21-lauf-am-2-1/</link>
		<comments>http://sentinel101.wordpress.com/2011/01/03/s21-lauf-am-2-1/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 06:32:39 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2011/01/03/s21-lauf-am-2-1/</guid>
		<description><![CDATA[… von Ditzingen nach S-Hauptbahnhof. Das Zeltdorf der Gegner verschandelt weiterhin den verschneiten Schlosspark und die noch stehenden Bäume (ich frage mich ernsthaft, was an Bäume angekettete Stofftiere ausdrücken sollen). Auffällig war, dass mir nicht wenige Menschen mit K21-Buttons entgegenkamen; vermutlich wird es heute wieder zum Demo-Regeltermin am Hauptbahnhof kommen, alte Gewohnheiten lassen sich auch [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=589&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>… von Ditzingen nach S-Hauptbahnhof. Das Zeltdorf der Gegner verschandelt weiterhin den verschneiten Schlosspark und die noch stehenden Bäume (ich frage mich ernsthaft, was an Bäume angekettete Stofftiere ausdrücken sollen). Auffällig war, dass mir nicht wenige Menschen mit K21-Buttons entgegenkamen; vermutlich wird es heute wieder zum Demo-Regeltermin am Hauptbahnhof kommen, alte Gewohnheiten lassen sich auch im neuen Jahr nur schwer ablegen.</p>
<p><a href="http://sentinel101.files.wordpress.com/2011/01/image.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;float:left;border-top:0;border-right:0;padding-top:0;margin:0 10px 0 0;" title="image" border="0" alt="image" align="left" src="http://sentinel101.files.wordpress.com/2011/01/image_thumb.png?w=286&#038;h=145" width="286" height="145" /></a></p>
<p>Distanz: 16,03 km   <br />Tempo: 5:21 min/km    </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/589/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=589&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2011/01/03/s21-lauf-am-2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>

		<media:content url="http://sentinel101.files.wordpress.com/2011/01/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Jahresabschlu&#223; Running</title>
		<link>http://sentinel101.wordpress.com/2010/12/31/jahresabschlu-running/</link>
		<comments>http://sentinel101.wordpress.com/2010/12/31/jahresabschlu-running/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 17:12:55 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/12/31/jahresabschlu-running/</guid>
		<description><![CDATA[Heute bin ich nochmal einen 12er gelaufen (bzw gestapft, gerutscht, …), sodass ich jetzt einen versöhnlichen Jahresabschluß machen kann. Gesamtdistanz in 2010: 1002km … weniger als 2009 (1085km), ich schiebe es einfach mal auf die verletzungsbedingte Pause im November und Dezember. Also bis Neapel hätte es dieses Mal nicht gereicht. Durschnittliches Tempo in 2010: 5:28min/km [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=586&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich nochmal einen 12er gelaufen (bzw gestapft, gerutscht, …), sodass ich jetzt einen versöhnlichen Jahresabschluß machen kann.</p>
<p><strong>Gesamtdistanz in 2010: 1002km     <br /></strong>… weniger als 2009 (1085km), ich schiebe es einfach mal auf die verletzungsbedingte Pause im November und Dezember. Also bis Neapel hätte es dieses Mal nicht gereicht.</p>
<p><strong>Durschnittliches Tempo in 2010: 5:28min/km</strong>    <br />… damit eine halbe Minute schneller als 2009, aber immer noch ausbaufähig.</p>
<p><strong>Verbrauchte Kalorien: 97142</strong>    <br />… oder ca. 184 Tafeln Milka-Schokolade</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/586/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/586/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/586/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=586&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/12/31/jahresabschlu-running/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>
	</item>
		<item>
		<title>Extend NHibernate-LINQ for Regex-Matching</title>
		<link>http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/</link>
		<comments>http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 18:51:08 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/</guid>
		<description><![CDATA[The time between Christmas and New Year’s Eve traditionally is a great time to take a look at .NET-Stuff which is (yet) not part of my daily work. This time I wanted to dig a little deeper into the newest NHibernate version 3.0. I was especially interested in its LINQ-Implementation which was rewritten from scratch [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=585&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The time between Christmas and New Year’s Eve traditionally is a great time to take a look at .NET-Stuff which is (yet) not part of my daily work. This time I wanted to dig a little deeper into the newest NHibernate version 3.0. I was especially interested in its LINQ-Implementation which was rewritten from scratch for the 3.0-GA release.</p>
<p>Today I tried to extend NH-LINQ with Regex-Matching. What first sounds quite demanding is really easy as NH has many extension points, including the LINQ-Provider.</p>
<h5>Add RegexMatch-Function to SQL-Server</h5>
<p>SQL-Server doesn’t have Regex-Support out-of-the-box, you need to implement it in .NET as a User-Defined-Function (UDF) and then deploy the assembly to SQL-Server. Here is the very basic implementation which is not optimized for performance in any way (there are some <a href="http://blogs.msdn.com/b/sqlclr/archive/2005/06/29/regex.aspx" target="_blank">ways</a> to precompile regular expressions):</p>
<p><font face="Courier New">public class UserDefinedFunctions     <br />{      <br />&#160; [SqlFunction(IsDeterministic = true, IsPrecise = true)]      <br />&#160; public static bool RegexMatch(SqlString input, SqlString pattern)      <br />&#160; {      <br />&#160;&#160;&#160; return Regex.IsMatch(input.ToString(), pattern.ToString());      <br />&#160; }      <br />};</font></p>
<p>To deploy that function the fastest way is to create a “Visual C# SQL CLR Database Project” which contains the deployment step. I won’t describe it here in details, there are a lot of resources on the net for this topic. Just two remarks: 1) the project must target .NET 3.5 and 2) the CLR-Support in SQL-Server must be activated via </p>
<p><font face="Courier New">sp_configure &#8216;clr enabled&#8217;, 1     <br />reconfigure</font></p>
<h5>Implement the Extension-Method</h5>
<p>I now add an Extension-Method called “RegexMatch” to the string-Class which has the same implementation as the UDF.</p>
<p><font face="Courier New">static class RegexExtensions     <br />{      <br />&#160; public static bool RegexMatch(this string s, string pattern)      <br />&#160; {      <br />&#160;&#160;&#160; return Regex.IsMatch(s, pattern);      <br />&#160; }      <br />}</font></p>
<p>Now <font face="Courier New">“Mike”.RegexMatch(“Mi.e”)</font> evaluates to true while <font face="Courier New">“Mike”.RegexMatch(“Mo.e”)</font> returns false.</p>
<h5>Write HQL-Generator for RegexMatch-Method</h5>
<p>I have a small NHibernate-Project with one mapped class called “MyUser”:</p>
<p><font face="Courier New">class MyUser     <br />{      <br />&#160; public virtual int Id { get; set; }      <br />&#160; public virtual string Name { get; set; }      <br />}</font></p>
<p>Not very exciting and I think you can guess how the table looks like. Now I want to do this:</p>
<p><font face="Courier New">session.Query&lt;MyUser&gt;()     <br />&#160;&#160; </font><font face="Courier New">.Where(u =&gt; u.Name.RegexMatch(&quot;Mi.e&quot;))     <br />&#160;&#160; .ToList();</font></p>
<p>Certainly this compiles because of the available Extension-Method but when I execute it I get the following error from NHibernate:</p>
<p>Unhandled Exception: System.NotSupportedException: Boolean RegexMatch(System.String, System.String)</p>
<p>NHibernate doesn’t know what to do with the RegexMatch-Call. We have to tell NHibernate how to translate the LINQ-Expression to a HQL-Expression for the actual UDF-Call.</p>
<p>First we must implement a new so-called HqlGenerator:</p>
<p><font face="Courier New">public class RegexMatchGenerator : BaseHqlGeneratorForMethod     <br />{      <br />&#160; public RegexMatchGenerator()      <br />&#160; {      <br />&#160;&#160;&#160; var methodDefinition =       <br />&#160;&#160;&#160;&#160;&#160;&#160; ReflectionHelper.GetMethodDefinition(() =&gt;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; RegexExtensions.RegexMatch(null, null));      </p>
<p>&#160;&#160;&#160; SupportedMethods = new[] { methodDefinition };      <br />&#160; }</font></p>
<p><font face="Courier New">&#160; public override HqlTreeNode BuildHql(     <br />&#160;&#160;&#160; MethodInfo method,      <br />&#160;&#160;&#160; Expression targetObject,      <br />&#160;&#160;&#160; ReadOnlyCollection&lt;Expression&gt; arguments,      <br />&#160;&#160;&#160; HqlTreeBuilder treeBuilder,      <br />&#160;&#160;&#160; IHqlExpressionVisitor visitor      <br />&#160; )      <br />&#160; {      <br />&#160;&#160;&#160; return treeBuilder.Equality(      <br />&#160;&#160;&#160;&#160;&#160; treeBuilder.MethodCall(&quot;dbo.RegexMatch&quot;, new[]      <br />&#160;&#160;&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; visitor.Visit(arguments[0]).AsExpression(),      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; visitor.Visit(arguments[1]).AsExpression()      <br />&#160;&#160;&#160;&#160;&#160; }),      <br />&#160;&#160;&#160;&#160;&#160; treeBuilder.Constant(1)      <br />&#160;&#160;&#160; );      <br />&#160; }      <br />}</font></p>
<p>In the constructor our RegexMatch-Method is registered by using this very cool ReflectionHelper-Class (I must add this to my toolbelt).</p>
<p>In the BuildHql-Method now the magic happens. This code basically is the programmatic representation of “dbo.RegexMatch(@p1, @p2) = 1”. The comparison against 1 is necessary as SQL-Server doesn&#8217;t seem to handle RegexMatch as a valid boolean function.</p>
<h5>Add HQL-Generator to NHibernate-Configuration</h5>
<p>OK, the heavy part is implemented, now we need to register the new HQL-Generator somewhere. That’s easy too. All default HQL-Generators are registered in the class DefaultLinqToHqlGeneratorsRegistry. We must only extend this and add our own HQL-Generator to it:</p>
<p><font face="Courier New">public class MyLinqToHqlGeneratorsRegistry :     <br />&#160; DefaultLinqToHqlGeneratorsRegistry      <br />{      <br />&#160; public MyLinqToHqlGeneratorsRegistry()      <br />&#160; {      <br />&#160;&#160;&#160; this.Merge(new RegexMatchGenerator());      <br />&#160; }      <br />}</font></p>
<p>Last but not least we must set our class as the new HQL-Generator-Registry in the NHibernate-Configuration:</p>
<p><font face="Courier New">cfg.LinqToHqlGeneratorsRegistry&lt;MyLinqToHqlGeneratorsRegistry&gt;();</font></p>
<p>Now when I run the code once more</p>
<p><font face="Courier New">session.Query&lt;MyUser&gt;()     <br />&#160;&#160; </font><font face="Courier New">.Where(u =&gt; u.Name.RegexMatch(&quot;Mi.e&quot;))     <br />&#160;&#160; .ToList();</font></p>
<p>I see this SQL-Query executed:</p>
<p><font face="Courier New">select myuser0_.Id as Id0_, myuser0_.Name as Name0_      <br />from MyUser myuser0_       <br />where dbo.RegexMatch(myuser0_.Name, @p0)=1;@p0 = &#8216;Mi.e&#8217;</font></p>
<p>It works !</p>
<h5>Summary</h5>
<p>The masterminds behind NHibernate seem to have invested a lot of effort to make it as extensible as possible. Great work, guys !</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/585/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=585&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>
	</item>
		<item>
		<title>LINQ: Versuche mit Expression Trees</title>
		<link>http://sentinel101.wordpress.com/2010/12/24/linq-versuche-mit-expression-trees/</link>
		<comments>http://sentinel101.wordpress.com/2010/12/24/linq-versuche-mit-expression-trees/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 15:31:27 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/12/24/linq-versuche-mit-expression-trees/</guid>
		<description><![CDATA[LINQ (Language Integrated Query) ist eine coole Sache, keine Frage. Das Filtern von Collections wird zum Kinderspiel, Umformungen lassen sich wunderbar einfach ausdrücken und zusammen mit den LINQ-Providern für SQL-Datenbanken oder OR-Mappern wie NHibernate kann man für den Datenbank-Zugriff auf SQL weitestgehend verzichten. Wenn man hinter die Kulissen von LINQ schaut, entdeckt man schnell Komponenten, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=584&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>LINQ (Language Integrated Query) ist eine coole Sache, keine Frage. Das Filtern von Collections wird zum Kinderspiel, Umformungen lassen sich wunderbar einfach ausdrücken und zusammen mit den LINQ-Providern für SQL-Datenbanken oder OR-Mappern wie NHibernate kann man für den Datenbank-Zugriff auf SQL weitestgehend verzichten.</p>
<p>Wenn man hinter die Kulissen von LINQ schaut, entdeckt man schnell Komponenten, mit denen aber noch deutlich fortgeschrittenere Szenarien möglich sind. Zum Beispiel rückt die Implementierung einer eigenen Abfragesprache (z. B. für DSLs) in greifbare Nähe.</p>
<h4></h4>
<h5>Ganz von vorne …</h5>
<p>Ich fang mal bei Null an. Nehmen wir an, wir haben folgendes Array mit Namen:</p>
<p><font face="Courier New">var names = new[] {      <br />&#160; &quot;Axel&quot;, &quot;Bernd&quot;, &quot;Claus&quot;,       <br />&#160; &quot;Dieter&quot;, &quot;Erich&quot;, &quot;Fritz&quot;       <br />};</font></p>
<p>Jetzt möchte ich rausfinden, welcher Name die Buchstaben “e” und “r” enthält:</p>
<p><font face="Courier New">var somenames = names.Where(n =&gt; n.Contains(&quot;e&quot;) &amp;&amp; n.Contains(&quot;r&quot;));</font></p>
<p>Der mit großem “E” geschriebene Erich fällt durch, daher bleiben Bernd und Dieter übrig. Für die weitere Untersuchung ziehe ich den Lambda-Ausdruck jetzt raus:</p>
<p><font face="Courier New">Func&lt;string, bool&gt; p = n =&gt; n.Contains(&quot;e&quot;) &amp;&amp; n.Contains(&quot;r&quot;);     <br />var somenames = names.Where(p);</font></p>
<p>Was auffällt: der Variable p muss explizit der Typ “Func&lt;string, bool&gt;” zugewiesen werden, ein “var p = …” funktioniert nicht. Das hat seinen Grund, ich komm später darauf zurück. Wenn ich die Variable p auf der Konsole ausgebe, kommt folgendes heraus:</p>
<p><font face="Courier New">System.Func`2[System.String,System.Boolean]</font></p>
<p>Also in der Tat ein Delegate vom Typ Func&lt;string, bool&gt;. </p>
<h5>Aus Delegate wird Expression</h5>
<p>Jetzt ändere ich den Variablentyp ab in</p>
<p><font face="Courier New">Expression&lt;Func&lt;string, bool&gt;&gt; p =      <br />&#160; n =&gt; n.Contains(&quot;e&quot;) &amp;&amp; n.Contains(&quot;r&quot;);</font></p>
<p>Der Compiler meckert nicht, das ist eine legale Zuweisung. Was hier passiert: der Compiler merkt anhand des Variablentyps, dass der Lambda-Ausdruck nicht in ein Delegate umgewandelt wird, sondern statt dessen ein sog. Expression-Tree erzeugt wird. Aus diesem Grund muss der Variablen-Typ auch explizit angegeben werden, da der Compiler wissen muss, welche Umwandlung er machen soll.</p>
<p>Schauen wir uns den Expression-Tree mit Console.WriteLine an:</p>
<p><font face="Courier New">n =&gt; (n.Contains(&quot;e&quot;) AndAlso n.Contains(&quot;r&quot;))</font></p>
<p>Es sieht fast genauso aus wie unser Lambda-Ausdruck, allerdings statt des &amp;&amp; ein etwas gequältes “AndAlso” (“And” gibt es auch, dass drückt aber ein bitweises UND aus). </p>
<h5>Aus IEnumerable wird IQueryable</h5>
<p>Leider kommt es jetzt in der Where-Condition zu einem Fehler. Die Where-Bedingung für IEnumerable erwartet einen Delegate und keinen Expression-Tree. Um den Expression-Tree verwenden zu können, muss IEnumerable in IQueryable umgewandelt werden:</p>
<p><font face="Courier New">var somenames = names.AsQueryable().Where(p);</font></p>
<p>IQueryable ist das Interface, dass sog. <em>LINQ-Provider</em> implementieren müssen, die eigene Abfragesprachen besitzen. Z. B. produziert LINQ to SQL aus einem Expression-Tree eine SQL-Abfrage.</p>
<h5>Expression-Tree im Eigenbau</h5>
<p>Das Programm funktioniert wieder mit demselben Ergebnis. Aber was bringt mir das jetzt ?</p>
<p>Das Schöne an Expression-Trees ist, dass man sie nicht nur aus Lambda-Ausdrücken erzeugen kann, sondern recht einfach selber zusammenbauen kann. Ich will folgendes versuchen: anstatt die Suchbedingungen hart zu kodieren, möchte ich eine eigene kleine Abfragesprache definieren, mit der ich mein Namens-Array abfragen kann. Die soll z. B. so aussehen:</p>
<p><font face="Courier New">e;r;!D</font></p>
<p>Damit sollen alle Namen ausgegeben werden, die ein “e” und ein “r” enthalten, aber kein “D”.</p>
<p>Zuerst definiere ich dazu eine Methode ParseQuery, die aus dem Query-String ein Expression-Tree in der für IQueryable benötigten Bauweise macht:</p>
<p><font face="Courier New">static Expression&lt;Func&lt;string, bool&gt;&gt; ParseQuery(string s)</font></p>
<p>Das Zusammenbauen der Expression besteht aus einer Schachtelung (daher auch Expression-Tree) von Sub-Expressions, die die notwendigen Bestandteile enthalten. Zuerst benötige ich eine Expression, die die Prüfvariable definiert, also den Teil, der von “aussen” in die Query mitgegeben wird und der dann auf die verschiedenen Bedingungen geprüft wird.</p>
<p><font face="Courier New">var paramEx = Expression.Parameter(typeof(string), &quot;p&quot;);</font></p>
<p>Die Klasse Expression bietet zahlreiche solcher Factory-Methoden für Expressions an, wir werden jetzt noch weitere verwenden. Jetzt nehmen wir den Query-String auseinander:</p>
<p><font face="Courier New">foreach (var part in s.Split(&#8216;;&#8217;))</font></p>
<p>Für jeden part müssen wir eine Expression erzeugen und alle entstandenen Expressions mit logischem UND verknüpfen.</p>
<p>Für die Parts ohne NOT-Operator genügt folgende Expressions:</p>
<p><font face="Courier New">partEx = Expression.Call(     <br />&#160; paramEx,      <br />&#160; typeof (string).GetMethod(&quot;Contains&quot;),      <br />&#160; Expression.Constant(part)      <br />);</font></p>
<p>Wie ist das zu verstehen ? Diese Expression entspricht einem Aufruf (“Call”) einer Methode, die einen booleschen Wert zurückliefert. Diese Methode ist die Methode “Contains” der Klasse string und wird auf unserer Prüfvariablen aufgerufen (paramEx). Als Parameter bekommt die Contains-Methode unseren Part als konstanten Ausdruck. Auf gut Deutsch entspricht diese Expression etwa folgender C#-Zeile:</p>
<p><font face="Courier New">paramEx.Contains(part)</font></p>
<p>Für die Unterstützung des !-Operators müssen wir einfach nur diese Expression wieder in eine Expression, der Not-Expression, verpacken.</p>
<p><font face="Courier New">partEx = Expression.Not(     <br />&#160; Expression.Call(      <br />&#160;&#160;&#160; paramEx,       <br />&#160;&#160;&#160; typeof (string).GetMethod(&quot;Contains&quot;),       <br />&#160;&#160;&#160; Expression.Constant(part.Substring(1))      <br />&#160; )      <br />);</font></p>
<p>Dabei müssen wir vom Part das erste Zeichen ! abschneiden. In der Schleife erzeugen wir jetzt nacheinander diese Expressions und verknüpfen sie mit logischem UND. Das ist sehr einfach:</p>
<p><font face="Courier New">andEx = Expression.AndAlso(leftEx, rightEx);</font></p>
<p>Die fertige Methode sieht so aus:</p>
<p><font face="Courier New">static Expression&lt;Func&lt;string, bool&gt;&gt; ParseQuery(string s)     <br />{      <br />&#160; var paramEx = Expression.Parameter(typeof (string), &quot;p&quot;);</font></p>
<p><font face="Courier New">&#160; Expression completeEx = null;</font></p>
<p><font face="Courier New">&#160; foreach (var part in s.Split(&#8216;;&#8217;))     <br />&#160; {      <br />&#160;&#160;&#160; Expression partEx;</font></p>
<p><font face="Courier New">&#160;&#160;&#160; if(part.StartsWith(&quot;!&quot;))     <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160; partEx = Expression.Not(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Expression.Call(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; paramEx,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; typeof (string).GetMethod(&quot;Contains&quot;),       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Expression.Constant(part.Substring(1))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; )      <br />&#160;&#160;&#160;&#160;&#160; );      <br />&#160;&#160;&#160; }      <br />&#160;&#160;&#160; else      <br />&#160;&#160;&#160; {      <br />&#160;&#160;&#160;&#160;&#160; partEx = Expression.Call(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; paramEx,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; typeof (string).GetMethod(&quot;Contains&quot;),      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Expression.Constant(part)      <br />&#160;&#160;&#160;&#160;&#160; );      <br />&#160;&#160;&#160; }</font></p>
<p><font face="Courier New">&#160;&#160;&#160; completeEx = completeEx == null      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ? </font><font face="Courier New">partEx      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; : Expression.AndAlso(completeEx, partEx);      <br />&#160; }</font><font face="Courier New">     <br />}</font></p>
<p>Halt, eins fehlt noch: das Return-Statement. Dazu muss die fertige boolesche Expression noch in eine Lambda-Expression verpackt werden:</p>
<p><font face="Courier New">return Expression.Lambda&lt;Func&lt;string, bool&gt;&gt;(completeEx, paramEx);</font></p>
<p>So, fertig. Mal schauen, was die Methode für verschiedene Query-Ausdrücke zurückliefert.</p>
<p><font face="Courier New">e;r: p =&gt; (p.Contains(&quot;e&quot;) AndAlso p.Contains(&quot;r&quot;))     <br />e;r;!D: p =&gt; ((p.Contains(&quot;e&quot;) AndAlso p.Contains(&quot;r&quot;)) AndAlso Not(p.Contains(&quot;D&quot;)))</font></p>
<p>Sieht gut aus, jetzt kann ich das Resultat als Where-Bedingung verwenden.</p>
<p><font face="Courier New">var somenames = names.AsQueryable().Where(ParseQuery(&quot;e;r;!D&quot;));     <br />=&gt; Bernd</font></p>
<p><font face="Courier New">var somenames = names.AsQueryable().Where(ParseQuery(&quot;!F;r;i&quot;));     <br />=&gt; Dieter, Erich</font></p>
<p>Das war’s. Wenn man das Prinzip verstanden hat, ist es eigentlich ganz einfach. Mit Expression-Trees bekommt der Entwickler ein mächtiges Werkzeug in die Hand, um die ganze Power der LINQ-Infrastruktur ausnutzen zu können.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/584/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/584/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/584/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=584&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/12/24/linq-versuche-mit-expression-trees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>
	</item>
		<item>
		<title>System Restore API in .NET</title>
		<link>http://sentinel101.wordpress.com/2010/12/21/system-restore-api-in-net/</link>
		<comments>http://sentinel101.wordpress.com/2010/12/21/system-restore-api-in-net/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 22:28:53 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/12/21/system-restore-api-in-net/</guid>
		<description><![CDATA[Ein selten genutztes Feature von Windows sind die Wiederherstellungspunkte (WHP, immerhin seit Windows 2000 verfügbar). Normalerweise braucht man sie nicht, im Ernstfall können sie aber sehr nützlich sein. Unter Ernstfall verstehe ich eine fehlerhafte Treiberinstallation, eine amoklaufende Applikation, kurzum alles, was das System destabilisieren kann. Ist das System in einem solchen Zustand, kann auf einen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=580&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ein selten genutztes Feature von Windows sind die Wiederherstellungspunkte (WHP, immerhin seit Windows 2000 verfügbar). Normalerweise braucht man sie nicht, im Ernstfall können sie aber sehr nützlich sein. Unter Ernstfall verstehe ich eine fehlerhafte Treiberinstallation, eine amoklaufende Applikation, kurzum alles, was das System destabilisieren kann. Ist das System in einem solchen Zustand, kann auf einen WHPs zurückgefahren werden und das System funktioniert wieder wie zu dem Zeitpunkt der Erzeugung des WHP.</p>
<p>Was weniger bekannt ist: man kann auch selbst WHPs erzeugen. Das geht zum einen per Mausklick, zum anderen gibt es aber auch das <a href="http://msdn.microsoft.com/en-us/library/aa378958%28VS.85%29.aspx" target="_blank">System Restore API</a>, dass sich von C++-Programmen nutzen lässt. Leider gibt es im .NET-Framework keine entsprechenden Wrapper-Klassen, daher habe ich ausgehend von einem <a href="http://www.codeproject.com/KB/cs/sysrestore.aspx" target="_blank">OpenSource-Projekt</a> einen eigenen gebastelt (<a href="http://dl.dropbox.com/u/7509048/SysRestoreTest_Public.zip" target="_blank">Download Source</a>).</p>
<p>Die Benutzung ist sehr einfach:</p>
<blockquote><p><span style="color:#0000ff;">using</span> (var sysChg = SystemChange.ForInstallation(<span style="color:#006080;">&quot;My Restore Point&quot;</span>))       <br />{       <br />&#160; Console.WriteLine(<span style="color:#006080;">&quot;Press &lt;RETURN&gt; when finished&quot;</span>);       <br />&#160; Console.ReadLine();       <br />&#160; sysChg.Finish();       <br />&#160; Console.WriteLine(<span style="color:#006080;">&quot;Restore-Point saved&quot;</span>);       <br />}       </p>
</blockquote>
<p>Dabei wird der WHP namens “My Restore Point” angelegt. Wenn die Installation (also die Systemveränderung, die u. U. rückgängig gemacht werden soll) fertig ist, wird der SystemChange mit Finish() abgeschlossen. Die SystemChange-Klasse kapselt für die einfachere Verwendung das eigentliche Low-Level-API SystemRestore. Wie am Screenshot zu sehen ist, wurde der WHP angelegt.</p>
<p><a href="http://sentinel101.files.wordpress.com/2010/12/image1.png"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="http://sentinel101.files.wordpress.com/2010/12/image_thumb1.png?w=451&#038;h=213" width="451" height="213" /></a></p>
<p>Um einen WHP herstellen zu können, muss man lokaler Administrator sein. Ansonsten bricht das Programm mit einer AccessDeniedException ab.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/580/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/580/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=580&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/12/21/system-restore-api-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>

		<media:content url="http://sentinel101.files.wordpress.com/2010/12/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Die Sehne h&#228;lt &#8230;</title>
		<link>http://sentinel101.wordpress.com/2010/12/19/die-sehne-hlt/</link>
		<comments>http://sentinel101.wordpress.com/2010/12/19/die-sehne-hlt/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 16:55:37 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/12/19/die-sehne-hlt/</guid>
		<description><![CDATA[… zumindest einen ersten Belastungstest über 10km (nach einem Monat Zwangspause). Teilweise war es wegen dem Tauwetter etwas rutschig, war aber kein Problem, da ich es hab langsam angehen lassen. Distanz: 10,26 km Tempo: 5:30 min/km Zeit: 56:23 &#160; &#160; Und zum Feste noch eine musikalische Empfehlung: Udos Weihnachtsalbum “Es werde Licht”. Eine Mischung aus [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=577&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>… zumindest einen ersten Belastungstest über 10km (nach einem Monat Zwangspause). Teilweise war es wegen dem Tauwetter etwas rutschig, war aber kein Problem, da ich es hab langsam angehen lassen.</p>
<p><a href="http://sentinel101.files.wordpress.com/2010/12/image.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;float:left;border-top:0;border-right:0;padding-top:0;margin:0 10px 0 0;" title="image" border="0" alt="image" align="left" src="http://sentinel101.files.wordpress.com/2010/12/image_thumb.png?w=244&#038;h=110" width="244" height="110" /></a></p>
<p>Distanz: 10,26 km   <br />Tempo: 5:30 min/km    <br />Zeit: 56:23</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Und zum Feste noch eine musikalische Empfehlung: Udos Weihnachtsalbum “Es werde Licht”. Eine Mischung aus Klassikern (Stille Nacht; Leise rieselt der Schnee), stimmungsvollen Eigenkompositionen (Eisblumen; Das Jahr deiner Träume) und Veralberungen (Merry Christmas Allerseits; Ach Papi, geh doch heuer nicht auf die Weihnachtsfeier).</p>
<h2 align="center"><a href="http://www.youtube.com/watch?v=3pfaTjWz7zA" target="_blank">Merry Christmas Allerseits !</a></h2>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/577/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=577&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/12/19/die-sehne-hlt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>

		<media:content url="http://sentinel101.files.wordpress.com/2010/12/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>10,72 km</title>
		<link>http://sentinel101.wordpress.com/2010/11/21/1072-km/</link>
		<comments>http://sentinel101.wordpress.com/2010/11/21/1072-km/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 13:42:42 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/11/21/1072-km/</guid>
		<description><![CDATA[… an den Bärenseen bei knapp 4°C (56 min). Ab 9km Schmerzen im linken Achilles, knapp vor 11 war daher Schluss.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=573&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>… an den Bärenseen bei knapp 4°C (56 min). Ab 9km Schmerzen im linken Achilles, knapp vor 11 war daher Schluss.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/573/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/573/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=573&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/11/21/1072-km/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>
	</item>
		<item>
		<title>L&#228;ufe</title>
		<link>http://sentinel101.wordpress.com/2010/11/06/lufe/</link>
		<comments>http://sentinel101.wordpress.com/2010/11/06/lufe/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 14:44:02 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/11/06/lufe/</guid>
		<description><![CDATA[31.10. … 13,98 km, 5:16 min/km 06.11. … 11,76 km, 4:57 min/km Und zwischendurch auch mal ein paar Kilometer für Stuttgart 21.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=572&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>31.10. … 13,98 km, 5:16 min/km   <br />06.11. … 11,76 km, 4:57 min/km</p>
<p>Und zwischendurch auch mal ein paar Kilometer für <a href="http://laufenfuerstuttgart.wordpress.com/">Stuttgart 21</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/572/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=572&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/11/06/lufe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>
	</item>
		<item>
		<title>Bottwartal-Halbmarathon</title>
		<link>http://sentinel101.wordpress.com/2010/10/18/bottwartal-halbmarathon/</link>
		<comments>http://sentinel101.wordpress.com/2010/10/18/bottwartal-halbmarathon/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 06:55:41 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Running]]></category>

		<guid isPermaLink="false">https://sentinel101.wordpress.com/2010/10/18/bottwartal-halbmarathon/</guid>
		<description><![CDATA[Endlich geschafft ! Beim HM im Bottwartal habe ich zum ersten Mal die 1:45h-Grenze geknackt. Knapp war es aber trotzdem: 1:44:29. Bis Kilometer 17 hatte ich sogar die 1:43 im Visier. Danach wurden die Rundenzeiten aber merklich schlechter, was an der leichten, aber trotzdem schmerzenden Steigung zurück nach Großbottwar lag. In Summe hat es aber [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=571&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Endlich geschafft ! Beim HM im Bottwartal habe ich zum ersten Mal die 1:45h-Grenze geknackt. Knapp war es aber trotzdem: <strong>1:44:29</strong>.</p>
<p>Bis Kilometer 17 hatte ich sogar die 1:43 im Visier. Danach wurden die Rundenzeiten aber merklich schlechter, was an der leichten, aber trotzdem schmerzenden Steigung zurück nach Großbottwar lag. In Summe hat es aber dann doch noch gereicht.</p>
<p><a href="http://sentinel101.files.wordpress.com/2010/10/image1.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;float:left;padding-top:0;border-width:0;margin:0 15px 0 0;" title="image" border="0" alt="image" align="left" src="http://sentinel101.files.wordpress.com/2010/10/image_thumb1.png?w=155&#038;h=189" width="155" height="189" /></a></p>
<p>Zeit: 1:44:29    <br />Tempo: 4:57 min/km     <br />Höhe: +59,5 / -42,0     <br />Platzierung: 27 AK / 154 Gesamt</p>
<p>Wie beim letzten Mal danke an die gute Organisation und die reichliche Verpflegung nach dem Rennen.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sentinel101.wordpress.com/571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sentinel101.wordpress.com/571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sentinel101.wordpress.com/571/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sentinel101.wordpress.com&amp;blog=1989872&amp;post=571&amp;subd=sentinel101&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sentinel101.wordpress.com/2010/10/18/bottwartal-halbmarathon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/abeccf89264f31af110448e9cb48fff6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sentinel101</media:title>
		</media:content>

		<media:content url="http://sentinel101.files.wordpress.com/2010/10/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>
