<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CU8ARHo5cCp7ImA9WhBUEE0.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485</id><updated>2013-04-26T21:17:25.428+02:00</updated><category term="C++/CLI" /><category term="CLR" /><category term="Dependency Injection" /><category term="XMLHttpRequest" /><category term="AJAX" /><category term="Recruiting" /><category term="gtalk" /><category term="Manic Miner" /><category term="Interface" /><category term="Puzzle" /><category term="Lisp" /><category term="Expression tree" /><category term="Job" /><category term="Games" /><category term="Drools" /><category term="Cube21" /><category term="Enterprise Architect" /><category term="Permutation" /><category term="Robocode" /><category term="Annotation" /><category term="Modules" /><category term="Mono" /><category term="INotifyPropertyChanged" /><category term="fluent" /><category term="firewall" /><category term="Ant Attack" /><category term="Book" /><category term="x64" /><category term="generator" /><category term="IBM" /><category term="JNI" /><category term="JVM" /><category term="Freemaker" /><category term="fluent API" /><category term="jabber" /><category term="IoC" /><category term="silverlight" /><category term="Nokia" /><category term="Ranking" /><category term="polyglottos" /><category term="PInvoke" /><category term="aop" /><category term="UML" /><category term="jni4net" /><category term=".NET 3.0" /><category term="XML" /><category term="Recursion" /><category term="F#" /><category term="Theme" /><category term="lambda" /><category term="Java" /><category term="C#" /><category term="Algorithm" /><category term="Reflection" /><category term="ReSharper" /><category term="unit of work" /><category term="Higher-order function" /><category term="3D" /><category term="WCF" /><category term="IKVM" /><category term="TeamCity" /><category term="Linq" /><category term="Linux" /><category term="RoboRumble" /><category term="codedom" /><category term="release" /><category term="JavaScript" /><category term="Order" /><category term="WPF" /><category term="ZX Spectrum" /><category term=".NET" /><title>Zamboch</title><subtitle type="html">Pavel Šavara coding for fun</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://zamboch.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/zamboch" /><feedburner:info uri="zamboch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0cBRHc-eyp7ImA9WhVSEEU.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-2533413552994108283</id><published>2012-03-07T01:39:00.000+01:00</published><updated>2012-03-07T01:44:15.953+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T01:44:15.953+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit of work" /><category scheme="http://www.blogger.com/atom/ns#" term="lambda" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><title>Unit of work using lambdas</title><content type="html">Are you tired of writing into log file on every begin and end of the method ? Use &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt;. Well, not yet ready for post-compiler magic or dynamic runtime proxies ? Let's try lambdas (again).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    Scope&amp;lt;LoggingFrame&amp;gt;.Wrap(() =&amp;gt;
    {
        Console.WriteLine(&lt;span class="str"&gt;"Hello world"&lt;/span&gt;);
    });
}&lt;/pre&gt;
&lt;br /&gt;
Would produce this console
&lt;br /&gt;
&lt;pre style="background: black; color: white;"&gt;2012-03-07 00:46:58,248 DEBUG - BEGIN Main
Hello world
2012-03-07 00:46:58,258 DEBUG - END   Main
&lt;/pre&gt;
&lt;br /&gt;
How to implement that ?


&lt;br /&gt;
&lt;pre class="csharpcode"&gt;[DebuggerStepThrough]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Scope&amp;lt;TAdvice&amp;gt; where TAdvice : IAdvice, &lt;span class="kwrd"&gt;new&lt;/span&gt;()
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Wrap(Action body)
    {
        IAdvice advice = Activator.CreateInstance&amp;lt;TAdvice&amp;gt;();
        advice.OnEntry(body);
        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            body();
            advice.OnLeave(body);
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
        {
            advice.OnException(body, ex);
            &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
        }
        &lt;span class="kwrd"&gt;finally&lt;/span&gt;
        {
            advice.OnFinally(body);
        }
    }
}&lt;/pre&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IAdvice
{
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnEntry(Delegate body);
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLeave(Delegate body);
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnException(Delegate body, Exception exception);
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnFinally(Delegate body);
}
&lt;/pre&gt;
Implementation of the LoggingFrame &lt;a href="http://en.wikipedia.org/wiki/Advice_in_aspect-oriented_programming"&gt;advice&lt;/a&gt; is trivial.&lt;br /&gt;
&lt;br /&gt;
Note that you could get similar behavior with IDisposable and using keyword, but you would not be able to log pending exception.&lt;br /&gt;
You could also think about TransactionScope, which would call tx.Complete()&amp;nbsp;automatically when no exception is thrown.&lt;br /&gt;
Further improvement is to use dependency injection to instantiate the advises.&lt;br /&gt;
&lt;br /&gt;
Another use-case is to implement &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;Unit of Work&lt;/a&gt;&amp;nbsp;or session/call context, while using &lt;a href="http://en.wikipedia.org/wiki/Thread-local_storage"&gt;TSL&lt;/a&gt;&amp;nbsp;to reach topmost frame. I used it for NHibernate Session and EF DbContext (unit of work) recently. Interesting related article &lt;a href="http://nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    Scope&amp;lt;UnitOfWork&amp;gt;.Wrap(session =&amp;gt;
    {
        &lt;span class="kwrd"&gt;var&lt;/span&gt; people = session.Person
            .Where(person =&amp;gt; person.FirstName == &lt;span class="str"&gt;"Pavel"&lt;/span&gt;)
            .ToList();

        NestedLogic(people);

        &lt;span class="rem"&gt;//DbContext.SaveChanges() will be called here&lt;/span&gt;
    });

}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NestedLogic(IList&amp;lt;Person&amp;gt; people)
{
    &lt;span class="rem"&gt;//this will lookup parent session in TSL and reuse it&lt;/span&gt;
    Scope&amp;lt;UnitOfWork&amp;gt;.Wrap(session =&amp;gt;
    {
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; person &lt;span class="kwrd"&gt;in&lt;/span&gt; people)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (person.LastName == &lt;span class="str"&gt;"Savara"&lt;/span&gt;)
            {
                person.Coder = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                session.Person.Remove(person);
            }
        }
    });
}&lt;/pre&gt;
&lt;br /&gt;
Composition of scopes could be beautified.
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
Scope&amp;lt;LoggingFrame, TransactionFrame&amp;gt;.Wrap(() =&amp;gt;
{
    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"rollback please"&lt;/span&gt;);
});


[DebuggerStepThrough]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Scope&amp;lt;TOuterAdvice, TInnerAdvice&amp;gt; 
  where TOuterAdvice : IAdvice, &lt;span class="kwrd"&gt;new&lt;/span&gt;() 
  where TInnerAdvice : IAdvice, &lt;span class="kwrd"&gt;new&lt;/span&gt;()
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Wrap(Action body)
    {
        Scope&amp;lt;TOuterAdvice&amp;gt;.Wrap(()=&amp;gt; Scope&amp;lt;TInnerAdvice&amp;gt;.Wrap(body));
    }
}
&lt;/pre&gt;
&lt;br /&gt;
All code in the article is simplified and real implementation is exercise for readers. 
&lt;br /&gt;
&lt;br /&gt;
Enjoy :-)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=3DQRJHyop2A:2BSJ-PkOvP4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=3DQRJHyop2A:2BSJ-PkOvP4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=3DQRJHyop2A:2BSJ-PkOvP4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/3DQRJHyop2A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/2533413552994108283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=2533413552994108283" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2533413552994108283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2533413552994108283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/3DQRJHyop2A/unit-of-work-using-lambdas.html" title="Unit of work using lambdas" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2012/03/unit-of-work-using-lambdas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMHSH4zfyp7ImA9WhRWFEQ.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-908389674713680803</id><published>2011-12-31T14:46:00.000+01:00</published><updated>2012-01-02T10:27:19.087+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T10:27:19.087+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fluent" /><category scheme="http://www.blogger.com/atom/ns#" term="polyglottos" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="fluent API" /><category scheme="http://www.blogger.com/atom/ns#" term="codedom" /><category scheme="http://www.blogger.com/atom/ns#" term="generator" /><title>Fluentator - generate fluent API for your structures</title><content type="html">When working with nested structures like configuration or XML it is bit of pain with syntax in C#. Consider this code below. The object initializes in C# 3.0 helped a lot, but it's still pretty far from ideal. Important point here is readability, which is achieved thru nesting the initializers. 


&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; model = &lt;span class="kwrd"&gt;new&lt;/span&gt; Model();
&lt;span class="kwrd"&gt;var&lt;/span&gt; pavel = &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee(&lt;span class="str"&gt;"Pavel"&lt;/span&gt;);
model.Companies.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Company(&lt;span class="str"&gt;"Boldbrick &amp;amp; co."&lt;/span&gt;)
{
    Departments = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Department&amp;gt;
    {
        &lt;span class="kwrd"&gt;new&lt;/span&gt; Department(&lt;span class="str"&gt;"Software &amp;amp; Visions"&lt;/span&gt;, &lt;span class="str"&gt;"swv"&lt;/span&gt;)
        {
            Teams = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Team&amp;gt;
            {
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Team(&lt;span class="str"&gt;"Visions"&lt;/span&gt;)
                {
                    Employees = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;
                    {
                        &lt;span class="rem"&gt;// I was forced to move &lt;/span&gt;
                        &lt;span class="rem"&gt;// pavel variable declaration completely out of scope&lt;/span&gt;
                        pavel,
                        &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee(&lt;span class="str"&gt;"Ondra"&lt;/span&gt;),
                    },
                    IsAwesome = &lt;span class="kwrd"&gt;true&lt;/span&gt;,
                },
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Team(&lt;span class="str"&gt;"Developers"&lt;/span&gt;)
                {
                    Employees = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;
                    (
                        &lt;span class="rem"&gt;// I can't do any statements or declarations here&lt;/span&gt;
                        &lt;span class="rem"&gt;// to prepare my data in-place&lt;/span&gt;
                        devNames.Select(n=&amp;gt;&lt;span class="kwrd"&gt;new&lt;/span&gt; Employee(n))
                    )
                    {
                        &lt;span class="rem"&gt;// note I can't add pavel first&lt;/span&gt;
                        pavel,
                    }
                }
            }
        }
    }
});
&lt;/pre&gt;

But there are downsides with approach above. You can't easily add same instance into 2 nodes. It forces you to declare pavel variable completely out of scope. And you can't use statements to prepare your data in place either. Note how Pavel is inserted after other employees into Developers team. The LINQ Select() helped great deal here, but it's not always possible to use it.
With more complex model and bigger tree to build, this will become unmanageable mess. 

&lt;p&gt;
So, extension methods and lambdas to rescue. Do you like code below better ? I certainly do. I can use statements and variable declarations in inner scope. I get more dense and readable code.

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; model = &lt;span class="kwrd"&gt;new&lt;/span&gt; Model();
model.AddCompany(&lt;span class="str"&gt;"Boldbrick &amp;amp; co."&lt;/span&gt;, bb =&amp;gt;
{
    bb.AddDepartment(&lt;span class="str"&gt;"Software &amp;amp; Visions"&lt;/span&gt;, &lt;span class="str"&gt;"swv"&lt;/span&gt;, swv =&amp;gt;
    {
        &lt;span class="rem"&gt;// variable is still bit out of scope, but not in the root scope&lt;/span&gt;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; pavel = &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee(&lt;span class="str"&gt;"Pavel"&lt;/span&gt;);
        swv.AddTeam(&lt;span class="str"&gt;"Visions"&lt;/span&gt;, visions =&amp;gt;
        {
            visions.AddEmployee(pavel);
            visions.AddEmployee(&lt;span class="str"&gt;"Ondra"&lt;/span&gt;);
            visions.IsAwesome = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        });
        swv.AddTeam(&lt;span class="str"&gt;"Developers"&lt;/span&gt;, devs =&amp;gt; 
        {
            devs.AddEmployee(pavel);
            &lt;span class="rem"&gt;// I can add more employees after Pavel&lt;/span&gt;
            devs.AddEmployees(devNames.Select(n =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee(n)), dev=&amp;gt;
            {
                dev.Age = 33;
            });
            &lt;span class="rem"&gt;// and also can use any complex statement in-place&lt;/span&gt;
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; devNames.Count; i++)
            {
                &lt;span class="kwrd"&gt;int&lt;/span&gt; ix=i;
                devs.AddEmployee(devNames[i], dev =&amp;gt;
                {
                    dev.Age = ix;
                });
            }
        });
    });
);});&lt;/pre&gt;

&lt;h3&gt;How the extension method looks like ?&lt;/h3&gt;
Below is extension method over external structure Department, which accepts same parameters as Team constructor. Inside is instance creations and adding to the collection.
Finally to allow the nesting of scopes, we pass the new instance to Action&lt;&gt; delegate.

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; Team AddTeam(&lt;span class="kwrd"&gt;this&lt;/span&gt; Department self, &lt;span class="kwrd"&gt;string&lt;/span&gt; name, Action&amp;lt;Team&amp;gt; result = &lt;span class="kwrd"&gt;null&lt;/span&gt;)
{
    &lt;span class="kwrd"&gt;var&lt;/span&gt; item = &lt;span class="kwrd"&gt;new&lt;/span&gt; Team(name);
    self.Teams.Add(item);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (result != &lt;span class="kwrd"&gt;null&lt;/span&gt;) result(item);
    &lt;span class="kwrd"&gt;return&lt;/span&gt; item;
}
&lt;/pre&gt;


&lt;h3&gt;Generate the extensions&lt;/h3&gt;
The extension method above is nice and useful but it's quite boring to write it for each combination of container and child item. Multiplied by all constructor signatures.
So I decided to create &lt;b&gt;ReflectionFluentator&lt;/b&gt; which can generate the code for you. It reads your model via reflection and generates the C# extensions.
See &lt;a href="http://code.google.com/p/polyglottos/source/browse/trunk/polyglottos.test/src/ReflectionFluentatorTest.cs#39"&gt;sample&lt;/a&gt; how to use the generator.

&lt;p&gt; And the same thing for XML ? Sure.
You provide the &lt;a href="http://code.google.com/p/polyglottos/source/browse/trunk/demomodel/library.xsd"&gt;XSD&lt;/a&gt; to &lt;b&gt;XsdFluentator&lt;/b&gt;.
See &lt;a href="http://code.google.com/p/polyglottos/source/browse/trunk/polyglottos.test/src/XsdFluentatorTest.cs"&gt;sample&lt;/a&gt; how to use the generator.

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; doc=&lt;span class="kwrd"&gt;new&lt;/span&gt; XDocument();
doc.AddLibrary(&lt;span class="str"&gt;"Prague"&lt;/span&gt;,prague =&amp;gt;
{
    prague.AddBook(&lt;span class="str"&gt;"Saturnin"&lt;/span&gt;, book =&amp;gt;
    {
        book.AddAuthor(&lt;span class="str"&gt;"Zdenek Jirotka"&lt;/span&gt;);
    });
    prague.AddBook(&lt;span class="str"&gt;"Bylo Nas 5"&lt;/span&gt;, book =&amp;gt;
    {
        book.AddAuthor(&lt;span class="str"&gt;"Karel Polacek"&lt;/span&gt;);
    });
});
&lt;/pre&gt;

This code can generate this XML as expected.
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;library&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="Prague"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://polyglottos.googlecode.com/svn/trunk/demomodel/library.xsd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;book&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Saturnin"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;author&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Zdenek Jirotka"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;book&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;book&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Bylo Nas 5"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;author&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Karel Polacek"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;book&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;library&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

Note that both generators are more prototypes than ready to ship. They don't handle any edge scenarios when reading the metadata or writing the code. 
Fluentator is part of &lt;a href="http://code.google.com/p/polyglottos/"&gt;Polyglottos&lt;/a&gt; project. If you like the idea and wish to contribute improvements, please talk back.

&lt;p&gt;At this point some of you may wonder what else could be made fluent this way. In my case, I realized that I need to generate the code and the code is just nested structure. So I created CodeDom code generator &lt;a href="http://code.google.com/p/polyglottos/"&gt;Polyglottos&lt;/a&gt; with fluent API. That's for another article next year. Enjoy the party tonight!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=CIAzCfsz8uQ:WycMjp3xhNo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=CIAzCfsz8uQ:WycMjp3xhNo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=CIAzCfsz8uQ:WycMjp3xhNo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/CIAzCfsz8uQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/908389674713680803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=908389674713680803" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/908389674713680803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/908389674713680803?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/CIAzCfsz8uQ/fluentator-generate-fluent-api-for-your.html" title="Fluentator - generate fluent API for your structures" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/12/fluentator-generate-fluent-api-for-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4MSHgyeip7ImA9WhdVFEs.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4557635245092405261</id><published>2011-09-19T23:08:00.006+02:00</published><updated>2011-09-19T23:16:29.692+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T23:16:29.692+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="release" /><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.8.6 - release</title><content type="html">&lt;h3&gt;Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;fixed permission demand for sandboxed environments&lt;/li&gt;
&lt;li&gt;improved proxygen can't find class reporting&lt;/li&gt;
&lt;li&gt;improved the way we are looking for jni4net.j-xxx-.jar (while installed in GAC)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=27"&gt;[#27]&lt;/a&gt; - fixed build script problems&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="http://sourceforge.net/projects/jni4net/files/0.8.6/jni4net-0.8.6.0-bin.zip/download"&gt;here&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Road map&lt;/h3&gt;
May people asked for road map. &lt;a href="https://docs.google.com/document/pub?id=1J6ZAeYjn0x63osecI1L7sDohZ1qVA3mDPjk2Z4Zwh-U"&gt;This is my vision&lt;/a&gt;, not a promise.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=GcMYuYIf9D0:Mn5p5g2zydU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=GcMYuYIf9D0:Mn5p5g2zydU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=GcMYuYIf9D0:Mn5p5g2zydU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/GcMYuYIf9D0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4557635245092405261/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4557635245092405261" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4557635245092405261?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4557635245092405261?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/GcMYuYIf9D0/jni4net-086-release.html" title="jni4net 0.8.6 - release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/09/jni4net-086-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cDRno9fSp7ImA9WhdQFk0.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-7156426576962943470</id><published>2011-08-17T20:12:00.002+02:00</published><updated>2011-08-17T20:17:57.465+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-17T20:17:57.465+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.8.5 - release</title><content type="html">&lt;h3&gt;Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=9"&gt;[#&amp;nbsp;9]&lt;/a&gt; - support for indexer properties [by&amp;nbsp;Johannes&amp;nbsp;Rudolph]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=9"&gt;[#22]&lt;/a&gt; - Potential field name clash due to increasing numbering strategy of field names&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=9"&gt;[#24]&lt;/a&gt; - Change of current directory during init may disrupt other code running in parallel&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=9"&gt;[#25]&lt;/a&gt; - DirectByteBuffer doesn't work with Java 7&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="http://sourceforge.net/projects/jni4net/files/0.8.5/jni4net-0.8.5.0-bin.zip/download"&gt;here&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=7eQ0WnfgqiE:Vm8bzNerg6s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=7eQ0WnfgqiE:Vm8bzNerg6s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=7eQ0WnfgqiE:Vm8bzNerg6s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/7eQ0WnfgqiE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/7156426576962943470/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=7156426576962943470" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7156426576962943470?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7156426576962943470?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/7eQ0WnfgqiE/jni4net-085-release.html" title="jni4net 0.8.5 - release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/08/jni4net-085-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEDQn45eCp7ImA9WhdSEEw.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-8876294739567588065</id><published>2011-07-18T11:07:00.032+02:00</published><updated>2011-07-18T19:37:53.020+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T19:37:53.020+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RoboRumble" /><category scheme="http://www.blogger.com/atom/ns#" term="Robocode" /><title>Host your own Roborumble server</title><content type="html">There are several reasons why you might want to run your own Roborumble server. Maybe you would like to run small local contest at your school or workplace. Or maybe you are testing your new shiny robot. Or may you want to collect some battle data, like myself.

&lt;br/&gt;&lt;br/&gt;
The &lt;a href="http://darkcanuck.net/rumble/Rankings?game=roborumble"&gt;current Roborumble server&lt;/a&gt; is created and maintained by &lt;a href="http://robowiki.net/wiki/Darkcanuck"&gt;Darkcanuck&lt;/a&gt;. Luckily he shares the &lt;a href="http://darkcanuck.net/svn/rumbleserver/trunk/"&gt;RumbleServer sources&lt;/a&gt; via subversion. It is implemented in PHP and MySQL.

&lt;br/&gt;&lt;br/&gt;
Because I'm not PHP+MySQL expert, easiest solution for me was to download &lt;a href="http://www.turnkeylinux.org/lampstack"&gt;ready-made LAMP&lt;/a&gt; virtual machine and configure it. 

&lt;br/&gt;
I know you are busy ;-), so I published my virtual appliance, you could just start using it. You can &lt;a href="http://ane-kolin.cz/zamboch/turnkey-roborumble.2011-07-18.zip.torrent"&gt;download&lt;/a&gt; it and run it in VMWare Player. Password is &lt;span style="font-weight:bold;"&gt;robocode&lt;/span&gt;, you should change it as soon. Or you could follow the guide below.

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Configure server&lt;/h3&gt;
Once you have &lt;a href="http://www.turnkeylinux.org/lampstack"&gt;LAMP stack&lt;/a&gt; up and running you need few things:
&lt;br/&gt; Install subversion client
&lt;br/&gt; Get PHP sources
&lt;br/&gt; Configure RumbleServer
&lt;br/&gt; Turn on URL rewriting mod in Apache
&lt;br/&gt; Configure MySQL database and grant permissions

&lt;br/&gt;&lt;br/&gt;The appliance has could be configured from web admin. You can access it on https://192.168.1.12/ where 192.168.1.12 is the IP address assigned to the virtual machine by your DHCP server. I will use 192.168.1.12 which was assigned to me in rest of the article.
&lt;br/&gt;&lt;br/&gt;
&lt;br/&gt; &lt;span style="font-weight:bold;"&gt;Webmin&lt;/span&gt;-&gt;Global configuration
&lt;br/&gt;&amp;nbsp;&amp;nbsp;-&gt;Configure Apache Modules-&gt;rewrite: switch ON
&lt;br/&gt;
&lt;br/&gt; &lt;span style="font-weight:bold;"&gt;MyPhpAdmin&lt;/span&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;Create database-&gt;roborumble
&amp;nbsp;&amp;nbsp;Import script &lt;a href="http://darkcanuck.net/svn/rumbleserver/trunk/schema/schema.sql"&gt;schema/schema.sql&lt;/a&gt; 
&lt;br/&gt;&amp;nbsp;&amp;nbsp;Priviledges-&gt;add new user-&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name-&gt;rumbleuser
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass-&gt;rumblepass
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Database for user-&gt;None
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Global privileges-&gt;Select+Update+Insert+Delete
&lt;br/&gt;

&lt;br/&gt;
&lt;span style="font-weight:bold;"&gt;On root shell&lt;/span&gt; do something like this
&lt;pre style="background-color: #CCCCCC"&gt;
apt-get install subversion
cd /var/www/
mkdir rumble
cd rumble
svn co http://darkcanuck.net/svn/rumbleserver/trunk/ .
chmod g+w templates_c/
chown :www-data templates_c/
cat &gt; participants.txt
&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;[paste &lt;a href="http://ane-kolin.cz/zamboch/participants.txt"&gt;participants.txt&lt;/a&gt; file and press Ctrl-D]&lt;/span&gt;&lt;/span&gt;
cd config
cp config.php-sample config.php
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Participants&lt;/h3&gt;
Are defined as list of robots and their .jar files. Big competition is driven by &lt;a href="http://robowiki.net/wiki/RoboRumble/Participants?action=raw"&gt;this file&lt;/a&gt;. We could simplify our own list like &lt;a href="http://ane-kolin.cz/zamboch/participants.txt"&gt;this&lt;/a&gt;. We host the file on the appliance in folder /var/www/. So create you own shortlist and update it there. Note there are starting and ending tags.
&lt;pre style="font-size:xx-small; background-color: #CCCCCC"&gt;
----
&amp;lt;pre&amp;gt;
jk.mega.DrussGT 2.0.4,http://www.minifly.rchomepage.com/robocode/jk.mega.DrussGT_2.0.4.jar
voidious.Diamond 1.5.34b,http://www.dijitari.com/void/robocode/voidious.Diamond_1.5.34b.jar
&amp;lt;/pre&amp;gt;
----
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Configure client&lt;/h3&gt;
Download and install &lt;a href="http://sourceforge.net/projects/robocode/files/robocode/1.7.3.0/robocode-1.7.3.0-setup.jar/download"&gt;Robocode 1.7.3&lt;/a&gt;
&lt;br/&gt;Edit c:\robocode\roborumble\roborumble.txt
&lt;div style="font-size:xx-small;"&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;PARTICIPANTSURL=http://192.168.1.12/participants.txt
&lt;br/&gt;&amp;nbsp;&amp;nbsp;UPDATEBOTSURL=http://192.168.1.12/rumble/RemoveOldParticipant
&lt;br/&gt;&amp;nbsp;&amp;nbsp;RESULTSURL=http://192.168.1.12/rumble/UploadedResults
&lt;br/&gt;&amp;nbsp;&amp;nbsp;RATINGS.URL=http://192.168.1.12/rumble/RatingsFile
&lt;br/&gt;&amp;nbsp;&amp;nbsp;ITERATE=YES
&lt;/div&gt;
&lt;br/&gt;start c:\robocode\roborumble.bat

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Purge data&lt;/h3&gt;
If you need to purge the data from the &lt;span style="font-weight:bold;"&gt;roborumble&lt;/span&gt; database and start from scratch just delete rows using MyPhpAdmin.
&lt;pre style="font-size:xx-small; background-color: #CCCCCC"&gt;
delete from battle_results;
delete from game_pairings;
delete from bot_data;
delete from participants;
delete from upload_stats;
delete from upload_users;
&lt;/pre&gt;

&lt;span style="font-weight:bold;"&gt;&lt;br/&gt;&lt;br/&gt;Oh, and once you are done with your local competition, don't forget to redirect back to &lt;a href="http://darkcanuck.net/rumble/index.html"&gt;official RoboRumble server&lt;/a&gt; and contribute your CPU power!&lt;/span&gt;

&lt;br/&gt;&lt;br/&gt;&lt;a href="http://ane-kolin.cz/zamboch/turnkey-roborumble.2011-07-18.zip.torrent"&gt;Download turnkey-roborumble.2011-07-18.zip&lt;/a&gt;.torrent&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=wHzns1NRIrI:0NPuxsRuvSo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=wHzns1NRIrI:0NPuxsRuvSo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=wHzns1NRIrI:0NPuxsRuvSo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/wHzns1NRIrI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/8876294739567588065/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=8876294739567588065" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/8876294739567588065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/8876294739567588065?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/wHzns1NRIrI/host-your-own-roborumble-server.html" title="Host your own Roborumble server" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/07/host-your-own-roborumble-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQMRnw4fSp7ImA9WhdTEEs.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-7026430673854087863</id><published>2011-07-07T21:08:00.011+02:00</published><updated>2011-07-07T21:36:27.235+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T21:36:27.235+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity" /><category scheme="http://www.blogger.com/atom/ns#" term="Freemaker" /><title>HowTo: Pass build property from TeamCity into Freemaker email notification template</title><content type="html">There is no magic, once you know it. My use-case was to prefix build number with configurable text before sending an email. The text was represented as TeamCity property &lt;span style="font-style:italic;"&gt;system.tc.branch.number&lt;/span&gt; in my case.

&lt;br/&gt;&lt;br/&gt;&lt;a href="http://confluence.jetbrains.net/display/TCD65/Customizing+Notifications"&gt;TeamCity email templates&lt;/a&gt; are implemented with &lt;a href="http://freemarker.sourceforge.net/"&gt;Freemaker&lt;/a&gt;. The TeamCity exposes all build properties as hash table on &lt;a href="http://javadoc.jetbrains.net/teamcity/openapi/current/jetbrains/buildServer/serverSide/SBuild.html#getBuildOwnParameters%28%29"&gt;SBuild.getBuildOwnParameters()&lt;/a&gt;. 

&lt;br/&gt;&lt;br/&gt;In the template the instance of SBuild is accessible under &lt;span style="font-weight:bold;"&gt;build&lt;/span&gt; variable.

Freemaker allows calling bean properties, in our case it would be &lt;span style="font-weight:bold;"&gt;build.buildOwnParameters&lt;/span&gt;, &lt;a href="http://freemarker.sourceforge.net/docs/pgui_datamodel_objectWrapper.html"&gt;map lookup&lt;/a&gt; thru square-bracket syntax &lt;span style="font-weight:bold;"&gt;[]&lt;/span&gt; and literals are enclosed in apostrophes.

&lt;br/&gt;&lt;br/&gt;
&lt;pre style="font-size:xx-small; background-color: #CCCCCC"&gt;
#${build.buildOwnParameters['system.tc.branch.number']}.${build.buildNumber}
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=nn_mTmSlFVo:Lr4gqzuX1eU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=nn_mTmSlFVo:Lr4gqzuX1eU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=nn_mTmSlFVo:Lr4gqzuX1eU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/nn_mTmSlFVo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/7026430673854087863/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=7026430673854087863" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7026430673854087863?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7026430673854087863?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/nn_mTmSlFVo/howto-pass-build-property-from-teamcity.html" title="HowTo: Pass build property from TeamCity into Freemaker email notification template" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/07/howto-pass-build-property-from-teamcity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAESXY8eCp7ImA9WhZaEkQ.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-6771876414057545932</id><published>2011-06-28T21:48:00.008+02:00</published><updated>2011-06-28T22:41:48.870+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T22:41:48.870+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.8.4 - release</title><content type="html">&lt;h3&gt;Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added ability to load proxies into specified classLoader by&amp;nbsp;Jose&amp;nbsp;Chillan.
&lt;br/&gt;&lt;small&gt;Bridge.LoadAndRegisterAssemblyFromClassLoader(File, ClassLoader)&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;JNIEnv.DetachCurrentThread() contributed by Renier B.&lt;/li&gt;
&lt;li&gt;Bridge.setClrVersion() made static by Leonid Bogdanov&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="http://sourceforge.net/projects/jni4net/files/0.8.4/jni4net-0.8.4.0-bin.zip/download"&gt;here&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=gq7qldhHoMI:3X2Kx4Tb4j0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=gq7qldhHoMI:3X2Kx4Tb4j0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=gq7qldhHoMI:3X2Kx4Tb4j0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/gq7qldhHoMI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/6771876414057545932/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=6771876414057545932" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/6771876414057545932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/6771876414057545932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/gq7qldhHoMI/084-release.html" title="jni4net 0.8.4 - release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/06/084-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8DQn89eyp7ImA9WhRQEU8.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4406677048989311476</id><published>2011-03-26T15:03:00.024+01:00</published><updated>2011-12-05T22:34:33.163+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-05T22:34:33.163+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="INotifyPropertyChanged" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Raising Property Changed fast and safe - yet another solution</title><content type="html">This Thursday we discussed with my colleagues how to raise property changed event. We learned that it could be done  &lt;br /&gt;
a) via string literal,  &lt;br /&gt;
b) via lambda expression tree,  &lt;br /&gt;
c) via StackTrace or MethodBase.GetCurrentMethod().  &lt;br /&gt;
&lt;a href="http://csharperimage.jeremylikness.com/2010/12/jounce-part-8-raising-property-changed.html"&gt;Nice summary is here.&lt;/a&gt; or &lt;a href="http://compositeextensions.codeplex.com/discussions/53731"&gt;here&lt;/a&gt;   &lt;p&gt;We did some naive performance test and learned that for 500k iterations on simple property, there is big difference in speed. &lt;br /&gt;
a) is really fast, 13ms &lt;br /&gt;
b) is slow, 1417ms, I guess because security checks apply for every call and every stack frame, and can't be fired from other properties. &lt;br /&gt;
c) is slow, 2518ms, very slow, because expression tree is constructed for every call  &lt;p&gt;So we played with it for a while and I invented solution with anonymous type (at botom).   &lt;p&gt;&lt;span style="font-weight:bold;"&gt;Update 27.3.2011: &lt;/span&gt;I was so focused on speed that I didn't realized that the solution yesterday didn't work nicely for rename. What a shame. I hope people give me another chance today. Here we have postponed creation of the expression tree, it takes about 75ms. And this time my ReSharper renames it correctly :-)&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Update 5.12.2011: &lt;/span&gt; As Alex noted in comments, there was thread safety issue with Dictionary. The code is now fixed with Hashtable instead.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ModelBase : INotifyPropertyChanged
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Hashtable Names = &lt;span class="kwrd"&gt;new&lt;/span&gt; Hashtable();

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RaisePropertyChange(Func&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; key)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            var propertyName = (PropertyChangedEventArgs)Names[key];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (propertyName==&lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                propertyName = &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(key());
                &lt;span class="kwrd"&gt;lock&lt;/span&gt; (Names)
                {
                    Names[key] = propertyName;
                }
            }
            PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, propertyName);
        }
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Reg&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; property)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (property.Body &lt;span class="kwrd"&gt;as&lt;/span&gt; MemberExpression).Member.Name;
    }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Model : ModelBase
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName2;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName2
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; firstName2; }
        set
        {
            firstName2 = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
            &lt;span style="background-color: yellow;"&gt;RaisePropertyChange(() =&amp;gt; Reg(() =&amp;gt; FirstName2));&lt;/span&gt;
        }
    }
}&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Doesn't work: &lt;/span&gt;The lambda just helps to define the type without creating the instance and calling the getter. It takes about 77ms for half million calls. &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt; &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ModelBase : INotifyPropertyChanged
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Dictionary&amp;lt;Type, PropertyChangedEventArgs&amp;gt; Names = 
          &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;Type, PropertyChangedEventArgs&amp;gt;();

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RaisePropertyChange&amp;lt;T&amp;gt;(Func&amp;lt;T&amp;gt; f)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                var key = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T);
                PropertyChangedEventArgs evntArgs;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Names.TryGetValue(key, &lt;span class="kwrd"&gt;out&lt;/span&gt; evntArgs))
                {
                    var propertyName = key.GetProperties()[0].Name;
                    evntArgs = &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName);
                    &lt;span class="kwrd"&gt;lock&lt;/span&gt;(Names)
                    {
                        Names[key] = evntArgs;
                    }
                }
                PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, evntArgs);
            }
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Model : ModelBase
    {
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; firstName; }
            set {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (firstName != &lt;span class="kwrd"&gt;value&lt;/span&gt;)
                {
                    firstName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
                    &lt;span style="background-color: yellow;"&gt;RaisePropertyChange(() =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; {FirstName});&lt;/span&gt;
                }
            }
        }
    }&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ulEppUwdNoo:JzNZI4BXvvw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ulEppUwdNoo:JzNZI4BXvvw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=ulEppUwdNoo:JzNZI4BXvvw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/ulEppUwdNoo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4406677048989311476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4406677048989311476" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4406677048989311476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4406677048989311476?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/ulEppUwdNoo/raising-property-changed-fast-and-safe.html" title="Raising Property Changed fast and safe - yet another solution" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>13</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/03/raising-property-changed-fast-and-safe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcBQnY_eyp7ImA9Wx9bEkw.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4438068387296394151</id><published>2011-02-20T13:15:00.005+01:00</published><updated>2011-02-20T16:50:53.843+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-20T16:50:53.843+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>jni4net 0.8.3 - release</title><content type="html">&lt;h3&gt;Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;added support for &lt;a href="https://www.ibm.com/developerworks/java/jdk/"&gt;IBM JRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;added &lt;a href="http://www.jboss.org/drools"&gt;drools&lt;/a&gt; sample&lt;/li&gt;
&lt;li&gt;added BridgeSetup.IgnoreJavaHome&lt;/li&gt;
&lt;li&gt;improved error logging during initialization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Blocked DLLs for CLR 4.0&lt;/h3&gt;
If you download the distribution package on jni4net and unzip it via Windows Explorer, it will set the DLL security zone as untrusted. That will prevent CLR 4.0 from loading the DLL and you will receive exception while initializing jni4net from Java side.
&lt;br/&gt;
The message states: 
&lt;br/&gt; 
&lt;pre style="font-size:xx-small"&gt;
Can't init BridgeExport:An attempt was made to load an assembly from a network l
ocation which would have caused the assembly to be sandboxed in previous version
s of the .NET Framework. This release of the .NET Framework does not enable CAS
policy by default, so this load may be dangerous. If this load is not intended t
o sandbox the assembly, please enable the loadFromRemoteSources switch. See http
://go.microsoft.com/fwlink/?LinkId=155569 for more information.&lt;/pre&gt;
&lt;br/&gt;
You can solve it by unblocking the DLLs. 
&lt;br/&gt;&lt;span style="font-weight:bold;"&gt;Right-click on the files, open file properties and click unblock button.&lt;/span&gt;
&lt;br/&gt;
&lt;img src="http://pavel.savara.sweb.cz/pics/unblock.png"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=xUeqepZpV44:sWL3etLNS_U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=xUeqepZpV44:sWL3etLNS_U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=xUeqepZpV44:sWL3etLNS_U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/xUeqepZpV44" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4438068387296394151/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4438068387296394151" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4438068387296394151?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4438068387296394151?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/xUeqepZpV44/jni4net-083-bugfix-release.html" title="jni4net 0.8.3 - release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/02/jni4net-083-bugfix-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cBRX47eSp7ImA9Wx9QGUo.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4051008254098452394</id><published>2011-01-02T13:15:00.001+01:00</published><updated>2011-01-02T14:30:54.001+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-02T14:30:54.001+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.8.2 - bugfix release</title><content type="html">&lt;h3&gt;Bug fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;upgraded nMaven, NUnit, made build 32bit only&lt;/li&gt;
&lt;li&gt;fixed throwing exceptions for missing proxy classes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=18"&gt;[#18]&lt;/a&gt; - C# string[]{null} -&gt; JVM -&gt; null reference exception&lt;/li&gt;
&lt;li&gt;improved architecture detection&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=bFQgE7VwxBQ:T72ePnptou4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=bFQgE7VwxBQ:T72ePnptou4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=bFQgE7VwxBQ:T72ePnptou4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/bFQgE7VwxBQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4051008254098452394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4051008254098452394" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4051008254098452394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4051008254098452394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/bFQgE7VwxBQ/jni4net-082-bugfix-release.html" title="jni4net 0.8.2 - bugfix release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2011/01/jni4net-082-bugfix-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YCQXk5eCp7ImA9Wx5aEUg.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-6075074794506101496</id><published>2010-11-07T18:15:00.005+01:00</published><updated>2010-11-07T18:32:40.720+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-07T18:32:40.720+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.8.1 - bugfix release</title><content type="html">&lt;ul&gt;
&lt;li&gt;Fixed &lt;a href="http://code.google.com/p/jni4net/issues/detail?id=17"&gt;memory leak&lt;/a&gt; reported by Jaco Ackermann&lt;/li&gt;
&lt;li&gt;Included improved CLR detection contributed by Leonid Bogdanov&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="https://sourceforge.net/projects/jni4net/files/0.8.1/jni4net-0.8.1.0-bin.zip/download"&gt;0.8.1 here&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=qYdAbt9MK5A:sOyDiVfdk5E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=qYdAbt9MK5A:sOyDiVfdk5E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=qYdAbt9MK5A:sOyDiVfdk5E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/qYdAbt9MK5A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/6075074794506101496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=6075074794506101496" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/6075074794506101496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/6075074794506101496?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/qYdAbt9MK5A/jni4net-081-bugfix-release.html" title="jni4net 0.8.1 - bugfix release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/11/jni4net-081-bugfix-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFQXc5fSp7ImA9Wx5WEUQ.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-3811461772044546342</id><published>2010-09-23T00:15:00.006+02:00</published><updated>2010-09-23T01:00:10.925+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-23T01:00:10.925+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IoC" /><category scheme="http://www.blogger.com/atom/ns#" term="F#" /><title>Decomposition in functional languages</title><content type="html">Got an idea: functions (in FP) could be composed similar was as components in OOP. For example with dependency injection. For components in OOP we use interfaces. For functions we could use delegates. To achieve decomposition and modularity.

&lt;br/&gt;
I tried to find something about it. No luck. Probably because there are no functional programs big enough to need this ?

&lt;br/&gt;
While searching for enterprise scale applications written in FP I found this list.
&lt;a href="http://homepages.inf.ed.ac.uk/wadler/realworld/"&gt;Functional Programming in the Real World&lt;/a&gt; and &lt;a href="http://view.samurajdata.se/ps.php?url=http%3A%2F%2Fcarpanta.dc.fi.udc.es%2Fpf%2Fpapers%2Fsigplan-angry.ps.gz&amp;submit=View!"&gt;this paper&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;
I hope I just missed the killer application for FP, which would be big enough to deserve decomposition. Maybe someone could find me answer at &lt;a href="http://stackoverflow.com/questions/3774224/decomposition-modularity-in-functional-languages"&gt;stack overflow&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=RZ6s_DPTiu0:sOEpc1dCGk8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=RZ6s_DPTiu0:sOEpc1dCGk8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=RZ6s_DPTiu0:sOEpc1dCGk8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/RZ6s_DPTiu0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/3811461772044546342/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=3811461772044546342" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3811461772044546342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3811461772044546342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/RZ6s_DPTiu0/decomposition-in-functional-languages.html" title="Decomposition in functional languages" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/09/decomposition-in-functional-languages.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkENR3s8eCp7ImA9WxFaFkg.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-3908524463617508389</id><published>2010-07-20T22:25:00.010+02:00</published><updated>2010-07-20T22:44:56.570+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-20T22:44:56.570+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="F#" /><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><category scheme="http://www.blogger.com/atom/ns#" term="Robocode" /><title>CLR 4.0 for Robocode</title><content type="html">I finally got motivated by &lt;a href="http://www.beingnew.net/2010/07/continuing-battle-classes-for-robocode.html"&gt;Justin&lt;/a&gt; and &lt;a href="http://groups.google.com/group/robocode-developers/browse_thread/thread/e6654487cf2f3c5?hl=en"&gt;Jason&lt;/a&gt; to do something for Robocode&amp;nbsp;.NET again. I upgraded it to jni4net 0.8. This means Robocode will prefer CLR 4.0 if installed and then will run robots written in C#&amp;nbsp;4.0 or F#. I also implemented Robocode Control API for .NET. I&amp;nbsp;piggyback to Flemming's working branch, hope he will not kill me once he returns from holidays :-D

&lt;br/&gt;&lt;br/&gt;
Download preview is there, Alpha quality.&lt;br/&gt;
&lt;a href="http://robocode.sourceforge.net/download/robocode-1.7.2.2-Alpha-setup.jar"&gt;robocode-1.7.2.2-Alpha-setup.jar&lt;/a&gt;
&lt;br/&gt;
&lt;a href="http://robocode.sourceforge.net/download/robocode.dotnet-1.7.2.2-Alpha-setup.jar"&gt;robocode.dotnet-1.7.2.2-Alpha-setup.jar&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;MyFirstRobot.F#&lt;/h3&gt;
I really like the syntax.&lt;br/&gt;
&lt;pre style="font-size:x-small"&gt;
namespace SampleFs
open Robocode
type MyFirstRobot() = 
    inherit Robot()
    override robot.Run() = 
            while true do
                robot.TurnLeft(40.0)
                robot.Ahead(20.0)
    override robot.OnScannedRobot(evnt : ScannedRobotEvent) = 
            robot.Fire(1.0)
    override robot.OnHitByBullet(evnt : HitByBulletEvent) = 
            robot.TurnLeft(90.0 - evnt.Bearing)
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=cbLojxKN4qY:tSyPl0sPjzg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=cbLojxKN4qY:tSyPl0sPjzg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=cbLojxKN4qY:tSyPl0sPjzg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/cbLojxKN4qY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/3908524463617508389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=3908524463617508389" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3908524463617508389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3908524463617508389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/cbLojxKN4qY/clr-40-for-robocode.html" title="CLR 4.0 for Robocode" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/07/clr-40-for-robocode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQCQX47eip7ImA9WxFWEk4.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-8950277641052683082</id><published>2010-05-30T16:27:00.003+02:00</published><updated>2010-05-30T16:39:20.002+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-30T16:39:20.002+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="F#" /><category scheme="http://www.blogger.com/atom/ns#" term="Puzzle" /><title>Learning F# with Project Euler - day 2</title><content type="html">&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=4"&gt;Problem 4&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
open Microsoft.FSharp.Core.Operators
let findpalindrome xs ys =
    let separate s p = (s % (pown 10 (p+1))) - (s % (pown 10 p))
    let shiftl s p o = (separate s p) / (pown 10 (p-o))
    let shiftr s p o = (separate s p) * (pown 10 (o-p))
    let flip f = shiftl f 5 0 + shiftl f 4 1 + shiftl f 3 2 + shiftr f 2 3 + shiftr f 1 4 + shiftr f 0 5
    let findi xs y = xs |&gt; Seq.filter( fun x -&gt; (((x*y) = flip (x*y)) &amp;&amp; (separate (x*y) 0 &lt;&gt; 0) ) ) |&gt; Seq.map(fun x -&gt; (x*y,x))
    ys |&gt; Seq.collect(fun y -&gt; (findi xs y)) |&gt; Seq.maxBy(fun t -&gt; fst(t))

findpalindrome [100..999][100..999]
&lt;/pre&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=5"&gt;Problem 5&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
let test = 
    let max = (primes 20 |&gt; Seq.reduce(fun a c -&gt; a*c))*8L*3L
    [1L..20L] |&gt; Seq.filter(fun x -&gt; (max % x) &lt;&gt; 0L)
&lt;/pre&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=6"&gt;Problem 6&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
let diff xs = 
    let sumsq = xs |&gt; Seq.reduce(fun c a -&gt; (a*a)+c)
    let sum = (xs |&gt; Seq.reduce(fun c a -&gt; (a+c)))
    let sqsum  = sum*sum
    sqsum  - sumsq

diff [1..100]
&lt;/pre&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=7"&gt;Problem 7&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
open Microsoft.FSharp.Core.Operators
let primesnth nthprime = 
    let maxPrime = 300000
    let pr : bool array = Array.zeroCreate maxPrime
    let mutable res = 0
    let mutable nth = 0
    let mutable cur=2
    while (nth &lt; nthprime) do
        if not pr.[cur] then
            for wr in cur+cur .. cur .. maxPrime-1 do pr.[wr] &lt;- true
            res &lt;- cur
            nth &lt;- nth + 1 
        cur &lt;- cur + 1
    res

primesnth 10001
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=mp9KSPercWM:ifsmS0qK3hE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=mp9KSPercWM:ifsmS0qK3hE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=mp9KSPercWM:ifsmS0qK3hE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/mp9KSPercWM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/8950277641052683082/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=8950277641052683082" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/8950277641052683082?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/8950277641052683082?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/mp9KSPercWM/learning-f-with-project-euler-day-2.html" title="Learning F# with Project Euler - day 2" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/05/learning-f-with-project-euler-day-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8MQXkzfCp7ImA9WxFWEE0.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-1833687303456043266</id><published>2010-05-28T01:49:00.006+02:00</published><updated>2010-05-28T02:01:20.784+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-28T02:01:20.784+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="F#" /><category scheme="http://www.blogger.com/atom/ns#" term="Puzzle" /><title>Learning F# with projecteuler.net</title><content type="html">Wow, lot of fun with &lt;a href="http://projecteuler.net"&gt;projecteuler.net&lt;/a&gt; ! 
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=1"&gt;Problem 1&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
[1..999] |&gt; Seq.filter( fun x -&gt; (x % 3 = 0 || x % 5 = 0)) |&gt; Seq.sum
&lt;/pre&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=2"&gt;Problem 2&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
let fib max = 
    let rec fibo a b max = 
        if b&gt;= max then a :: [] else a :: fibo b (a+b) max
    fibo 1 2 max

fib 4000000 |&gt; Seq.filter(fun x -&gt; (x % 2 = 0)) |&gt; Seq.toList|&gt; Seq.sum
&lt;/pre&gt;

&lt;h3&gt;&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=3"&gt;Problem 3&lt;/a&gt;&lt;/h3&gt;
&lt;pre style="font-size:xx-small"&gt;
open Microsoft.FSharp.Math 
open System.Collections.Generic
let maxPrime:int= (int) (System.Math.Sqrt((float)600851475143I))
let primes maxPrime = 
    let pr : bool array = Array.zeroCreate maxPrime
    let res = new List&lt;bigint&gt;()
    for cur in 2 .. maxPrime/2 do
        if not pr.[cur] then for wr in cur+cur .. cur .. maxPrime-1 do pr.[wr] &lt;- true
    for cur in 1 .. maxPrime-1 do
        if not pr.[cur] then res.Add(new bigint(cur))
    res

primes maxPrime |&gt; 
    Seq.filter(fun x -&gt; ((600851475143I % x) = 0I )) 
    |&gt; Seq.map( fun x -&gt; ((int)(x))) 
    |&gt; Seq.max
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=9Uyytd2I-Bg:xo_ZK4a-UgA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=9Uyytd2I-Bg:xo_ZK4a-UgA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=9Uyytd2I-Bg:xo_ZK4a-UgA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/9Uyytd2I-Bg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/1833687303456043266/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=1833687303456043266" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/1833687303456043266?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/1833687303456043266?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/9Uyytd2I-Bg/learning-f-with-projecteulernet.html" title="Learning F# with projecteuler.net" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/05/learning-f-with-projecteulernet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMDQH85eyp7ImA9WxFSFU4.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4671418877992824471</id><published>2010-04-17T22:24:00.005+02:00</published><updated>2010-04-17T22:51:11.123+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-17T22:51:11.123+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><category scheme="http://www.blogger.com/atom/ns#" term="Mono" /><title>jni4net NOT yet on Mono &amp; Linux</title><content type="html">I started with investigations of support for Mono on x86. The key problem is different calling convention - &lt;span style="font-weight:bold;"&gt;cdecl&lt;/span&gt;. My current implementation of JniLocalHandle is build on top of assumption that small structures are put onto stack same way as scalar types. But that's not valid assumption, it works just for stdcall. cdecl allocates the structure on heap and passes just pointer to the structure, no matter how big the structure is. Why I created JniLocalHandle ? Because I wanted to make strongly typed difference between JniLocalHandle and JniGlobalHandle. We could drop it and use IntPtr in order to deal with this problem. It will impact all generated proxies on C# side.&lt;br/&gt;

There is another problem with cdecl, because I need to put &lt;pre&gt;[UnmanagedFunctionPointer(CallingConvention.xxx)]&lt;/pre&gt; on any JNI delegate. Example is JNIEnv.AllocObject. I think I'll need to duplicate whole JNIEnv class in order to avoid condition for each call.&lt;br/&gt;

Last small problem is with JNI.Dll which has the main &lt;pre&gt;[DllImport("jvm.dll", CallingConvention = CallingConvention.StdCall)]&lt;/pre&gt;, it must be duplicated as well, because there is jvm.so on Linux. &lt;br/&gt;&lt;br/&gt;

Currently I don't hear from people that they need Mono/Linux support for jni4net. If &lt;span style="font-weight:bold;"&gt;you think you need it&lt;/span&gt;, please &lt;a href="http://groups.google.com/group/jni4net/browse_thread/thread/491e33083fd63a31?hl=en"&gt;tell us&lt;/a&gt; the use case. I'm interested to hear why Mono support is worth of the effort. Till then I put it on ice.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=j-jUFRjt1DU:7U_-_eI-Ohw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=j-jUFRjt1DU:7U_-_eI-Ohw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=j-jUFRjt1DU:7U_-_eI-Ohw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/j-jUFRjt1DU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4671418877992824471/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4671418877992824471" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4671418877992824471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4671418877992824471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/j-jUFRjt1DU/jni4net-not-yet-on-mono-linux.html" title="jni4net NOT yet on Mono &amp; Linux" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/04/jni4net-not-yet-on-mono-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFSX8-cSp7ImA9WxFSFU4.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-2073140454975846630</id><published>2010-04-17T21:55:00.006+02:00</published><updated>2010-04-17T22:33:38.159+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-17T22:33:38.159+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>jni4net version 0.8 for .NET 4.0</title><content type="html">&lt;ul&gt;
&lt;li&gt;added support for CLR v 4.0&lt;/li&gt;
&lt;li&gt;v40 is now loaded by default if it could be found. You could set the version explicitly with Bridge.setClrVersion()&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=8"&gt;#8&lt;/a&gt; added BridgeSetup.AddJVMOption(string)&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="https://sourceforge.net/projects/jni4net/files/0.8/jni4net-0.8.0.0-bin.zip/download"&gt;jni4net 0.8&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=xdvfpIVJfgc:gfElFFPqWpA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=xdvfpIVJfgc:gfElFFPqWpA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=xdvfpIVJfgc:gfElFFPqWpA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/xdvfpIVJfgc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/2073140454975846630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=2073140454975846630" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2073140454975846630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2073140454975846630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/xdvfpIVJfgc/jni4net-version-08-for-net-40.html" title="jni4net version 0.8 for .NET 4.0" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/04/jni4net-version-08-for-net-40.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MSXY8fSp7ImA9WxBUFUU.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-1227635024047602570</id><published>2010-03-03T03:58:00.002+01:00</published><updated>2010-03-03T04:13:08.875+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T04:13:08.875+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net 0.7.1 - small bugfix release</title><content type="html">&lt;h3&gt;Bug fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=7&amp;can=1"&gt;[#7]&lt;/a&gt; - added ParPrimC2J(IntPtr)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jni4net/issues/detail?id=5&amp;can=1"&gt;[#5]&lt;/a&gt; - Reading Java home location from the Windows registry (Contributed by Martin Matula), BridgeSetup extended with JavaHome, and improved JavaHome auto detection&lt;/li&gt;
&lt;li&gt;fixed missing assembly version for jni4net.n.*.dll &lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=f_uZ2TenMBg:eJLfOVykogY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=f_uZ2TenMBg:eJLfOVykogY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=f_uZ2TenMBg:eJLfOVykogY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/f_uZ2TenMBg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/1227635024047602570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=1227635024047602570" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/1227635024047602570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/1227635024047602570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/f_uZ2TenMBg/jni4net-071-small-bugfix-release.html" title="jni4net 0.7.1 - small bugfix release" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/03/jni4net-071-small-bugfix-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04BRHo-cSp7ImA9WxBUEU4.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-3730720232263436354</id><published>2010-02-25T22:55:00.002+01:00</published><updated>2010-02-25T23:12:35.459+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-25T23:12:35.459+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C++/CLI" /><category scheme="http://www.blogger.com/atom/ns#" term="Robocode" /><title>Robocode with C++/CLI</title><content type="html">Recently I spotted question if it's possible to create robot in C++. Here is the answer. Ok, I know, it's not like real C++ with pointers etc, this is managed version of C++, which is safe enough to be runnable in Robocode.

&lt;ul&gt;
&lt;li&gt;Download VS 2008 Express C++&lt;/li&gt;
&lt;li&gt;Create new CLR-&gt; Class Library (DLL) project&lt;/li&gt;
&lt;li&gt;Go to project properties, Common Properties, Add New Reference, and add &lt;span style="font-weight:bold;"&gt;robocode.dll&lt;/span&gt; from lib folder of your robocode installation.&lt;/li&gt;
&lt;li&gt;Go to project properties, Configuration properties, General, Common Language Runtime support and set it to  Safe MSIL (/clrsafe)&lt;/li&gt;
&lt;li&gt;Go to AssemblyInfo.cpp and delete line with [assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];&lt;/li&gt;
&lt;li&gt;Go to [&lt;span style="font-style:italic;"&gt;myCppRobot&lt;/span&gt;].h and insert code below &lt;/li&gt;
&lt;li&gt;Compile it, drop the DLL into Robocode and enjoy!&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="preproc"&gt;#pragma&lt;/span&gt; once
&lt;span class="kwrd"&gt;using&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; Robocode;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; myCppR {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyCplusplusRobot : Robot {
    &lt;span class="kwrd"&gt;public&lt;/span&gt;:
        &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Run() &lt;span class="kwrd"&gt;override&lt;/span&gt; {
            &lt;span class="kwrd"&gt;while&lt;/span&gt;(&lt;span class="kwrd"&gt;true&lt;/span&gt;) {
                Ahead(100);
                TurnLeft(100);
            }
        }
    };
}
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ZSKYFZcIda8:fwP5rQIzshE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ZSKYFZcIda8:fwP5rQIzshE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=ZSKYFZcIda8:fwP5rQIzshE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/ZSKYFZcIda8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/3730720232263436354/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=3730720232263436354" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3730720232263436354?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/3730720232263436354?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/ZSKYFZcIda8/robocode-with-ccli.html" title="Robocode with C++/CLI" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/02/robocode-with-ccli.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YEQnw_fSp7ImA9WxBVEko.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-5357921131685216844</id><published>2010-02-15T23:49:00.002+01:00</published><updated>2010-02-16T00:05:03.245+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T00:05:03.245+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Robocode" /><title>Robocode .NET - 1.7.2 public beta</title><content type="html">This &lt;a href="http://robo-code.blogspot.com/2010/02/robocode-1720-beta-net-robots-are-now.html"&gt;release&lt;/a&gt; of Robocode is big &lt;a href="http://robo-code.blogspot.com/2010/02/robocode-net-introduction.html"&gt;achievement&lt;/a&gt; for me.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=IvwRjbBxxOM:Yv3NYAA8V4E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=IvwRjbBxxOM:Yv3NYAA8V4E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=IvwRjbBxxOM:Yv3NYAA8V4E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/IvwRjbBxxOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/5357921131685216844/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=5357921131685216844" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/5357921131685216844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/5357921131685216844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/IvwRjbBxxOM/robocode-net-172-public-beta.html" title="Robocode .NET - 1.7.2 public beta" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/02/robocode-net-172-public-beta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQERHw7fyp7ImA9WxBVEU0.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-5780253084996079132</id><published>2010-02-13T23:41:00.006+01:00</published><updated>2010-02-14T01:28:25.207+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-14T01:28:25.207+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net version 0.7 released</title><content type="html">&lt;h3&gt;support for delegates and events&lt;/h3&gt;
.NET events and delegates are supported by proxygen and runtime. From Java side they could be invoked with Invoke() method which has proper signature. Delegates could be also implemented on Java side, by usual anonymous class and passed back to CLR. So Java could subscribe to .NET events.
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;this&lt;/span&gt;.button1.addClick(&lt;span class="kwrd"&gt;new&lt;/span&gt; system.EventHandler(){
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Invoke(system.Object sender, system.EventArgs e){
            button1.setText(&lt;span class="str"&gt;"Clicked"&lt;/span&gt;);
        }
    });
&lt;/pre&gt;
Full code is in &lt;a href="http://code.google.com/p/jni4net/source/browse/trunk/content/samples/winforms/java/TestForm.java"&gt;winforms sample&lt;/a&gt;, which is part of binaries.

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Other changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;solved problem with spaces in path to dll/jar&lt;/li&gt;
&lt;li&gt;assembly loading now uses java.io.File or assembly name (breaking change)&lt;/li&gt;
&lt;li&gt;static class is no longer found by name, attribute parameter added (breaking change)&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="https://sourceforge.net/projects/jni4net/files/"&gt;there&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=X-MzRU-YFgA:nbDWwFACnfs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=X-MzRU-YFgA:nbDWwFACnfs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=X-MzRU-YFgA:nbDWwFACnfs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/X-MzRU-YFgA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/5780253084996079132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=5780253084996079132" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/5780253084996079132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/5780253084996079132?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/X-MzRU-YFgA/jni4net-version-07-released.html" title="jni4net version 0.7 released" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/02/jni4net-version-07-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENRH4yfyp7ImA9WxBXE04.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-528661346832708159</id><published>2010-01-24T01:32:00.006+01:00</published><updated>2010-01-24T13:38:15.097+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-24T13:38:15.097+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net version 0.6 released</title><content type="html">&lt;ul&gt;
&lt;li&gt;Implemented &lt;span style="font-weight:bold;"&gt;out&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;ref&lt;/span&gt; parameter from C#&lt;/li&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ch92fbc1.aspx"&gt;DateTime.TryParse&lt;/a&gt; has second parameter 'out'. This is how to use it from Java: 
&lt;br/&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
Out&amp;lt;DateTime&amp;gt; dt=&lt;span class="kwrd"&gt;new&lt;/span&gt; Out&amp;lt;DateTime&amp;gt;();
&lt;span class="kwrd"&gt;if&lt;/span&gt; (DateTime.TryParse(&lt;span class="str"&gt;"2009-08-28"&lt;/span&gt;,dt)){
    System.&lt;span class="kwrd"&gt;out&lt;/span&gt;.println(dt.getValue());
}
&lt;/pre&gt;
&lt;br/&gt;
&lt;li&gt;Improved proxygen to not generate virtual method overrides&lt;/li&gt;
&lt;li&gt;Eliminated lot of warnings in generated code&lt;/li&gt;
&lt;li&gt;Strongly typed JNI references (this is breaking change, please regenerate your proxies)&lt;/li&gt;
&lt;li&gt;Sun specific DirectBufferCleaner, which holds the reference to pinned buffer&lt;/li&gt;
&lt;li&gt;Native methods unregistration when appdomain unloads&lt;/li&gt;
&lt;li&gt;Switched off signed .jar, because it prevents other people generating (unsigned) proxies into same packages. For example java.util_&lt;/li&gt;
&lt;li&gt;Possibility to specify alternate classloader&lt;/li&gt;
&lt;li&gt;Declarative security for running in partially trusted environments&lt;/li&gt;
&lt;li&gt;JVM exceptions are serializable for CLR binary serialization&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="https://sourceforge.net/projects/jni4net/files/"&gt;there&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=rabpKYJkJeM:4r91Kr070bQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=rabpKYJkJeM:4r91Kr070bQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=rabpKYJkJeM:4r91Kr070bQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/rabpKYJkJeM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/528661346832708159/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=528661346832708159" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/528661346832708159?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/528661346832708159?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/rabpKYJkJeM/jni4net-version-06-released.html" title="jni4net version 0.6 released" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/01/jni4net-version-06-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MASX48eCp7ImA9WxBVEEs.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-4952494724410497515</id><published>2010-01-09T16:30:00.009+01:00</published><updated>2010-02-13T14:57:28.070+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-13T14:57:28.070+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Robocode" /><title>Robocode .NET - alpha bits</title><content type="html">I'm proud to present working version of .NET Robocode for community testing.
It took me almost exactly 2 years.&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;make sure you have .NET framework &gt;= 2.0 installed on your windows box&lt;/li&gt;
&lt;li&gt;backup your robocode home&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Install and start&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="http://robocode.sourceforge.net/download/robocode-1.7.3.0-setup.jar"&gt;robocode-1.7.3.0-setup.jar&lt;/a&gt; and &lt;a href="http://robocode.sourceforge.net/download/robocode.dotnet-1.7.3.0-setup.jar"&gt;robocode.dotnet-1.7.3.0-setup.jar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;run robocode-1.7.3.0-setup.jar&lt;/li&gt;
&lt;li&gt;run robocode.dotnet-1.7.3.0-setup.jar&lt;/li&gt;
&lt;li&gt;start robocode.bat&lt;/li&gt;
&lt;li&gt;start new battle with samplecs.MyCsTeam and samplecs.PaintingRobot&lt;/li&gt;
&lt;li&gt;open samplecs.PaintingRobot dialog and enable painting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Optional&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;start your Visual Studio&lt;/li&gt;
&lt;li&gt;open robots/samplescs/samplescs.csproj&lt;/li&gt;
&lt;li&gt;or create project new and reference &lt;b&gt;robocode.dll&lt;/b&gt; from libs\ (Robot API for .NET)&lt;/li&gt;
&lt;li&gt;and code your own .NET robot :-D&lt;/li&gt;
&lt;/ul&gt;

Please try it and say what you think !&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Known gaps&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Robot API xml documentation is not yet ready&lt;/li&gt;
&lt;li&gt;IGraphics/onPaint have just simple operations implemented&lt;/li&gt;
&lt;li&gt;Robot could create unlimited threads, (but could not cause any harm to your computer)&lt;/li&gt;
&lt;li&gt;jni4net 0.6 was not released public yet&lt;/li&gt;
&lt;li&gt;Few unit tests still fail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
These binaries above are 1.7.3, but that was just working number. We will merge it to trunk and release as 1.7.2 probably.
Sources are &lt;a href="http://code.google.com/p/robocode/source/browse/#svn/robocode/trunk/plugins/dotnet"&gt;in trunk&lt;/a&gt; already.
&lt;/p&gt;

&lt;br/&gt;Enjoy!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=uir5V21wHNw:GnKOfQcK0bo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=uir5V21wHNw:GnKOfQcK0bo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=uir5V21wHNw:GnKOfQcK0bo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/uir5V21wHNw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/4952494724410497515/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=4952494724410497515" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4952494724410497515?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/4952494724410497515?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/uir5V21wHNw/robocode-net-alpha-bits.html" title="Robocode .NET - alpha bits" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2010/01/robocode-net-alpha-bits.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYHQ38zfCp7ImA9WxNaGEU.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-2837819615379693276</id><published>2009-12-04T00:56:00.008+01:00</published><updated>2009-12-04T01:22:12.184+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-04T01:22:12.184+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><title>jni4net version 0.5 released</title><content type="html">Second public release of &lt;a href="http://jni4net.sf.net/"&gt;jni4net&lt;/a&gt; is out. New features are:
&lt;ul&gt;
&lt;li&gt;Simplified proxygen to wrap all classes in DLL or JAR file from command-line, without time spent on config file. It as well provides very simplistic build.cmd. I will write another article about proxygen soon, till then look at new samples.&lt;/li&gt;
&lt;li&gt;Ported java.nio.ByteBuffer to .NET, so you could share same byte array in both VMs. You are able to use BinaryWriter in .NET as well, but same byte order and interface is more convenient.&lt;/li&gt;
&lt;li&gt; There are new Adapt.Enumeration and Adapt.Disposable methods on CLR side. They are convenience adapters from corresponding Java interfaces.

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var prop &lt;span class="kwrd"&gt;in&lt;/span&gt; Adapt.Enumeration(javaSystemProperties.keys()))
{
    cnt++;
}
&lt;/pre&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; (var fis = Adapt.Disposable(&lt;span class="kwrd"&gt;new&lt;/span&gt; FileInputStream(classPath)))
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (var zis = Adapt.Disposable(&lt;span class="kwrd"&gt;new&lt;/span&gt; ZipInputStream(fis.Real)))
    {
        ZipEntry entry = zis.Real.getNextEntry();
        &lt;span class="kwrd"&gt;while&lt;/span&gt; (entry!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; name = entry.getName();
            entry = zis.Real.getNextEntry();
        }
    }
}
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Improved proxygen code generator&lt;/li&gt;
&lt;li&gt;Few minor bugfixes&lt;/li&gt;
&lt;li&gt;New &lt;a href="http://jni4net.sf.net/troubleshoot.shtml"&gt;troubleshooter page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

Download &lt;a href="https://sourceforge.net/projects/jni4net/files/"&gt;there&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=yAma0RJQRMM:rF2FUXnlE6g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=yAma0RJQRMM:rF2FUXnlE6g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=yAma0RJQRMM:rF2FUXnlE6g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/yAma0RJQRMM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/2837819615379693276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=2837819615379693276" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2837819615379693276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/2837819615379693276?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/yAma0RJQRMM/jni4net-version-05-released.html" title="jni4net version 0.5 released" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2009/12/jni4net-version-05-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcASHoyfCp7ImA9WxNUE0s.&quot;"><id>tag:blogger.com,1999:blog-8243961069707831485.post-7185613991038347660</id><published>2009-11-03T22:46:00.009+01:00</published><updated>2009-11-04T21:37:29.494+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-04T21:37:29.494+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PInvoke" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="jni4net" /><category scheme="http://www.blogger.com/atom/ns#" term="JVM" /><category scheme="http://www.blogger.com/atom/ns#" term="JNI" /><category scheme="http://www.blogger.com/atom/ns#" term="CLR" /><title>How calling from Java to .NET works in jni4net</title><content type="html">Tonight I would like to explain how calling from Java to .NET works with &lt;a href="http://jni4net.sf.net/"&gt;jni4net&lt;/a&gt;. The other way around is described in &lt;a href="http://zamboch.blogspot.com/2009/10/how-calling-from-net-to-java-works.html"&gt;previous article&lt;/a&gt;, it would be good if you read that first if you didn't yet.
&lt;br/&gt;&lt;br/&gt;

So, in JNI there is method which allow you to &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp17734"&gt;register native implementation&lt;/a&gt; of Java method. Such method had "native" keyword in it's signature. I believe that it's actually how low level methods in Java runtime are implemented.

&lt;br/&gt;&lt;br/&gt;
We use proxygen tool, which is part of jni4net, to reflect any public members of .NET type and then to generate Java proxies. Those proxy methods are marked native. The generator must do few translations to follow Java naming rules. Namespaces are always lower-cased to become packages. Properties are converted to bean-like get and set methods.
&lt;br/&gt;
&lt;img class="img" src="http://jni4net.com/pics/CLRProxy.png" alt="jni4net JVMProxy"/&gt;

&lt;br/&gt;&lt;br/&gt;
For exceptions the situation is similar. &lt;a href="http://code.google.com/p/jni4net/source/browse/trunk/jni4net.j/src/main/java/system/Exception.java"&gt;system.Exception&lt;/a&gt; proxy is inherited from Java java.lang.RuntimeException to be throw-able. Therefore it isn't inherited from &lt;a href="http://code.google.com/p/jni4net/source/browse/trunk/jni4net.j/src/main/java/system/Object.java"&gt;system.Object&lt;/a&gt; proxy. But there is system.IObject interface on both of them for your convenience.

&lt;br/&gt;&lt;br/&gt;
The proxy implements Java finalizer, so when JVM GC cleans up the proxy instance, the real CLR instance is released as well. The reference to CLR is implemented as &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx"&gt;GCHandle&lt;/a&gt; converted to long and kept on JVM side inside the proxy.

&lt;br/&gt;&lt;br/&gt;
system.Object proxy as well overrides toString() method and forwards it to CLR. It seems that in version 0.4 I forgot to override hashCode() and equals(), sorry about that ;-)

&lt;br/&gt;&lt;br/&gt;
The implementation is is asymmetric to CLR-&gt;JVM proxies, because for both it's CLR which does the translation work. The wrapper have signature which is expected by JNI RegisterNatives. I apply &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getfunctionpointerfordelegate.aspx"&gt;Marshal.GetFunctionPointerForDelegate&lt;/a&gt; to wrapper methods to get endpoint callable by JVM. Side note is that JNI RegisterNatives does not make any difference between static and instance methods. They are identified by name and signature only, strange limitation.

&lt;br/&gt;&lt;br/&gt;
Last trick I mention is about initial CLR bootstrap. During initial design I realized that there is way how to &lt;a href="http://zamboch.blogspot.com/2009/10/export-native-64bit-method-from-net.html"&gt;export native method&lt;/a&gt; from managed DLL. So I currently use that trick to create DLL with signature friendly to JVM. It seems to me now, that I will need to change my approach soon in order to support multiple versions of CLR and Mono on Linux. Probably I would need to use C++/COM. For now, we have 32bit and 64bit CLR 2.0 on Windows.

&lt;br/&gt;&lt;br/&gt;
Next time maybe about interfaces and type casting.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ibZ9ipZ0BjE:_arbbghKG0s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/zamboch?a=ibZ9ipZ0BjE:_arbbghKG0s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/zamboch?i=ibZ9ipZ0BjE:_arbbghKG0s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/zamboch/~4/ibZ9ipZ0BjE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zamboch.blogspot.com/feeds/7185613991038347660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8243961069707831485&amp;postID=7185613991038347660" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7185613991038347660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8243961069707831485/posts/default/7185613991038347660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/zamboch/~3/ibZ9ipZ0BjE/how-calling-from-java-to-net-works-in.html" title="How calling from Java to .NET works in jni4net" /><author><name>Pavel Šavara</name><uri>https://plus.google.com/111035739517412605958</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-nmGBZx_j2e0/AAAAAAAAAAI/AAAAAAAAAAA/a1UEg-LppuQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://zamboch.blogspot.com/2009/11/how-calling-from-java-to-net-works-in.html</feedburner:origLink></entry></feed>
