<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Circles and Crosses &#187; Technical</title>
	<atom:link href="http://ox.no/posts/category/technical/feed" rel="self" type="application/rss+xml" />
	<link>http://ox.no</link>
	<description>Håvard Stranden&#039;s website</description>
	<lastBuildDate>Sun, 22 Apr 2012 22:21:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Binding a DOM element to an observable using Knockout.js</title>
		<link>http://ox.no/posts/binding-a-dom-element-to-an-observable-using-knockout-js</link>
		<comments>http://ox.no/posts/binding-a-dom-element-to-an-observable-using-knockout-js#comments</comments>
		<pubDate>Tue, 17 Apr 2012 19:32:36 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://ox.no/?p=462</guid>
		<description><![CDATA[I&#8217;ve been doing a bit of experimenting with Knockout.js recently. Having written quite a bit of .NET code over the years, I am very used to thinking in (and I prefer thinking in) the MVVM pattern when it comes to &#8230; <a href="http://ox.no/posts/binding-a-dom-element-to-an-observable-using-knockout-js">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a bit of experimenting with <a href="http://knockoutjs.com">Knockout.js</a> recently. Having written quite a bit of .NET code over the years, I am very used to thinking in (and I prefer thinking in) the MVVM pattern when it comes to UIs, and so Knockout.js is nice.</p>

<p>And, as always, when writing code and living in the real world you sometimes need to do things that do not quite fit the pattern. In this case, I needed to draw on a canvas from my view model whenever some observables on it changed. The pragmatic thing to do when you need to draw on a canvas is to just grab the canvas by ID or whatever, but since this canvas lived in a template, identifying it through selectors quickly got messy (and hard).</p>

<p>Binding to it seemed like a much better idea, so I created the simple <code>element</code> Knockout.js binding. This is a one-way-to-source binding (.NET guys will be familiar with this terminology), meaning that the binding only writes to the view model from the view. In addition, the binding only does this once (when it is initialized), as the element will stay for the lifespan of the page.</p>

<p>So, in all its glory, here is my Knockout.js <code>element</code> binding:</p>

<pre><code>ko.bindingHandlers.element = {
    init: function(element, valueAccessor) {
      var value = valueAccessor();
      value(element);
    }
};
</code></pre>

<p>Use it as you would any other binding:</p>

<pre><code>&lt;canvas width="100" height="60" data-bind="element: yourObservable"&gt;&lt;/canvas&gt;
</code></pre>

<p>Simple as that. Now go use it!</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/binding-a-dom-element-to-an-observable-using-knockout-js/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing JSUT &#8211; Cross-platform JavaScript Unit Testing</title>
		<link>http://ox.no/posts/introducing-jsut-cross-platform-javascript-unit-testing</link>
		<comments>http://ox.no/posts/introducing-jsut-cross-platform-javascript-unit-testing#comments</comments>
		<pubDate>Mon, 06 Feb 2012 11:09:44 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://ox.no/?p=336</guid>
		<description><![CDATA[I write quite a bit of JavaScript these days, and one observation I have made with regards to Line-of-Business apps is that platforms like Node.js makes me lean more towards sharing business logic between the server and client side (meaning &#8230; <a href="http://ox.no/posts/introducing-jsut-cross-platform-javascript-unit-testing">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I write quite a bit of JavaScript these days, and one observation I have made with regards to Line-of-Business apps is that platforms like Node.js makes me lean more towards sharing business logic between the server and client side (meaning Node.js and the browsers, in practice). This creates an immediate need to unit test &#8220;universally&#8221; (across all platforms and environments), and I couldn&#8217;t find a single tool that quite did it for me.</p>

<p>JSUT (JavaScript Unit Testing) is an attempt at making such a tool for fun and profit (non-monetary).</p>

<p>JSUT stems from me growing tired of the hurdles of unit testing my JavaScript code. There are tons of alternative unit testing tools and libraries readily available, but my experience was that they all exhibited one or more of the following shortcomings:</p>

<ul>
<li>Imposing a &#8220;framework&#8221; or &#8220;philosophy&#8221; or &#8220;style&#8221; on my tests</li>
<li>Bringing me additional dependencies to worry about</li>
<li>Working only in the browser or inside Node.js</li>
</ul>

<p>In addition, I feel that many of the available tools and libraries are either undermaintained or overly featureful, and buggy and/or painful to use as a result of one or both of those. I can&#8217;t and won&#8217;t claim that this will be different in the case of JSUT, so it&#8217;s not really an argument, but more a motivation for me.</p>

<h1>Goals</h1>

<p>I sat down and wrote a few goals for JSUT:</p>

<ul>
<li>Universal, cross-platform</li>
<li>Minimalistic, simple, non-constraining</li>
<li>Accessible</li>
</ul>

<p>I then took to writing code and brushing up my rather rusty shell scripting skills, and a few hours later I wound up with what I present to you now.</p>

<h1>JSUT &#8211; JavaScript Unit Testing &#8211; An introduction</h1>

<p>Writing a test in JSUT is about as simple as it can get. You write a function:</p>

<pre><code>function myTest(test) {
  // JSUTs only requirement:
  // Call test.done() when the test is done
  test.done(); 
}
</code></pre>

<p>Now, let&#8217;s say you save this function to a file called <code>test.js</code>. You can then move to your preferred shell and write the following:</p>

<pre><code>jsut -b chrome test.js
</code></pre>

<p>This will run your test in Chrome. To run your test in Node.js, do:</p>

<pre><code>jsut -n test.js
</code></pre>

<p>You can combine the <code>-b</code> and <code>-n</code> flags any way you like, of course.</p>

<h2>Getting JSUT</h2>

<p>Getting JSUT is very simple. Assuming you have <code>npm</code>, just do:</p>

<pre><code>npm install jsut
</code></pre>

<p>Which will install jsut locally. If you want a global installation, issue:</p>

<pre><code>npm install jsut -g
</code></pre>

<p>Of course, with the goals for JSUT, you can also just download and copy deploy JSUT. Visit <a href="http://github.com/havard/jsut">http://github.com/havard/jsut</a> for source code and further instructions.</p>

<h2>Requirements</h2>

<p>As mentioned in the above sample, the only requirement JSUT imposes on you is to call <code>test.done()</code> when your test is done. Obviously, this seems redundant for the simple case of a synchronously executing function, but since most JavaScript functions these days are asynchronous at some level, there has to be a way to tell JSUT that a test is done. I am actively considering easing this requirement for simple cases, but this has not been a priority so far.</p>

<p>For Node.js, you are required to add the functions you want to test to the <code>exports</code> of each test file. Building on the example above, you can maintain cross-platform compatibility by doing the following:</p>

<pre><code>if (typeof(exports) !== 'undefined') {
  exports.myTest = myTest;
}
</code></pre>

<p>This will add exports only if the <code>exports</code> variable is defined. Now, if you wanted to run your test in Node.js, you simply do:</p>

<pre><code>jsut -n test.js
</code></pre>

<p>This will run your test in Node.js. You are free to combine the <code>-n</code> and <code>-b</code> flags any way you like, so that you can target all required platforms with a single command.</p>

<h2>Assertions</h2>

<p>JSUT automatically injects a CommonJS compatible assert module in your browser tests, so you can write stuff like <code>assert.ok(true);</code> anywhere in your test.</p>

<h2>Planned features</h2>

<p>JSUT currently only runs browser tests on OS X. I plan to support Linux and Windows as soon as possible. Follow <a href="http://github.com/havard">me</a> and <a href="http://github.com/havard/jsut">JSUT</a> on GitHub!</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/introducing-jsut-cross-platform-javascript-unit-testing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to combine Git, Windows, and non-ASCII letters</title>
		<link>http://ox.no/posts/how-to-combine-git-windows-and-non-ascii-letters</link>
		<comments>http://ox.no/posts/how-to-combine-git-windows-and-non-ascii-letters#comments</comments>
		<pubDate>Fri, 19 Aug 2011 21:56:13 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://ox.no/?p=324</guid>
		<description><![CDATA[The default Git installation in Windows works really bad if you&#8217;re using cmd.exe and have non-ASCII letters in your commit information and/or code. Thankfully, Git is highly configurable, and the fix is rather easy: Set i18n.commitencoding to the codepage you&#8217;re &#8230; <a href="http://ox.no/posts/how-to-combine-git-windows-and-non-ascii-letters">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The default Git installation in Windows works really bad if you&#8217;re using <code>cmd.exe</code> and have non-ASCII letters in your commit information and/or code.</p>

<p>Thankfully, Git is highly configurable, and the fix is rather easy:</p>

<ol>
<li>Set <code>i18n.commitencoding</code> to the codepage you&#8217;re on in <code>cmd.exe</code> (I&#8217;m on <code>windows-1252</code>)</li>
<li>Set <code>i18n.logoutputencoding</code> to the same codepage.</li>
<li>Set the <code>LESSCHARSET</code> environment variable to a proper name for the code page you&#8217;re on (I&#8217;m on <code>latin1</code>), either by:

<ul>
<li>Adding a user environment variable in <code>Control Panel &gt; System and Security &gt; System &gt; Advanced System Settings &gt; Advanced &gt; Environment Variables...</code>, or&#8230;</li>
<li>Setting it your <code>cmd.exe</code> session (e.g. <code>set LESSCHARSET=latin1</code>)</li>
</ul></li>
</ol>

<p>Boilerplate version for your copy-paste convenience (replace encodings as necessary):</p>

<pre><code>git config --global i18n.commitencodig windows-1252
git config --global i18n.logoutputencoding windows-1252
set LESSCHARSET=latin1
</code></pre>

<p>The first setting tells Git how your commit messages, including your author information, are encoded. The second tells Git what encoding it should use when writing output from a command like <code>git log</code>. The third and final setting tells <code>less</code>, the pager that Git runs <code>git log</code> output through, what encoding to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/how-to-combine-git-windows-and-non-ascii-letters/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diffie-Hellman support in Node.js</title>
		<link>http://ox.no/posts/diffie-hellman-support-in-node-js</link>
		<comments>http://ox.no/posts/diffie-hellman-support-in-node-js#comments</comments>
		<pubDate>Tue, 10 May 2011 11:43:07 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ox.no/?p=302</guid>
		<description><![CDATA[Yay! My patch implementing support for Diffie-Hellman key exchange in Node.js has finally been merged into the Node.js master branch. This will simplify the OpenID for Node.js codebase a lot. It will also make the OpenID association phase run a &#8230; <a href="http://ox.no/posts/diffie-hellman-support-in-node-js">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yay! My patch implementing support for Diffie-Hellman key exchange in Node.js has finally been <a href="https://github.com/joyent/node/commit/9f0b1a9bc60f70b7c5c014743eb1edd69c36db76">merged into the Node.js master branch</a>. This will simplify the <a href="https://github.com/havard/node-openid">OpenID for Node.js</a> codebase a lot. It will also make the OpenID association phase run a lot faster, since the current code does Diffie-Hellman in Javascript while the Node.js crypto version does it all in native code using OpenSSL.</p>

<p>A brief API overview:</p>

<ul>
<li><code>crypto.createDiffieHellman(prime_length)</code>

<ul>
<li>Creates a Diffie-Hellman key exchange object and generates a prime of the given bit length. The generator used is <code>2</code>.</li>
</ul></li>
<li><code>crypto.createDiffieHellman(prime, encoding='binary')</code>

<ul>
<li>Creates a Diffie-Hellman key exchange object using the supplied prime. The generator used is <code>2</code>. Encoding can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.generateKeys(encoding='binary')</code>

<ul>
<li>Generates private and public Diffie-Hellman key values, and returns the public key in the specified encoding. This key should be transferred to the other party. Encoding can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.computeSecret(other_public_key, input_encoding='binary', output_encoding=input_encoding)</code>

<ul>
<li>Computes the shared secret using <code>other_public_key</code> as the other party&#8217;s public key and returns the computed shared secret. Supplied key is interpreted using specified <code>input_encoding</code>, and secret is encoded using specified <code>output_encoding</code>. Encodings can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>. If no output encoding is given, the input encoding is used as output encoding.</li>
</ul></li>
<li><code>diffieHellman.getPrime(encoding='binary')</code>

<ul>
<li>Returns the Diffie-Hellman prime in the specified encoding, which can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.getGenerator(encoding='binary')</code>

<ul>
<li>Returns the Diffie-Hellman prime in the specified encoding, which can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.getPublicKey(encoding='binary')</code>

<ul>
<li>Returns the Diffie-Hellman public key in the specified encoding, which can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.getPrivateKey(encoding='binary')</code>

<ul>
<li>Returns the Diffie-Hellman private key in the specified encoding, which can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.setPublicKey(public_key, encoding='binary')</code>

<ul>
<li>Sets the Diffie-Hellman public key. Key encoding can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
<li><code>diffieHellman.setPrivateKey(public_key, encoding='binary')</code>

<ul>
<li>Sets the Diffie-Hellman private key. Key encoding can be <code>'binary'</code>, <code>'hex'</code>, or <code>'base64'</code>.</li>
</ul></li>
</ul>

<p><strong>NOTE</strong>: The API is still subject to change.</p>

<p>I would appreciate getting a note if you actually do something useful with it. <img src='http://ox.no/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Play around with it and let me know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/diffie-hellman-support-in-node-js/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mocking HtmlHelper in ASP.NET MVC 2 and 3 using Moq</title>
		<link>http://ox.no/posts/mocking-htmlhelper-in-asp-net-mvc-2-and-3-using-moq</link>
		<comments>http://ox.no/posts/mocking-htmlhelper-in-asp-net-mvc-2-and-3-using-moq#comments</comments>
		<pubDate>Wed, 11 Aug 2010 08:51:39 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Mock]]></category>
		<category><![CDATA[Moq]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://ox.no/?p=226</guid>
		<description><![CDATA[Still having trouble mocking HtmlHelper? This is an update to my previous post on mocking HtmlHelper way back when ASP.NET MVC RC1 was released. Eric notified me through a comment on the post and a question on StackOverflow that the &#8230; <a href="http://ox.no/posts/mocking-htmlhelper-in-asp-net-mvc-2-and-3-using-moq">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Still having trouble mocking HtmlHelper? This is an update to <a href="http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq">my previous post on mocking HtmlHelper</a> way back when ASP.NET MVC RC1 was released. Eric notified me through <a href="http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq#comment-840">a comment</a> on the post and a <a href="http://stackoverflow.com/questions/3445770/missingmethodexception-thrown-when-trying-to-mock-htmlhelper-with-moq">question on StackOverflow</a> that the code for ASP.NET MVC RC1 did not work with ASP.NET MVC 2.  The code in this post should work with ASP.NET MVC 2 and ASP.NET MVC 3 Preview 1.</p>

<p><pre class="brush: csharp; ">

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
{
    Mock&lt;ViewContext&gt; mockViewContext = new Mock&lt;ViewContext&gt;(
        new ControllerContext(
            new Mock&lt;HttpContextBase&gt;().Object,
            new RouteData(),
            new Mock&lt;ControllerBase&gt;().Object),
        new Mock&lt;IView&gt;().Object,
        vd,
        new TempDataDictionary(),
        new Mock&lt;TextWriter&gt;().Object);
    var mockViewDataContainer = new Mock&lt;IViewDataContainer&gt;();
    mockViewDataContainer.Setup(v =&gt; v.ViewData)
        .Returns(vd);
    return new HtmlHelper(mockViewContext.Object,
                            mockViewDataContainer.Object);
}

</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/mocking-htmlhelper-in-asp-net-mvc-2-and-3-using-moq/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Copyable available on GitHub</title>
		<link>http://ox.no/posts/copyable-available-on-github</link>
		<comments>http://ox.no/posts/copyable-available-on-github#comments</comments>
		<pubDate>Thu, 10 Dec 2009 23:10:29 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[copyable]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://ox.no/?p=144</guid>
		<description><![CDATA[People actually download and use Copyable, and they tend to use it in scenarios I haven&#8217;t used it in. This results in bug reports and patch submissions. So far, these have been given to me by e-mail or by blog &#8230; <a href="http://ox.no/posts/copyable-available-on-github">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>People actually download and use Copyable, and they tend to use it in scenarios I haven&#8217;t used it in. This results in bug reports and patch submissions. So far, these have been given to me by e-mail or by blog comment, neither of which is a particularly great way of receiving them. So after receiving another one today, I finally got around to putting Copyable on <a href="http://github.com">GitHub</a>.</p>

<p>The version I put up includes several enhancements from the latest release:</p>

<ul>
<li>It uses <code>FormatterServices.GetUninitializedObject</code> and hence does not depend on a parameterless constructor or custom instance provider (but you can of course still create an instance provider if you want to control object initialization)</li>
<li>The bug with copy semantics for already visited objects submitted by Walter Oesch has been fixed</li>
<li>The bug with inherited fields found by Alex, and the patch submitted for it, has been incorporated</li>
</ul>

<p>Bleeding edge Copyable can be found at <a href="http://github.com/havard/copyable">http://github.com/havard/copyable</a>. The clone URL is <a href="git://github.com/havard/copyable.git">git://github.com/havard/copyable.git</a>. Now go fix your own bugs! Or even better, enhance the framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/copyable-available-on-github/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Minimalistic MapReduce in .NET 4.0 with the new Task Parallel Library (TPL)</title>
		<link>http://ox.no/posts/minimalistic-mapreduce-in-net-4-0-with-the-new-task-parallel-library-tpl</link>
		<comments>http://ox.no/posts/minimalistic-mapreduce-in-net-4-0-with-the-new-task-parallel-library-tpl#comments</comments>
		<pubDate>Tue, 03 Nov 2009 22:58:52 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[.NET 4.0]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[TPL]]></category>

		<guid isPermaLink="false">http://ox.no/?p=119</guid>
		<description><![CDATA[Among the news in .NET 4.0 are several additions by the Parallel Computing Platform Team. As I wandered through the documentation of the Task library with cloud computing and parallelism buzz in the back of my head, I got the &#8230; <a href="http://ox.no/posts/minimalistic-mapreduce-in-net-4-0-with-the-new-task-parallel-library-tpl">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Among the news in .NET 4.0 are several additions by the <a href="http://blogs.msdn.com/pfxteam/">Parallel Computing Platform Team</a>. As I wandered through the documentation of the Task library with cloud computing and parallelism buzz in the back of my head, I got the idea of using tasks to create a minimalistic MapReduce. Here&#8217;s the result, a rather crude and simple, but efficient MapReduce for you to play with and utilize!</p>

<!-- more -->

<h2>What is MapReduce?</h2>

<p>For those of you who don&#8217;t know what MapReduce is: MapReduce is a simplified interface for parallel data processing. MapReduce was initially described by the Google engineers Jeffrey Dean and Sanjay Ghemawat in the 2004 paper titled <a href="http://labs.google.com/papers/mapreduce.html">MapReduce: Simplified data processing on large clusters</a>.</p>

<p>MapReduce processes data by splitting the processing in to a set of transformations (in functional programming, this is called the &#8220;map&#8221; function (it maps or transforms an input to an output)). The results of the transformations are then combined into a single result (in functional programming, this is called the &#8220;reduce&#8221; function (it reduces a set of values to a single value)). On a sidenote, Linq has equivalent functions, but the names are different, presumably to make them more familiar to people with SQL knowledge. In Linq, map is called <code>Select</code>, and reduce is called <code>Aggregate</code>.</p>

<p>Shortly put, to process a huge set of data, you split the data into chunks and process each chunk in parallel. This eventually creates a new set of intermediary results, which is reduced to a single result.</p>

<h2>Implementing a minimalistic MapReduce in .NET 4.0</h2>

<p>The signature of my MapReduce function is
<pre class="brush: csharp; ">

static Task&lt;TResult&gt; Start&lt;TInput, TPartial, TResult&gt;(
  Func&lt;TInput, TPartial&gt; map, 
  Func&lt;TPartial[], TResult&gt; reduce, 
  params TInput[] inputs);&lt;/pre&gt;

</pre></p>

<p>In other words, to start a MapReduce run, you supply a <code>map</code> function, a <code>reduce</code> function, and a set of inputs. Each input will be turned into an intermediate result (of type <code>TPartial</code>). Inputs are transformed concurrently. When all inputs are transformed, the <code>reduce</code> function is called to transform the partial results into a final result (of type <code>TResult</code>). Cool!</p>

<p>The map part is implemented by starting a task for each supplied input using <code>Task.Factory.StartNew()</code>.</p>

<p><pre class="brush: csharp; ">

Task.Factory.StartNew(() =&gt; map(input));

</pre></p>

<p>The reduce part is implemented as a <a href="http://en.wikipedia.org/wiki/Continuation">continuation</a> of all the map tasks, meaning that the reduce task waits for all the map tasks to complete, and then executes. This is achieved using <code>Task.Factory.ContinueWhenAll</code>.</p>

<p><pre class="brush: csharp; ">

Task.Factory.ContinueWhenAll(
  mapTasks, 
  tasks =&gt; PerformReduce(reduce, tasks));

</pre></p>

<p>As you can see, the implementation is minimalistic and simple, and usage is likewise.</p>

<p>Here&#8217;s a simple example using MapReduce to calculate the <a href="http://en.wikipedia.org/wiki/Root_mean_square">root mean square (MSE)</a> of a set of values:
<pre class="brush: csharp; ">

var task = MapReduce.Start&lt;int, int, double&gt;(
  i =&gt; i * i,
  s =&gt; Math.Sqrt(s.Aggregate((a, b) =&gt; a + b) / 5),
  1, 2, 3, 4, 5);
// Wait for result
task.Wait();
// Prints 3.3166...
Console.WriteLine(task.Result);

</pre></p>

<p>Actual applications of MapReduce are of course far more interesting than this simple example.</p>

<h2>Applications of MapReduce</h2>

<p>MapReduce can essentially be applied to any problem where you need a number of things to be done in parallel. It can even be applied in cases where you don&#8217;t need a final result. Just return an arbitrary value as the result (or even better, implement a variant of my MapReduce which uses <code>Action&lt;T&gt;</code>).</p>

<p>A few obvious use cases:</p>

<ul>
<li>Distributed search</li>
<li>Distributed sort</li>
<li>Tokenization</li>
<li>Indexing</li>
<li>Log processing</li>
<li>Machine learning</li>
<li>General artificial intelligence</li>
<li>General data mining</li>
<li>Large scale image processing</li>
<li>&#8230;</li>
</ul>

<p>The list goes on and on, these are just a few things off the top of my head.</p>

<p>You can grab the <a href="http://ox.no/files/MapReduce.cs">source code for MapReduce here</a>. Since this is done in .NET 4.0, it requires Visual Studio 2010 Beta 2 or later.</p>

<p>As usual, play around with it, have fun, and let me know if you find it useful!</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/minimalistic-mapreduce-in-net-4-0-with-the-new-task-parallel-library-tpl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSA using BouncyCastle</title>
		<link>http://ox.no/posts/rsa-using-bouncycastle</link>
		<comments>http://ox.no/posts/rsa-using-bouncycastle#comments</comments>
		<pubDate>Thu, 19 Mar 2009 06:44:51 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[decryption]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[rsa]]></category>

		<guid isPermaLink="false">http://ox.no/?p=80</guid>
		<description><![CDATA[Trying to do RSA using BouncyCastle, but struggling to find your way around the API? In a previous post (see here) I pondered why the RSA implementation in System.Security.Cryptography is restricted to only the most common usage scenarios. I mentioned &#8230; <a href="http://ox.no/posts/rsa-using-bouncycastle">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Trying to do RSA using BouncyCastle, but struggling to find your way around the API? In a previous post (see <a href="/posts/why-cripple-the-net-rsa-implementation">here</a>) I pondered why the RSA implementation in <code>System.Security.Cryptography</code> is restricted to only the most common usage scenarios. I mentioned <a href="http://bouncycastle.org">BouncyCastle</a> as an alternative for those who wanted a more flexible API, but never got around to providing examples where BouncyCastle was used. By request, this post provides usage examples by building a crude and simple, but efficient set of methods for RSA key generation, encryption, and decryption, all built on top of BouncyCastle.</p>

<p><strong>NOTE</strong>: The general cryptographical security of the presented method is beyond the scope of the article. The code presented is not cryptographically secure for large data sets. If you&#8217;re here looking for a way to do cryptographically secure RSA in the general case, you should look into more complicated approaches including padding, blinding, and more sophisticated block cipher modes. Cryptography is a topic undergoing constant research, so stay up to date and be sure to evaluate the strength of your solution for the scenarios in which you apply it.</p>

<!-- more -->

<p>BouncyCastle provides flexibility and control over your encryption approach, which comes at a cost. The BouncyCastle API might be a bit hard to cope with at first, but if you know encryption in general you should be able to find your way around the API without too much effort. This post will be focusing on RSA, since that was my original need, but it should be mentioned that BouncyCastle provides many other asymmetric (and symmetric) algorithms for which the usage is similar to what you find below.</p>

<h2>Creating RSA keys</h2>

<p>Creating RSA keys is a simple task. The method below lets you specify the key size in bits, and creates a key pair for you.</p>

<p><pre class="brush: csharp; ">

public AsymmetricCipherKeyPair GenerateKeys(int keySizeInBits)
{
  RsaKeyPairGenerator r = new RsaKeyPairGenerator();
  r.Init(new KeyGenerationParameters(new SecureRandom(),
    keySizeInBits));
  AsymmetricCipherKeyPair keys = r.GenerateKeyPair();
  return keys;
}

</pre></p>

<p>That&#8217;s all there is to it.</p>

<h2>Encryption</h2>

<p>Now that we have a key pair, we are ready to encrypt and decrypt using RSA. In the example below, we use a key (public or private) to encrypt a byte sequence. To encrypt a string, simply convert the string to a byte array using <code>Encoding.GetBytes</code>.</p>

<p><pre class="brush: csharp; ">

public byte[] Encrypt(byte[] data, AsymmetricKeyParameter key)
{
  RsaEngine e = new RsaEngine();
  e.Init(true, key);&lt;/p&gt;

&lt;p&gt;int blockSize = e.GetInputBlockSize();&lt;/p&gt;

&lt;p&gt;List&lt;byte&gt; output = new List&lt;byte&gt;();&lt;/p&gt;

&lt;p&gt;for (int chunkPosition = 0; chunkPosition &amp;lt; data.Length; 
    chunkPosition += blockSize)
  {
    int chunkSize = Math.Min(blockSize, data.Length - 
      (chunkPosition * blockSize));
    output.AddRange(e.ProcessBlock(data, chunkPosition,
      chunkSize));
  }
  return output.ToArray();
}

</pre></p>

<p>The approach above uses a list to gather output for the sake of simplicity. Note that the RSA engine can only process a limited block size at a time (block size depends on the key size). The approach above processes a data set of an arbitrary size.</p>

<p>The above method does not impose constraints on which key you use for encryption. Use the public key or the private key as you see fit for your solution.</p>

<h2>Decryption</h2>

<p>The <code>Decrypt</code> method is very similar to the <code>Encrypt</code> method:</p>

<p><pre class="brush: csharp; ">

public byte[] Decrypt(byte[] data, AsymmetricKeyParameter key)
{
  RsaEngine e = new RsaEngine();
  e.Init(false, key);&lt;/p&gt;

&lt;p&gt;int blockSize = e.GetInputBlockSize();&lt;/p&gt;

&lt;p&gt;List&lt;byte&gt; output = new List&lt;byte&gt;();&lt;/p&gt;

&lt;p&gt;for (int chunkPosition = 0; chunkPosition &amp;lt; data.Length;
    chunkPosition += blockSize)
  {
    int chunkSize = Math.Min(blockSize, data.Length - 
      (chunkPosition * blockSize));
    output.AddRange(e.ProcessBlock(data, chunkPosition,
      chunkSize));
  }
  return output.ToArray();
}

</pre></p>

<p>Again, it&#8217;s up to you which key you choose to use. If you want to use the common approach, encrypt using a symmetric cipher, hash the data, and sign the hash with your private key using the above <code>Encrypt</code> method. If you want to use another approach like encrypting the actual data using your private key, you are free to do so.</p>

<p>I hope this post helps those of you who want to apply RSA (or any other asymmetric cipher) to more subtle cases than those supported by the .NET framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/rsa-using-bouncycastle/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Mocking HtmlHelper in ASP.NET MVC RC1 using Moq</title>
		<link>http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq</link>
		<comments>http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq#comments</comments>
		<pubDate>Sun, 08 Mar 2009 17:15:13 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Mock]]></category>
		<category><![CDATA[Moq]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://ox.no/?p=65</guid>
		<description><![CDATA[For those of you trying to mock HtmlHelper, but finding it difficult, here&#8217;s a mock that works in ASP.NET MVC RC1. The ViewDataDictionary that is passed to the HtmlHelper can be empty, or made to contain the data you want &#8230; <a href="http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For those of you trying to mock HtmlHelper, but finding it difficult, here&#8217;s a mock that works in ASP.NET MVC RC1.</p>

<p><span id="more-65"></span></p>

<p>The <code>ViewDataDictionary</code> that is passed to the <code>HtmlHelper</code> can be empty, or made to contain the data you want for your test.</p>

<p><pre class="brush: csharp; ">

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
{
  var mockViewContext = new Mock&lt;ViewContext&gt;(
    new ControllerContext(
      new Mock&lt;HttpContextBase&gt;().Object,
      new RouteData(),
      new Mock&lt;ControllerBase&gt;().Object),
    new Mock&lt;IView&gt;().Object,
    vd,
    new TempDataDictionary());&lt;/p&gt;

&lt;p&gt;var mockViewDataContainer = new Mock&lt;IViewDataContainer&gt;();
  mockViewDataContainer.Setup(v =&gt; v.ViewData)
    .Returns(vd);&lt;/p&gt;

&lt;p&gt;return new HtmlHelper(mockViewContext.Object, 
    mockViewDataContainer.Object);
}

</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/mocking-htmlhelper-in-aspnet-mvc-rc1-using-moq/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Why cripple the .NET RSA implementation?</title>
		<link>http://ox.no/posts/why-cripple-the-net-rsa-implementation</link>
		<comments>http://ox.no/posts/why-cripple-the-net-rsa-implementation#comments</comments>
		<pubDate>Thu, 04 Dec 2008 20:45:10 +0000</pubDate>
		<dc:creator>Håvard</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://ox.no/?p=19</guid>
		<description><![CDATA[I just found out that RSACryptoServiceProvider, the RSA implementation in .NET, does not allow you to use a private key to encrypt data. I&#8217;m no cryptographic expert, but I do know how asymmetric key algorithms like RSA work, and that &#8230; <a href="http://ox.no/posts/why-cripple-the-net-rsa-implementation">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I just found out that <code>RSACryptoServiceProvider</code>, the RSA implementation in .NET, does not allow you to use a private key to encrypt data. I&#8217;m no cryptographic expert, but I do know how asymmetric key algorithms like RSA work, and that you can use a private key for encryption. That&#8217;s how signing works. But why cripple the implementation and limit it to just signing?</p>

<!-- more -->

<p>The rationale is in the common application of public-key cryptography, where:</p>

<ul>
<li>Encrypting with the public key ensures <em>confidentiality</em>, i.e. the process known as encryption in common tongue. Encrypting with a public key ensures that only the entity in possession of the private key can read the data.</li>
<li>Encrypting with the private key ensures <em>authenticity</em>, i.e. the process known as signing in common tongue. There is no need to encrypt the entire data stream to ensure authenticity, so the common approach is to calculate a hash of the data and sign the hash instead.</li>
</ul>

<p>To facilitate these patterns, the .NET public-key cryptography API is designed so that:</p>

<ul>
<li><code>Encrypt()</code> encrypts with a public key, <code>Decrypt()</code> requires a private key.</li>
<li><code>SignData()</code> encrypts with a private key, but since that implies a signature, one must provide a hashing algorithm and a private key. <code>VerifyData()</code> uses a public key.</li>
</ul>

<p>But I want to encrypt with my private key! Yes, this is what <code>SignData()</code> does, but it does so to just the hash calculated by the provided hashing algorithm, since that is the de-facto approach for signing, and implementing my own <code>HashAlgorithm</code> that passes in all the data is just wrong.</p>

<p>OK, these are the common uses, but why limit the API to that? There is no limitation in the RSA algorithm to my knowledge that prevents other uses than the two offered by <code>RSACryptoServiceProvider</code>. In fact, if I wanted to perform the traditional signing approach, I could just hash the data myself and encrypt it with my private key myself. Or even better, <code>SignData()</code> could be available to help me <em>for convenience</em>.</p>

<p>So, how do you apply RSA in .NET in an uncommon manner? Don&#8217;t use .NET&#8217;s cryptography API, but embrace an open source alternatives like <a href="http://bouncycastle.org">BouncyCastle</a>, which saves your day.</p>
]]></content:encoded>
			<wfw:commentRss>http://ox.no/posts/why-cripple-the-net-rsa-implementation/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

