<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Jb in a nutshell</title>
    <link>http://evain.net/blog/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jbevain" /><feedburner:info uri="jbevain" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>IL fun fact: not is not !</title>
      <description>&lt;p&gt;Picture yourself working on crafting a specific piece of &lt;span class="caps"&gt;CIL&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;You need to write the compiled equivalent of:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
bool b = ...;
bool n = !b;
&lt;/pre&gt;

	&lt;p&gt;It would be tempting to write:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
ldloc b
not
stloc n
&lt;/pre&gt;

	&lt;p&gt;Except that it would not always work. &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.not.aspx"&gt;not&lt;/a&gt; doesn&amp;#8217;t negate booleans, it computes the bitwise complement of the value on the stack. It&amp;#8217;s also not to be confused with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.neg.aspx"&gt;neg&lt;/a&gt; opcode, which negates a value, as in a multiplication by -1.&lt;/p&gt;


	&lt;p&gt;The usual pattern to negate a boolean is:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
ldloc b
ldc.i4.0
ceq
stloc n
&lt;/pre&gt;

	&lt;p&gt;But that&amp;#8217;s not really fun, is it?&lt;/p&gt;


	&lt;p&gt;Actual fun fact: there&amp;#8217;s a misused “not” in the &lt;span class="caps"&gt;ECMA 335&lt;/span&gt; in the  example of the section 14.5 of the partition II.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/abV_Tgo9rCk" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 30 Jan 2012 16:00:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:dab1a8a5-faa6-449a-a783-93913a0ede94</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/abV_Tgo9rCk/il-fun-fact-not-is-not</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/1102</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2012/01/30/il-fun-fact-not-is-not</feedburner:origLink></item>
    <item>
      <title>Fun fact: C# methods whose bodies span over multiple source files</title>
      <description>&lt;p&gt;While working on &lt;a href="http://github.com/jbevain/cecil"&gt;Mono.Cecil&lt;/a&gt; (your lovely library to analyze and manipulate .net binaries that is used by &lt;a href="http://github.com/jbevain/cecil/wiki/Users"&gt;legions&lt;/a&gt;), one thing that struck me as odd for a while, was the fact that a method could have debug symbols for instructions that are defined in multiple files.&lt;/p&gt;


	&lt;p&gt;Cecil has this type, Instruction. When you&amp;#8217;re analyzing a module with &lt;a href="https://github.com/jbevain/cecil/wiki/Debug-symbols"&gt;debug information&lt;/a&gt; (think .pdb or .mdb files), an Instruction may have its SequencePoint property set. A sequence point is nothing but the location of the code in a file that relates to the instruction.&lt;/p&gt;


	&lt;p&gt;What got me wondering, is that the APIs to retrieve those sequence points make it so that a method can have sequence points in different documents. So be it, this is how I ended up representing it in Cecil, but it&amp;#8217;s only recently that I stumbled upon a case where indeed, a C# method had instructions defined in multiple files:&lt;/p&gt;


Foo.Bar.cs:
&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public partial class Foo {
    private List&amp;lt;Bar&amp;gt; _bars = new List&amp;lt;Bar&amp;gt;();
}
&lt;/pre&gt;

	&lt;p&gt;Foo.Baz.cs:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public partial class Foo {
    private Baz _baz;

    public Foo (Baz baz)
    {
        _baz = baz;
    }
}
&lt;/pre&gt;

	&lt;p&gt;Do you see what&amp;#8217;s going on here?&lt;/p&gt;


	&lt;p&gt;The constructor of Foo is defined in Foo.Baz.cs, but there&amp;#8217;s a field initializer in Foo.Bar.cs that is going to be compiled inside Foo&amp;#8217;s constructor. When you debug the constructor, you&amp;#8217;ll effectively end up jumping between the two files. Crazy right?&lt;/p&gt;


	&lt;p&gt;Can you think of another case where a C# (or VB.NET for that matters) method would have instructions defined in different files?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/jPGiaxRXsr4" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 19 Jan 2012 22:00:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:4104df95-9f4f-4b20-9125-0bf8d21cb7ec</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/jPGiaxRXsr4/fun-fact-c-methods-whose-bodies-span-over-multiple-source-files</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/817</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2012/01/19/fun-fact-c-methods-whose-bodies-span-over-multiple-source-files</feedburner:origLink></item>
    <item>
      <title>Constraining generic constraints</title>
      <description>&lt;p&gt;This is the last part of an update about &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt;, a tiny helper library to complement the System.Linq.Expressions namespace for .net 4 and Mono.&lt;/p&gt;

&lt;p&gt;And it's not really about Mono.Linq.Expressions itself. If you're interested about it though, you can read the part about &lt;a href="http://evain.net/blog/articles/2012/01/11/mono-linq-expressions-update"&gt;fluently creating expression trees&lt;/a&gt;, and the other one about &lt;a href="http://evain.net/blog/articles/2012/01/12/mono-linq-expressions-update-2"&gt;combining lambda expressions together&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Proper generic constraints&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Have a look at the signature of the factory method Expression.Lambda&lt;T&gt;:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public static Expression&amp;lt;TDelegate&amp;gt; Lambda&amp;lt;TDelegate&amp;gt; (
    Expression body,
    params ParameterExpression [] parameters) {}
&lt;/pre&gt;

&lt;p&gt;And at the signature of Expression&amp;lt;T&amp;gt;:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public sealed class Expression&amp;lt;T&amp;gt; : LambdaExpression {}
&lt;/pre&gt;

&lt;p&gt;Given the post title, and the &amp;lt;h3&amp;gt; a few lines up there, it's obvious where I'm going: those generic parameters have no constraint. A C# compiler will happily compile:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
class Potato {}

Expression&amp;lt;Potato&amp;gt; e = Expression.Lambda&amp;lt;Potato&amp;gt; (
    Expression.Constant (new Potato ()));
&lt;/pre&gt;

&lt;p&gt;Of course this won't get you far, but it sure is a heart breaker that because of a little language oddity, you delay to until runtime the problem resolution: this code will throw, Potato sure isn't a Delegate type, and Expression.Lambda, the only way to create an Expression&amp;lt;T&amp;gt; is making sure of that.&lt;/p&gt;

&lt;p&gt;So much for type safety, generics!&lt;/p&gt;

&lt;p&gt;Another famous issue is the following. Again, for the compiler, it's perfectly legit to write:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
int i;
if (!Enum.TryParse ("42", out i))
    Console.WriteLine ("This is so unfair!");
&lt;/pre&gt;

&lt;p&gt;And why is that? Because of the signature of Enum.TryParse:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public static bool TryParse&amp;lt;TEnum&amp;gt; (string value, out TEnum result) where TEnum : struct {}
&lt;/pre&gt;

&lt;p&gt;To sum the issue up, C# doesn't allow generic constraints on delegates and enums. And why am I rumbling about this? Because Mono.Linq.Expressions has this method:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public static Expression&amp;lt;T&amp;gt; Combine&amp;lt;T&amp;gt; (
    this Expression&amp;lt;T&amp;gt; self,
    Func&amp;lt;Expression, Expression&amp;gt; combinator)
&lt;/pre&gt;

&lt;p&gt;And if Expression&amp;lt;T&amp;gt; is not constrained on Delegate, then I sure as hell won't let this stand in my own public API! Which is why the actual signature of the Combine method is:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public static Expression&amp;lt;T&amp;gt; Combine&amp;lt;[DelegateConstraint] T&amp;gt; (
    this Expression&amp;lt;T&amp;gt; self,
    Func&amp;lt;Expression, Expression&amp;gt; combinator) where T : class
&lt;/pre&gt;

&lt;p&gt;And all of this was just a perfect excuse to write a little &lt;a href="http://github.com/jbevain/cecil"&gt;Mono.Cecil&lt;/a&gt; based utility tool, appropriately named &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/tools/patch-constraints.cs"&gt;patch-constraints&lt;/a&gt;, that is used as a post-compile step to fixup the Delegate and Enum constraints of any generic parameter decorated respectively with a DelegateConstraintAttribute or EnumConstraintAttribute, turning them into actual constraints to delegates and enums, which, funnily enough, the C# compiler is more than happy to honor. &lt;/p&gt;

&lt;p&gt;Obviously I could have used the most famous &lt;a href="http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx"&gt;Jon Skeet&lt;/a&gt;'s &lt;a href="http://code.google.com/p/unconstrained-melody/"&gt;unconstrained-melody&lt;/a&gt; tool, but 2002 called and it wants its ildasm based, IL text parser back.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/WIal4SeC9f8" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 13 Jan 2012 14:30:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:d71c223b-7319-4a71-a26e-8abb2661c29f</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/WIal4SeC9f8/constraining-generic-constraints</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/814</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2012/01/13/constraining-generic-constraints</feedburner:origLink></item>
    <item>
      <title>Mono.Linq.Expressions update 2</title>
      <description>&lt;p&gt;This is the second part of an update about &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt;, a tiny helper library to complement the System.Linq.Expressions namespace for .net 4 and Mono.&lt;/p&gt;

&lt;p&gt;The first part is about &lt;a href="http://evain.net/blog/articles/2012/01/11/mono-linq-expressions-update"&gt;fluent creation of expression trees&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Combining expression trees together&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
I keep reading questions on &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt; about this. How to combine two lambda expression together? If we have:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isUserOver18 = u =&amp;gt; u.Age &amp;gt;= 18;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isFemaleUser = u =&amp;gt; u.Gender == Gender.Female;
&lt;/pre&gt;

&lt;p&gt;If we want to combine this lambda expression with a “and” logical expression, the natural way would be to write:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isFemaleUserOver18 = u =&amp;gt;
    isUserOver18(u) &amp;&amp; isFemaleUser(u);
&lt;/pre&gt;

&lt;p&gt;This works just fine if you compile the expression into a delegate to actually execute this code. But most of the time questions of StackOverflow are about using the resulting lambda expression to create a query for LINQ to a database provider, which will analyze the expression tree and create an according SQL request.&lt;/p&gt;

&lt;p&gt;By combining expression trees this way, the LINQ provider may or may not be unable to turn the two invocations into actual SQL.&lt;/p&gt;

&lt;p&gt;That's one of the reason I wrote about an updated &lt;a href="http://evain.net/blog/articles/2010/07/20/predicatebuilder-revisited"&gt;PredicateBuilder&lt;/a&gt;. The obvious solution is to inline the two combined representation of lambda expressions into a new lambda expression tree. &lt;/p&gt;

&lt;p&gt;The update of &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt; comes with a new type, &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/CombineExtensions.cs"&gt;CombineExtensions&lt;/a&gt;, which exposes extension methods that you can use to combine fully created (into lambda expressions) expression trees.&lt;/p&gt;

&lt;p&gt;Using those, combining the two expression trees is as simple as:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isFemaleUserOver18 = isUserOver18.Combine(
    isFemaleUser,
    (left, right) =&amp;gt; left.AndAlso(right));
&lt;/pre&gt;

&lt;p&gt;And indeed, if you print the code representation of this expression tree, you'll have both lambda bodies inlined into another one:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
user =&amp;gt; user.Age &amp;gt;= 18 &amp;&amp; user.Gender == Gender.Female
&lt;/pre&gt; 

&lt;p&gt;Or if you want to negate the boolean expression:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isNotFemaleUserOver18 = isFemaleUserOver18.Combine(
    e =&amp;gt; e.Not());
&lt;/pre&gt;

&lt;p&gt;The cool thing about those Combine extension methods is that they're completely generic, they don't work only on simple predicates. For instance, you can use those to chain constructions of mathematical expressions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/669WTY_3BA0" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 12 Jan 2012 12:25:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:efed07b2-cb01-4358-b84f-822353614836</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/669WTY_3BA0/mono-linq-expressions-update-2</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/812</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2012/01/12/mono-linq-expressions-update-2</feedburner:origLink></item>
    <item>
      <title>Mono.Linq.Expressions update</title>
      <description>&lt;p&gt;I just tagged the 1.2 version of &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt;, and pushed an updated &lt;a href="http://nuget.org/packages/Mono.Linq.Expressions"&gt;nuget package&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mono.Linq.Expressions is a utility library to complement the System.Linq.Expressions namespace, and works with .net 4.0 just as fine as it does with Mono. With a bit over 220 downloads of the nuget package, it's short of roughly 160,400 downloads to be the most downloaded nuget package : a stunning success to put it simply.&lt;/p&gt;

&lt;p&gt;This post is the first of a short series to detail what's awesome and new in this version.&lt;/p&gt;

&lt;h3&gt;Extension methods for a fluent construction of expression trees.&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Have you been using the expression tree API to build a representation of code at runtime ? If so you're familiar with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx"&gt;Expression&lt;/a&gt; class, and it's load of factory methods.&lt;/p&gt;

&lt;p&gt;You're also familiar with this kind of code:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
var user = Expression.Parameter(typeof (User), "user");

var isFemaleUserOver18 = Expression.Lambda&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt;(
    Expression.AndAlso(
        Expression.GreaterThanOrEqual(
            Expression.Property(user, "Age"),
            Expression.Constant(18)),
        Expression.Equal(
            Expression.Property(user, "Gender"),
            Expression.Constant(Gender.Female))), user);
&lt;/pre&gt;

&lt;p&gt;If you take some time to parse this code, the intent is to create an expression tree similar to the one the compiler would emit if you were to write:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; isFemaleUserOver18 =
    user =&amp;gt; user.Age &amp;gt;= 18 &amp;&amp; user.Gender == Gender.Female;
&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt; 1.2 contains &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/tools/fluentextensions-generator.cs"&gt;a code generated&lt;/a&gt; series of extension methods to simplify the manual construction of expression trees by fluently chaining the invocations. This allows you to write instead:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
var user = typeof (User).Parameter("user");

var isFemaleUserOver18 = Expression.Lambda&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt;(
    user.Property("Age").GreaterThanOrEqual(18.Constant())
    .AndAlso(
        user.Property("Gender").Equal(Gender.Female.Constant())), user);
&lt;/pre&gt;

&lt;p&gt;Not only is the code shorter, but it's also easier on the eyes, and easier to comprehend. Using this, almost the factory methods calls to the Expression class can be written fluently. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/L9gW3Kk0I68" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 11 Jan 2012 17:00:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:980851b8-2389-426d-96cb-0bdfb4534c5d</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/L9gW3Kk0I68/mono-linq-expressions-update</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/809</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2012/01/11/mono-linq-expressions-update</feedburner:origLink></item>
    <item>
      <title>TechDays 2011</title>
      <description>&lt;p&gt;&lt;img src="http://evain.net/public/monkeys.jpg" style="border: 2px solid black" /&gt;&lt;/p&gt;


	&lt;p&gt;Mercredi, j&amp;#8217;aurai l&amp;#8217;opportunité de présenter &lt;a href="http://www.microsoft.com/france/mstechdays/programmes/Session.aspx?CellID=d3f9aa87-a3d8-41b1-9ad5-e6fd589de55f"&gt;Mono et son écosystème&lt;/a&gt; pendant les TechDays Microsoft.&lt;/p&gt;


	&lt;p&gt;Ce sera l&amp;#8217;occasion de faire le point sur les dernières nouveautés de &lt;a href="http://www.mono-project.com"&gt;Mono&lt;/a&gt;, et de montrer  comment réutiliser ses compétences .net et partager son code C# pour cibler des plateformes en vogue, comme l&amp;#8217;iPhone et l&amp;#8217;iPad avec &lt;a href="http://monotouch.net"&gt;MonoTouch&lt;/a&gt;, Android avec &lt;a href="http://monodroid.net"&gt;MonoDroid&lt;/a&gt; et Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; avec &lt;a href="http://www.mono-project.com/MonoMac"&gt;MonoMac&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Si vous ne pouvez pas assister à la session, je serai aussi disponible sur le &lt;a href="http://www.microsoft.com/france/mstechdays/communautes/presentation-communautes.aspx?tp=13&amp;#38;partner=c53800ac-aa33-441b-94bc-a0837a13b501"&gt;stand alt.net&lt;/a&gt; pour discuter de tous ces sujets. Venez nombreux !&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/XeJcfLeR6R0" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 07 Feb 2011 23:01:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:128d9bd2-3d8f-4f56-9be3-88d19009ef65</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/XeJcfLeR6R0/techdays-2011</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/808</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2011/02/07/techdays-2011</feedburner:origLink></item>
    <item>
      <title>Custom Linq Expressions </title>
      <description>&lt;p&gt;Between .net 3.5 and .net 4.0, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx"&gt;Linq Expression Tree &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; changed quite a bit, going from a simple compiler supporting expressions only, to a full fledged compiler supporting expressions as well as statements, on top of which are implemented all &lt;span class="caps"&gt;DLR&lt;/span&gt; based language. For anyone working closely with this &lt;span class="caps"&gt;API&lt;/span&gt;, the &lt;a href="http://dlr.codeplex.com/wikipage?title=Docs%20and%20specs&amp;#38;referringTitle=Home"&gt;Expression Tree spec&lt;/a&gt; is a great source of information, the &lt;span class="caps"&gt;MSDN&lt;/span&gt; isn’t very helpful there.&lt;/p&gt;


	&lt;p&gt;When the spec comes to describing the object model for nodes, it differentiates several kind of nodes:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://evain.net/public/et-nodes.png" /&gt;&lt;/p&gt;


	&lt;p&gt;The core nodes and the common nodes are those which are implemented inside System.Linq.Expressions, and common nodes are implemented on top of the core nodes, using a process that is called reducing nodes.&lt;/p&gt;


	&lt;p&gt;A reducible node is simply a node that can be compiled as a compound of core nodes. We’re not going to talk about library specific extensions, which are nodes that you would write if you were to implement, say, a &lt;span class="caps"&gt;LINQ&lt;/span&gt; provider. We&amp;#8217;ll focus on reducible nodes.&lt;/p&gt;


	&lt;p&gt;I took some time last year to implement a few helper nodes that are not available in .net 4.0, but, according to the spec, may be included in a future release. They’re mapped to similar C# constructs, and are pretty useful it you generate complex code using expression trees. Here’s the list of custom expressions I added in &lt;a href="https://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt;, my project to complement the System.Linq.Expression namespace:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/DoWhileExpression.cs"&gt;DoWhileExpression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/ForEachExpression.cs"&gt;ForEachExpression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/ForExpression.cs"&gt;ForExpression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/UsingExpression.cs"&gt;UsingExpression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/WhileExpression.cs"&gt;WhileExpression&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

	&lt;p&gt;Even if those map to a C# statement, they’re suffixed with `Expression` for consistency with the whole System.Linq.Expressions namespace. Using them is as simple as, heh, adding a using directive:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
using Mono.Linq.Expressions;
&lt;/pre&gt;

	&lt;p&gt;And using the factory methods on the CustomExpression class to create those new nodes:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
var d = Expression.Parameter (typeof (DisposableType), "d");

var printAndDispose = Expression.Lambda&amp;lt;Action&amp;lt;DisposableType&amp;gt;&amp;gt; (
    CustomExpression.Using (
        d,
        Expression.Call (typeof (Console).GetMethod (
            "WriteLine", new [] { typeof (object) }), d)),
    d);
&lt;/pre&gt;

	&lt;p&gt;The Expression Tree &lt;span class="caps"&gt;API&lt;/span&gt; makes it easy to write custom reducible expressions, all you have to do, is to inherit from &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx"&gt;Expression&lt;/a&gt;, override &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.canreduce.aspx"&gt;CanReduce&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.nodetype.aspx"&gt;NodeType&lt;/a&gt;, and implement the &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.reduce.aspx"&gt;Reduce method&lt;/a&gt;:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public abstract partial class CustomExpression : Expression {

    public override ExpressionType NodeType {
        get { return ExpressionType.Extension; }
    }

    public override bool CanReduce {
        get { return true; }
    }

    /* ... */
}
&lt;/pre&gt;

	&lt;p&gt;If we take, for instance, our &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/UsingExpression.cs"&gt;UsingExpression&lt;/a&gt;, mapping to the C# &lt;a href="http://msdn.microsoft.com/en-us/library/yh598w02.aspx"&gt;using statement&lt;/a&gt;, Reduce is implemented as follows:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public override Expression Reduce ()
{
    var end_finally = Expression.Label ("end_finally");

    return Expression.Block (
        new [] { variable },
        Expression.Assign (variable, disposable),
        Expression.TryFinally (
            body,
            Expression.Block (
                Expression.Condition (
                    Expression.NotEqual (variable, Expression.Constant (null)),
                    Expression.Block (
                        Expression.Call (
                            Expression.Convert (variable, typeof (IDisposable)),
                            typeof (IDisposable).GetMethod ("Dispose")),
                        Expression.Goto (end_finally)),
                    Expression.Goto (end_finally)),
                Expression.Label (end_finally))));
}
&lt;/pre&gt;

	&lt;p&gt;Just like a C# using, it will try to execute a block, and whether the block triggered an exception or not, it will call &lt;a href="http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx"&gt;IDisposable.Dispose&lt;/a&gt; on the subject of the using statement.&lt;/p&gt;


	&lt;p&gt;Wasn&amp;#8217;t that easy? Even if those nodes are pretty general, writing custom and specific nodes is a powerful and simple way to factorize code when generating code using the Expression Tree &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;In the end, I added in &lt;a href="https://github.com/jbevain/mono.linq.expressions/"&gt;Mono.Linq.Expressions&lt;/a&gt; a &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/CustomExpression.cs"&gt;CustomExpression&lt;/a&gt; type, our base class for well, custom expressions. We provide a &lt;a href="https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/CustomExpressionVisitor.cs"&gt;CustomExpressionVisitor&lt;/a&gt; which extends the standard &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx"&gt;ExpressionVisitor&lt;/a&gt; to support our custom expressions, and the &lt;a href="http://evain.net/blog/articles/2010/06/23/mono-linq-expressions"&gt;CSharpWriter&lt;/a&gt; has been updated to support them as well:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
[Test]
public void Using ()
{
    var arg = Expression.Parameter (typeof (IDisposable), "arg");

    var lambda = Expression.Lambda&amp;lt;Action&amp;lt;IDisposable&amp;gt;&amp;gt; (
        CustomExpression.Using (
            arg,
            Expression.Call (typeof (Console).GetMethod (
                "WriteLine", new [] { typeof (object) }), arg)),
        arg);

    AssertExpression (@" 
void (IDisposable arg)
{
    using (arg)
    {
        Console.WriteLine(arg);
    }
}
", lambda);
}
&lt;/pre&gt;

	&lt;p&gt;Next feature for Mono.Linq.Expressions: using &lt;a href="http://evain.net/blog/articles/2009/04/30/reflection-based-cil-reader"&gt;Mono.Reflection&lt;/a&gt; to turn a delegate into an expression of this delegate.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/gbzJeUBB_ow" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 17 Jan 2011 18:45:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:765fd571-93a4-47a3-bae2-4f9c801d331d</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/gbzJeUBB_ow/custom-linq-expressions</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/805</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2011/01/17/custom-linq-expressions</feedburner:origLink></item>
    <item>
      <title>IQueryable support for WP7</title>
      <description>&lt;p&gt;Or how to use APIs missing from the &lt;span class="caps"&gt;WP7 SDK&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/4959819424/" title="Plitvice de Jb Evain, sur Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4105/4959819424_ffc57952c7.jpg" width="500" height="333" alt="Plitvice" style="border: 2px solid black" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Monday saw the official launch of Windows Phone 7, at this occasion, I downloaded the &lt;span class="caps"&gt;SDK&lt;/span&gt; to see how it compares to &lt;a href="http://monotouch.net"&gt;MonoTouch&lt;/a&gt; and &lt;a href="http://monodroid.net"&gt;MonoDroid&lt;/a&gt;. Basically, it’s based on the Compact Framework Base Class Library, on top of which is exposed the Silverlight &lt;span class="caps"&gt;UI API&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;The Compact Framework has historically targeted devices with limited capabilities. The Compact Framework &lt;span class="caps"&gt;BCL&lt;/span&gt; is a trimmed down version of the vanilla .net &lt;span class="caps"&gt;BCL&lt;/span&gt;. One notable missing feature is runtime code generation through System.Reflection.Emit. As such, you can’t use DynamicMethods, nor can you compile assemblies on the device, and nor can you compile Expression Trees. You can expect to find missing tidbits sprinkled throughout the whole &lt;span class="caps"&gt;BCL&lt;/span&gt;. But luckily for us, there’s Mono.&lt;/p&gt;


	&lt;p&gt;The Mono &lt;span class="caps"&gt;BCL&lt;/span&gt; being licensed under the &lt;span class="caps"&gt;MIT&lt;/span&gt;/X11, you can easily take C# code from our libraries and use it inside your own applications. And that whenever our code is not tied to a runtime feature. This means that you couldn’t bring System.Reflection.Emit to &lt;span class="caps"&gt;WP7&lt;/span&gt;, but that you could probably bring XmlDocument with a bit of work.&lt;/p&gt;


	&lt;p&gt;Basically, this reminded me of what db4o did to &lt;a href="http://evain.net/blog/articles/2008/09/22/linq-expression-trees-on-the-compact-framework"&gt;bring support for Expression Trees to the Compact Framework&lt;/a&gt; using code from Mono. I figured I’d try to do the same for &lt;span class="caps"&gt;WP7&lt;/span&gt;. If you played with the &lt;span class="caps"&gt;WP7 SDK&lt;/span&gt;, you probably know that you have access to Expression Trees, and the compiler can emit them without any issue. But LambdaExpression and Expression of T don’t have their Compile method you’re used to. And &lt;span class="caps"&gt;WP7&lt;/span&gt; is missing IQueryable and folks.&lt;/p&gt;


	&lt;p&gt;So as an example, I extracted our Expression Tree interpreter, which is used, guess what, when you can’t compile Expression Trees at runtime, and our IQueryable support. Here we are, by just referencing this System.Linq.dll, you can write code such as:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
using System.Linq;

var data = new [] { 1, 2, 3, 4, 5, 6, 7, 8 };

var query = data.AsQueryable ();
query.Where (i =&amp;gt; i % 2 == 0);

int count = query.Count ();
&lt;/pre&gt;

	&lt;p&gt;Or:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
using System.Linq.Expressions;

var p1 = Expression.Parameter (typeof (string), "x");
var p2 = Expression.Parameter (typeof (string), "y");

Expression&amp;lt;Func&amp;lt;string, Func&amp;lt;string, Func&amp;lt;string&amp;gt;&amp;gt;&amp;gt;&amp;gt; e =
    Expression.Lambda&amp;lt;Func&amp;lt;string, Func&amp;lt;string, Func&amp;lt;string&amp;gt;&amp;gt;&amp;gt;&amp;gt; (
        Expression.Lambda&amp;lt;Func&amp;lt;string, Func&amp;lt;string&amp;gt;&amp;gt;&amp;gt; (
            Expression.Lambda&amp;lt;Func&amp;lt;string&amp;gt;&amp;gt; (
                Expression.Call (
                    typeof (string).GetMethod ("Concat", new [] { typeof (string), typeof (string) }),
                    new [] { p1, p2 }),
                new ParameterExpression [0]),
            new [] { p2 }),
        new [] { p1 });

var f = e.Compile ();
var f2 = f ("Hello ");
var f3 = f2 ("World !");

var result = f3 ();
&lt;/pre&gt;

	&lt;p&gt;(Crazy, I know)&lt;/p&gt;


	&lt;p&gt;You can simply take the &lt;a href="http://evain.net/tmp/System.Linq-bin.zip"&gt;assembly&lt;/a&gt; and reference it from your projects, or compile yourself &lt;a href="http://evain.net/tmp/System.Linq-src.zip"&gt;the code&lt;/a&gt;. Let me know if this has been useful to you.&lt;/p&gt;


	&lt;p&gt;To conclude, I’d say don’t hesitate to take code from Mono to fill the voids in the &lt;span class="caps"&gt;WP7 SDK&lt;/span&gt;. Who knows if you won’t end up contributing missing parts or filing bugs afterwards.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/QlEor8rDXPc" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 13 Oct 2010 17:35:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:36502748-e151-42f0-a517-2ce5e7f65781</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/QlEor8rDXPc/iqueryable-support-for-wp7</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/796</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/10/13/iqueryable-support-for-wp7</feedburner:origLink></item>
    <item>
      <title>IsAssignable what?</title>
      <description>&lt;p&gt;I&amp;#8217;ve &lt;a href="http://twitter.com/jbevain/status/18703683699"&gt;tweeted&lt;/a&gt; it before, &lt;a href="http://jacksonh.tumblr.com/"&gt;Jackson&lt;/a&gt; &lt;a href="http://jacksonh.tumblr.com/post/947513238/tired-of-getting-isassignablefrom-wrong-public"&gt;tumblered&lt;/a&gt; it in return, but after commenting on a StackOverflow answer where the poster got it wrong, commenting:&lt;/p&gt;


&lt;blockquote&gt;I always seem to turn that call around.&lt;/blockquote&gt;

	&lt;p&gt;I felt that I needed to broaden this grand hack. If you&amp;#8217;re like me, and apparently like a lot of coders out there, you tend to always get &lt;a href="http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx"&gt;Type.IsAssignableFrom&lt;/a&gt; wrong on the first try, then you need this extension method:&lt;/p&gt;


&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
public static bool IsAssignableTo (this Type self, Type type)
{
    if (self == null)
        throw new ArgumentNullException ("self");
    if (type == null)
        throw new ArgumentNullException ("type");

    return type.IsAssignableFrom (self);
}
&lt;/pre&gt;

	&lt;p&gt;Somehow, even if IsAssignableFrom is more «left to rightish», preserving the side of the arguments a real assignment would have, I understand IsAssignableTo faster. For what it&amp;#8217;s worth, I&amp;#8217;ve used it extensively while writing our .net 3.5 implementation of System.Linq.Expressions, and it served me well.&lt;/p&gt;


	&lt;p&gt;Have a great friday.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/zFIheZRgsVU" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 01 Oct 2010 10:30:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0bb87e66-aba3-44f1-8b50-20b3aa3a0c47</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/zFIheZRgsVU/isassignable-what</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/779</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/10/01/isassignable-what</feedburner:origLink></item>
    <item>
      <title>A river of T</title>
      <description>&lt;p&gt;Generic collections, iterators and Linq all have in common a single interface: &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt;. If you’ve been writing C# code lately, I bet you wrote your fair share of methods taking or returning IEnumerables.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt; (among other marvels) has a cute syntactic shorthand for it. You can write &lt;i&gt;T*&lt;/i&gt; instead of &lt;i&gt;IEnumerable[of T]&lt;/i&gt;. Of course &lt;a href="http://stackoverflow.com/questions/794369/should-c-introduce-a-syntactic-short-hand-for-ienumerablet"&gt;people would really like to have that in C# as well&lt;/a&gt;. Sure &lt;i&gt;T*&lt;/i&gt; would be nice, but it’s already used for pointers. Some other suggestions in the stackoverflow question involve using the &lt;i&gt;#&lt;/i&gt; suffix, or &lt;i&gt;{}&lt;/i&gt;. On my side, I quite like the idea of re-using &lt;i&gt;~&lt;/i&gt;. It’s only used by the bitwise complement operator in C# (and by finalizers, thanks Scott for the heads up), and if you look at it with a bit of poetry, it kind of look like a river, a stream. And what’s an &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt; but a stream of &lt;i&gt;T&lt;/i&gt;?&lt;/p&gt;

&lt;p&gt;Now discussing wishes for the next version of C# is nice and all, but I felt like hacking a bit on mcs, &lt;a href="http://www.mono-project.com/CSharp_Compiler"&gt;Mono’s C# compiler&lt;/a&gt; tonight, and in less than half an hour of grepping through the code, I had a working version of &lt;a href="http://gist.github.com/514682"&gt;a patch&lt;/a&gt; that would enable this syntactic sugar.&lt;/p&gt;

&lt;p&gt;Let’s take a very poorly implemented set of Linq operators:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
using System;
using System.Collections.Generic;

static class Enumerable {

	public static IEnumerable&amp;lt;T&amp;gt; Concat&amp;lt;T&amp;gt; (this IEnumerable&amp;lt;T&amp;gt; source, IEnumerable&amp;lt;T&amp;gt; other)
	{
		foreach (var item in source)
			yield return item;

		foreach (var oitem in other)
			yield return oitem;
	}

	public static IEnumerable&amp;lt;TResult&amp;gt; Select&amp;lt;TSource, TResult&amp;gt; (this IEnumerable&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, TResult&amp;gt; selector)
	{
		foreach (var item in source)
			yield return selector (item);
	}

	public static IEnumerable&amp;lt;TResult&amp;gt; SelectMany&amp;lt;TSource, TResult&amp;gt; (this IEnumerable&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, IEnumerable&amp;lt;TResult&amp;gt;&amp;gt; selector)
	{
		foreach (var item in source)
			foreach (var sub_item in selector (item))
				yield return sub_item;
	}

	public static IEnumerable&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt; (this IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, bool&amp;gt; predicate)
	{
		foreach (var item in source)
			if (predicate (item))
				yield return item;
	}
}

&lt;/pre&gt;

&lt;p&gt;With my &lt;a href="http://gist.github.com/514682"&gt;patch&lt;/a&gt;, you could write instead:&lt;/p&gt;

&lt;pre name="code" class="c-sharp:nocontrols:nogutter"&gt;
using System;

static class Enumerable {

	public static T~ Concat&amp;lt;T&amp;gt; (this T~ source, T~ other)
	{
		foreach (var item in source)
			yield return item;

		foreach (var oitem in other)
			yield return oitem;
	}

	public static TResult~ Select&amp;lt;TSource, TResult&amp;gt; (this TSource~ source, Func&amp;lt;TSource, TResult&amp;gt; selector)
	{
		foreach (var item in source)
			yield return selector (item);
	}

	public static TResult~ SelectMany&amp;lt;TSource, TResult&amp;gt; (this TSource~ source, Func&amp;lt;TSource, TResult~&amp;gt; selector)
	{
		foreach (var item in source)
			foreach (var sub_item in selector (item))
				yield return sub_item;
	}

	public static T~ Where&amp;lt;T&amp;gt; (this T~ source, Func&amp;lt;T, bool&amp;gt; predicate)
	{
		foreach (var item in source)
			if (predicate (item))
				yield return item;
	}
}

&lt;/pre&gt;

&lt;p&gt;
I let the reader decides for himself which version is the most readable. It's pretty much the same debate as the one for nullable types. Also note that this is just a toy patch, mainly for the sake of digging a bit in mcs, but it’s an interesting experiment nevertheless.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/Dwv4KMCtQWs" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 09 Aug 2010 01:20:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b0363ae2-0b01-4a22-941f-1d83fee23bd5</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/Dwv4KMCtQWs/a-river-of-t</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/735</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/08/09/a-river-of-t</feedburner:origLink></item>
  </channel>
</rss>

