<?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>Serious Technobabble</title>
	<atom:link href="http://blog.istepaniuk.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.istepaniuk.com</link>
	<description>Iván Stepaniuk&#039;s blog about software craftsmanship</description>
	<lastBuildDate>Wed, 27 Mar 2013 12:37:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>LINQ to SQL pitfalls: Nullable types</title>
		<link>http://blog.istepaniuk.com/linq-to-sql-nullable-types-null-comparison/</link>
		<comments>http://blog.istepaniuk.com/linq-to-sql-nullable-types-null-comparison/#comments</comments>
		<pubDate>Sat, 29 Dec 2012 17:52:17 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[LINQ to SQL]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=344</guid>
		<description><![CDATA[Nullable booleans and comparisons Testing if a nullable boolean is true is quite simple in C#, there are many ways, sorted here in my preference order. bool? nullableBool = true; var option1 = nullableBool == true; var option2 = nullableBool.Equals&#40;true&#41; &#8230; <a href="http://blog.istepaniuk.com/linq-to-sql-nullable-types-null-comparison/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h2>Nullable booleans and comparisons</h2>
<p>Testing if a nullable boolean is <em>true</em> is quite simple in C#, there are many ways, sorted here in my preference order.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1"><span class="kw4">bool</span><span class="sy0">?</span> nullableBool <span class="sy0">=</span> <span class="kw1">true</span><span class="sy0">;</span>
<span class="kw1">var</span> option1 <span class="sy0">=</span> nullableBool <span class="sy0">==</span> <span class="kw1">true</span><span class="sy0">;</span>
<span class="kw1">var</span> option2 <span class="sy0">=</span> nullableBool<span class="sy0">.</span><span class="me1">Equals</span><span class="br0">&#40;</span><span class="kw1">true</span><span class="br0">&#41;</span>
<span class="kw1">var</span> option3 <span class="sy0">=</span> nullableBool<span class="sy0">.</span><span class="me1">HasValue</span> <span class="sy0">&amp;&amp;</span> nullableBool<span class="sy0">.</span><span class="kw1">Value</span><span class="sy0">;</span>
<span class="kw1">var</span> option4 <span class="sy0">=</span> nullableBool <span class="sy0">??</span> <span class="kw1">false</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>All options return <em>true</em> in this case, <em>false</em> for <code>nullableBool = false;</code> and also <em>false</em> for <code>nullableBool = null;</code></p>
<p>However, when using this expressions is labmdas inside a LINQ to SQL projection <strong>they will behave differently!</strong> LINQ to SQL it is not smart enough to translate to T-SQL in a way that the current <strong>ANSI_NULLS</strong> setting does not affect the query result. To avoid <code>NULL = 1</code> comparisons, <strong>don&#8217;t use option1 or option2 there!</strong></p>
<h2>Huh? Please elaborate</h2>
<p>Consider a table in Microsoft SQL Server, with a <em>nullable</em> bit column, like this</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="br0">&#91;</span>dbo<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>Banana<span class="br0">&#93;</span> <span class="br0">&#40;</span>
 <span class="br0">&#91;</span>Id<span class="br0">&#93;</span> <span class="kw1">INT</span><span class="sy0">,</span>
 <span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span> bit <span class="kw1">NULL</span><span class="sy0">,</span>
<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>I will not get into whether you should have <em>bit NULL</em> columns or not (you probably shouldn&#8217;t) but if you do, and you are using LINQ to SQL to query your RDBMS, your generated <strong><em>Banana</em></strong> entity will have an<em><strong> IsYellow</strong></em> property, of  <strong><em>bool? </em></strong>C#type<strong><em>. </em></strong>Makes sense!<strong><em><br />
</em></strong></p>
<p>The following simplified code, though a little bit pointless in this case, is a perfectly valid situation if you wanted to avoid a <em>nullable</em> in your DTO, or you are projecting a boolean for any other reason.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1">ctx<span class="sy0">.</span><span class="me1">Bananas</span><span class="sy0">.</span><span class="kw1">Select</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> <span class="kw3">new</span> 
                      <span class="br0">&#123;</span> 
                          Id <span class="sy0">=</span> x<span class="sy0">.</span><span class="me1">Id</span>,
                          IsYellow <span class="sy0">=</span> x<span class="sy0">.</span><span class="me1">IsYellow</span> <span class="sy0">==</span> <span class="kw1">true</span>
                      <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>&#8230; but it will generate the following <strong>ANSI_NULL OFF</strong> dependent T-SQL code:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">SELECT</span> <span class="br0">&#91;</span>t0<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>Id<span class="br0">&#93;</span><span class="sy0">,</span> 
    <span class="br0">&#40;</span><span class="kw1">CASE</span> 
        <span class="kw1">WHEN</span> <span class="br0">&#91;</span>t0<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span> <span class="sy0">=</span> @p0 <span class="kw1">THEN</span> <span class="nu0">1</span>
        <span class="kw1">WHEN</span> <span class="kw1">NOT</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>t0<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span> <span class="sy0">=</span> @p0<span class="br0">&#41;</span> <span class="kw1">THEN</span> <span class="nu0">0</span>
        <span class="kw1">ELSE</span> <span class="kw1">NULL</span>
     <span class="kw1">END</span><span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span>
<span class="kw1">FROM</span> <span class="br0">&#91;</span>Banana<span class="br0">&#93;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span>t0<span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>If there are any rows with NULL IsYelow, this code will will generate an &#8220;<code>InvalidOperationException: The null value cannot be assigned to a member with type System.Boolean which is a non-nullable value type.</code>&#8221; This happens because the  CASE will fall through the ELSE clause for any NULL value, thus returning a NULL in the result set, unasignable to our regular non-nullable boolean.</p>
<p>Note that the condition <code>[t0].[IsYellow] = @p0, </code>where <em>@p0</em> is <em>true</em> and <em>[IsYellow]</em> is <em>NULL</em>, is neither true nor false according to the SQL 92 standard, this is the behavior when <strong> ANSI_NULLS</strong> are are set to <strong>ON</strong>, wich is the default and will be actually forced ON in next versions of the MS SQL Server.</p>
<p>The last option will work as expected. For example:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1">ctx<span class="sy0">.</span><span class="me1">Bananas</span><span class="sy0">.</span><span class="kw1">Select</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> <span class="kw3">new</span> 
                      <span class="br0">&#123;</span> 
                          Id <span class="sy0">=</span> x<span class="sy0">.</span><span class="me1">Id</span>,
                          IsYellow <span class="sy0">=</span> x<span class="sy0">.</span><span class="me1">IsYellow</span> <span class="sy0">??</span> <span class="kw1">false</span>
                      <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Would generate a safer NULL checking T-SQL code, like:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="sql"><pre class="de1"><span class="kw1">SELECT</span> <span class="br0">&#91;</span>t0<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>Id<span class="br0">&#93;</span><span class="sy0">,</span> <span class="kw1">COALESCE</span><span class="br0">&#40;</span><span class="br0">&#91;</span>t0<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span><span class="sy0">,</span>@p0<span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span>IsYellow<span class="br0">&#93;</span>
<span class="kw1">FROM</span> <span class="br0">&#91;</span>Banana<span class="br0">&#93;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span>t0<span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>You may also want to read:</p>
<ul>
<li><a title="The SET ANSI_NULLS Reference in the MSDN" href="http://msdn.microsoft.com/en-us/library/ms188048.aspx" target="_blank">The SET ANSI_NULLS Reference in the MSDN</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/linq-to-sql-nullable-types-null-comparison/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Coding Dojos Are Great</title>
		<link>http://blog.istepaniuk.com/coding-dojos-are-great/</link>
		<comments>http://blog.istepaniuk.com/coding-dojos-are-great/#comments</comments>
		<pubDate>Sun, 23 Dec 2012 20:05:54 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Idle]]></category>
		<category><![CDATA[dojo]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=318</guid>
		<description><![CDATA[In 2012 I had the chance to participate in around dozen Coding Dojos. A Coding Dojo is, according to the codingdojo.org website: &#8230; a meeting where a bunch of coders get together to work on a programming challenge. They are &#8230; <a href="http://blog.istepaniuk.com/coding-dojos-are-great/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>In 2012 I had the chance to participate in around dozen Coding Dojos. A Coding Dojo is, according to the <a title="What Is a Coding Dojo?" href="http://codingdojo.org/cgi-bin/wiki.pl?WhatIsCodingDojo" target="_blank">codingdojo.org</a> website:</p>
<blockquote><p>&#8230; a meeting where a bunch of coders get together to work on a programming challenge. They are there have fun and to engage in Deliberate Practice <span style="text-decoration: underline;">in order to improve their skills.</span></p></blockquote>
<p>And <strong>it works. </strong>It&#8217;s an amazing way to learn and reinforce best practices, and to share.</p>
<p>If you have not yet, go search when is the next coding dojo in your community, or organize yours!<br />
<a href="http://blog.istepaniuk.com/coding-dojos-are-great/dojo4/" rel="attachment wp-att-332"><img class="size-full wp-image-332 alignnone" style="margin-top: 10px; margin-bottom: 10px;" alt="dojo4" src="http://blog.istepaniuk.com/wp-content/uploads/dojo4.jpeg" width="600" height="150" /></a><a href="http://blog.istepaniuk.com/coding-dojos-are-great/dojo1/" rel="attachment wp-att-335"><img class="size-full wp-image-335 alignnone" style="margin-top: 10px; margin-bottom: 10px;" alt="dojo1" src="http://blog.istepaniuk.com/wp-content/uploads/dojo1.jpeg" width="600" height="150" /></a><br />
<a href="http://blog.istepaniuk.com/coding-dojos-are-great/dojo2/" rel="attachment wp-att-334"><img class="size-full wp-image-334 alignnone" style="margin-top: 10px; margin-bottom: 10px;" alt="dojo2" src="http://blog.istepaniuk.com/wp-content/uploads/dojo2.jpeg" width="600" height="150" /></a></p>
<blockquote>
<h2>Not only individuals and interactions,<br />
but also a community of professionals.</h2>
<p>&nbsp;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/coding-dojos-are-great/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FluentAssertions</title>
		<link>http://blog.istepaniuk.com/fluentassertions/</link>
		<comments>http://blog.istepaniuk.com/fluentassertions/#comments</comments>
		<pubDate>Sun, 23 Dec 2012 17:32:27 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent]]></category>
		<category><![CDATA[FluentAssertions]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=313</guid>
		<description><![CDATA[FluentAssertions is a set of .NET extension methods that allow you to more naturally specify the expected outcome of a TDD or BDD-style test. It is written by Dennis Doomen and Martin Opdam. For a quick overview, take a look &#8230; <a href="http://blog.istepaniuk.com/fluentassertions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fluentassertions.codeplex.com/" target="_blank">FluentAssertions</a> is a set of .NET extension methods that allow you to more naturally specify the expected outcome of a TDD or BDD-style test. It is written by <a href="http://www.dennisdoomen.net/" target="_blank">Dennis Doomen</a> and <a href="https://twitter.com/mpopdam" target="_blank">Martin Opdam</a>. For a quick overview, take a look at the <a href="http://fluentassertions.codeplex.com/documentation" target="_blank">documentation</a>.</p>
<h2>Fluent!</h2>
<p>FluentAssertions allows us to convert something like this:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1"><span class="br0">&#91;</span>Test<span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw4">void</span> ReturnsYellowForBananas<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
    <span class="kw1">var</span> service <span class="sy0">=</span> <span class="kw3">new</span> FruitColorService<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">var</span> result <span class="sy0">=</span> service<span class="sy0">.</span><span class="me1">GetColorOf</span><span class="br0">&#40;</span><span class="kw3">new</span> Banana<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    Assert<span class="sy0">.</span><span class="me1">AreEqual</span><span class="br0">&#40;</span>Color<span class="sy0">.</span><span class="me1">Yellow</span>, result<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Into something like this:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1"><span class="br0">&#91;</span>Test<span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw4">void</span> ReturnsYellowForBananas<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
    <span class="kw1">var</span> service <span class="sy0">=</span> <span class="kw3">new</span> FruitColorService<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">var</span> result <span class="sy0">=</span> service<span class="sy0">.</span><span class="me1">GetColorOf</span><span class="br0">&#40;</span><span class="kw3">new</span> Banana<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    result<span class="sy0">.</span><span class="me1">Should</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Be</span><span class="br0">&#40;</span>Color<span class="sy0">.</span><span class="me1">Yellow</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<h2>Exception checking</h2>
<p>It also allows for this kind of exception checking (here using the <em>Microsoft.Visual.Studio. UnitTesting</em> namespace instead of NUnit like in the previous examples):</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1"><span class="br0">&#91;</span>TestMethod<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span>ExpectedException<span class="br0">&#40;</span><span class="kw3">typeof</span><span class="br0">&#40;</span>InvalidFruitException<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw4">void</span> ThrowsAnExceptionIfItIsNotAFruit<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
    <span class="kw1">var</span> service <span class="sy0">=</span> <span class="kw3">new</span> FruitColorService<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">var</span> result <span class="sy0">=</span> service<span class="sy0">.</span><span class="me1">GetColorOf</span><span class="br0">&#40;</span><span class="kw3">new</span> Tomato<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>To become the following snippet. I preffer this way because it keeps the <em>arrange, act, assert</em> form:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1"><span class="br0">&#91;</span>TestMethod<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw4">void</span> ThrowsAnExceptionIfItIsNotAFruit<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
    <span class="kw1">var</span> service <span class="sy0">=</span> <span class="kw3">new</span> FruitColorService<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    Action action <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> service<span class="sy0">.</span><span class="me1">GetColorOf</span><span class="br0">&#40;</span><span class="kw3">new</span> Tomato<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    action<span class="sy0">.</span><span class="me1">ShouldThrow</span><span class="sy0">&lt;</span>InvalidFruitException<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>I preffer the FluentAssertions way, but note that NUnit also has it&#8217;s fluent API for this purpose, using <em>Assert.That</em> in this case. the last two lines would become:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="csharp"><pre class="de1">TestDelegate test <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> service<span class="sy0">.</span><span class="me1">GetColorOf</span><span class="br0">&#40;</span><span class="kw3">new</span> Tomato<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
Assert<span class="sy0">.</span><span class="me1">That</span><span class="br0">&#40;</span>test, Throws<span class="sy0">.</span><span class="me1">Exception</span>
      <span class="sy0">.</span><span class="kw3">TypeOf</span><span class="sy0">&lt;</span>InvalidFruitException<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<h2>When something goes wrong</h2>
<p>
In contrast to the Microsoft <em>TestTools.Assert</em>, both FluentAssertions and NUnit try hard to make the error message as clear as possible, when a test fails you certainly want to know what is happening and not just that it broke plus a meaningless line number. This is true specially if you are not on the IDE where you can just click-and-go to the ofending test, but reading a report from your <a target="_new" href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a> server. For the second test in this post, FluentAssertions would print out something like:
</p>
<pre>
Expected object to be Color [Yellow], but found Color [Green].
</pre>
<h2>Much more</h2>
<p>FluentAssertions has lots of usseful methods to work with DateTime, TimeSpan, Collections, String, etc. It became an essential tool in my everyday work, if you are into C#, give it a try!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/fluentassertions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thanks Agile Testing Days 2012!</title>
		<link>http://blog.istepaniuk.com/agile-testing-days-2012/</link>
		<comments>http://blog.istepaniuk.com/agile-testing-days-2012/#comments</comments>
		<pubDate>Thu, 29 Nov 2012 00:08:41 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[AgileTD]]></category>
		<category><![CDATA[bdd]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=299</guid>
		<description><![CDATA[It&#8217;s been less than a week since I came back from Berlin/Postdam from the best conference I attended this year, the Agile Testing Days. I co-presented a talk there with my colleague and friend Carlos Blé [thanks Carlos for proposing &#8230; <a href="http://blog.istepaniuk.com/agile-testing-days-2012/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s been less than a week since I came back from Berlin/Postdam from the best conference I attended this year, the <a title="Agile Testing Days conference" href="http://www.agiletestingdays.com/" target="_blank">Agile Testing Days</a>. I co-presented a talk there with my colleague and friend <a title="Carlos Blé on Twitter" href="https://twitter.com/carlosble" target="_blank">Carlos Blé</a> [thanks Carlos for proposing me this collaboration, it's always a pleasure to work together!], our talk was: <a title="Carlos Blé - Iván Stepaniuk: BDD with Javascript for Rich Internet Applications" href="http://www.agiletestingdays.com/program.php?p=46" target="_blank">BDD with Javascript for Rich Internet Applications</a>. We are very happy with the outcome of the talk, but most importantly I&#8217;m  very happy with the overall level of the conference, the speakers, attendees, and the organization.</p>
<div id="attachment_300" class="wp-caption alignnone" style="width: 507px"><a href="http://blog.istepaniuk.com/wp-content/uploads/agiletd.jpg"><img class="wp-image-300 " title="Agile Testing Days Conference Badge" alt="Agile Testing Days Conference Badge" src="http://blog.istepaniuk.com/wp-content/uploads/agiletd.jpg" width="497" height="516" /></a><p class="wp-caption-text">Nice badge to add to the collection of trophies (and yes, I did scramble the QR)</p></div>
<p>I&#8217;m also thankful to the people at <a href="http://www.diazhilterscheid.de/" target="_blank">Diaz &amp; Hilterscheid</a> who organized the event, <a href="http://www.linkedin.com/profile/view?id=133855245&amp;locale=de_DE&amp;trk=tyah" target="_blank">Madeleine Griep</a>! who we drove crazy with changes in the hotel reservation many times, <a href="http://www.linkedin.com/profile/view?id=114933330&amp;locale=de_DE&amp;trk=tyah2">Uwe Gelfert</a>, <a href="http://www.linkedin.com/profile/view?id=4748189&amp;locale=en_US&amp;trk=tyah">José Díaz</a>, and the <a title="Agile Testing Days official Twitter account" href="https://twitter.com/AgileTD" target="_blank">@AgileTD</a> team.</p>
<p>I had the chance to personally meet <a dir="ltr" href="https://twitter.com/lisacrispin">Lisa Crispin</a> and <a title="Gojko Adzic on Twitter" href="https://twitter.com/gojkoadzic " target="_blank">Gojko Adzic</a> on the speaker&#8217;s dinner and during the conference. Lisa is one of the authors of the book <a title="Agile Testing-A Practical Guide for Testers and Agile Teams" href="www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468" target="_blank">Agile Testing</a>, we also had the honor of having her at the front row in our talk! It&#8217;s good to put faces to the books we read :-)</p>
<h2>Test Lab Rats</h2>
<div id="attachment_302" class="wp-caption alignnone" style="width: 577px"><a href="http://blog.istepaniuk.com/wp-content/uploads/2012-11-21-16.10.46.jpg"><img class="wp-image-302 " title="The Test Lab" alt="The Test Lab" src="http://blog.istepaniuk.com/wp-content/uploads/2012-11-21-16.10.46.jpg" width="567" height="425" /></a><p class="wp-caption-text">From the left: Iván Stepaniuk, James Lyndsay, Carlos Blé, Bart Knaack.</p></div>
<p><a title="James Lyndsay on Twitter" href="https://twitter.com/workroomprds " target="_blank">James Lyndsay</a> and <a title="Bart Knaak on Twitter" href="https://twitter.com/Btknaack " target="_blank">Bart Knaack</a> where on the <a title="TestLab in the AgileTD program" href="http://www.agiletestingdays.com/program.php?p=13" target="_blank">TestLab</a>, an amazing corner of the conference, totally hands-on where developers and testers shared their skills. Being a developer, it was really interesting to understand how professional testers work, sit with them and pair-test an application from a black-box perspective.  We also spent some time testing <a href="http://www.liveteamapp.com/" target="_blank">LiveTeamApp</a>, a team time management application developed using the BDD techniques for JavaScript we talked about in this conference.</p>
<p>It was a really intensive experience and there are still ideas and notes to go through, and lots of new people to stay in touch with.</p>
<p><strong>The call for papers for the next year is about to start, I hope to be there in 2013!</strong></p>
<h2>You may also want to read:</h2>
<ul>
<li><a href="http://www.carlosble.com/2012/11/agile-testing-days-2012-was-awesome/" target="_blank">Carlos Blé post: Agile Testing Days 2012 was awesome</a></li>
<li><a href="http://agiletips.blogspot.com.es/2012/11/agile-testing-days-2012-take-away.html" target="_blank">Ralph Jocham post: Agile Testing Days 2012 &#8211; Take Away </a></li>
<li><a href="http://www.agiletestingdays.com/program.php" target="_blank">The conference program</a></li>
<li><a href="http://kaverjody.com" target="_blank"><span><span>Xu Yi</span></span>:</a> <a href="http://letagilefly.com/post/2012/12/agile-testing-days-2012-takeaways-9249.html" target="_blank">http://letagilefly.com/post/2012/12/agile-testing-days-2012-takeaways-9249.html</a> (From where i&#8217;ve stolen some of this links!) :-)</li>
<li><a href="http://happytesting.wordpress.com/author/siggeb/">Sigge Birgisson</a>: <a href="http://happytesting.wordpress.com/2012/11/29/learnings-from-agile-testing-days-2012/">http://happytesting.wordpress.com/2012/11/29/learnings-from-agile-testing-days-2012/</a></li>
<li><a href="http://www.huibschoots.nl" target="_blank">Huib Schoots</a>: <a href="http://www.huibschoots.nl/wordpress/?page_id=297">http://www.huibschoots.nl/wordpress/?page_id=297</a></li>
<li><a href="http://www.blogger.com/profile/16788121025012029738">Reinder</a>: <a href="http://reinderotter.blogspot.fi/2012/11/pink-fluffy-unicorns-agile-testing-days.html">http://reinderotter.blogspot.fi/2012/11/pink-fluffy-unicorns-agile-testing-days.html</a></li>
<li><a href="http://ie.linkedin.com/in/augustoevangelisti" target="_blank">Augusto Evangelisti</a>: <a href="http://mysoftwarequality.wordpress.com/2012/11/24/did-we-get-it-all-wrong/">http://mysoftwarequality.wordpress.com/2012/11/24/did-we-get-it-all-wrong/</a></li>
<li><a href="http://www.serendipeddy.nl/author/admin/">Serendipeddy</a>: <a href="http://www.serendipeddy.nl/agiletd2012/">http://www.serendipeddy.nl/agiletd2012/</a></li>
<li><a href="http://herebesubtlety.squarespace.com/blog/author/herebesubtlety">Anne</a>: <a href="http://herebesubtlety.squarespace.com/blog/2012/11/28/conference-tweeting-or-what-is-up-with-that.html">http://herebesubtlety.squarespace.com/blog/2012/11/28/conference-tweeting-or-what-is-up-with-that.html</a></li>
<li><a href="http://www.simple-talk.com" target="_blank">Chris George</a>: <a href="http://www.simple-talk.com/blogs/2012/12/04/agile-testing-days-2012-my-first-conference/">http://www.simple-talk.com/blogs/2012/12/04/agile-testing-days-2012-my-first-conference/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/agile-testing-days-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LINQ to SQL and multiple aggregate columns</title>
		<link>http://blog.istepaniuk.com/linq-to-sql-and-multiple-aggregate-columns/</link>
		<comments>http://blog.istepaniuk.com/linq-to-sql-and-multiple-aggregate-columns/#comments</comments>
		<pubDate>Sun, 04 Nov 2012 21:35:28 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[LINQ to SQL]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=159</guid>
		<description><![CDATA[The following very simple T-SQL query will return the average value for all values in the Rating column: SELECT AVG&#40;Rating&#41; AS AvgRating FROM CarRating; Doing this in LINQ to SQL is quite trivial; The Average method returns the average from &#8230; <a href="http://blog.istepaniuk.com/linq-to-sql-and-multiple-aggregate-columns/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The following very simple T-SQL query will return the average value for all values in the <em>Rating</em> column:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="tsql"><pre class="de1"><span class="kw1">SELECT</span> <span class="kw2">AVG</span><span class="br0">&#40;</span>Rating<span class="br0">&#41;</span> <span class="kw1">AS</span> AvgRating <span class="kw1">FROM</span> CarRating;</pre></div></div></div></div></div></div></div>


<p>Doing this in LINQ to SQL is quite trivial; The <em>Average</em> method returns the average from the numeric sequence:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="javascript"><pre class="de1"> <span class="kw1">var</span> avgRating <span class="sy0">=</span> Ctx.<span class="me1">CarRatings</span>.<span class="me1">Select</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> x.<span class="me1">Rating</span><span class="br0">&#41;</span>.<span class="me1">Average</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<h2>The problem:</h2>
<p>In the following example, we select an additional aggregate to get the maximum value of the whole Rating column in addition to the average:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="tsql"><pre class="de1"><span class="kw1">SELECT</span> <span class="kw2">AVG</span><span class="br0">&#40;</span>Rating<span class="br0">&#41;</span> <span class="kw1">AS</span> Average, <span class="kw2">MAX</span><span class="br0">&#40;</span>Rating<span class="br0">&#41;</span> <span class="kw1">AS</span> Maximum <span class="kw1">FROM</span> CarRating;</pre></div></div></div></div></div></div></div>


<p>In this case however, writing a LINQ to SQL equivalent is not that easy, one option would be splitting the query in two LINQ sentences. This is the most readable way to express what we want (and I like that), but hits the database twice and in some circumstances, specially if your table is big, you may not be able to live with that.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="javascript"><pre class="de1"><span class="kw1">var</span> avgRating <span class="sy0">=</span> Ctx.<span class="me1">CarRatings</span>.<span class="me1">Select</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> x.<span class="me1">Rating</span><span class="br0">&#41;</span>.<span class="me1">Average</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">var</span> maxRating <span class="sy0">=</span> Ctx.<span class="me1">CarRatings</span>.<span class="me1">Select</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> x.<span class="me1">Rating</span><span class="br0">&#41;</span>.<span class="me1">Max</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Voila</span></pre></div></div></div></div></div></div></div>


<h2>The hack:</h2>
<p>I refused to believe that there is no -good- way to express this simple SQL sentence in LINQ to SQL without hitting the DB twice. The only solution I have found so far, and the intertubes seem to agree, is to use a <em>group by</em> clause in the sentence. You would say; <em>group by</em> what? Well&#8230; that&#8217;s exactly the problem, it does not really make any sense, but if you <em>group by</em> a constant (!)&#8230;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="javascript"><pre class="de1"><span class="kw1">var</span> ratings <span class="sy0">=</span> Ctx.<span class="me1">CarRatings</span>
                 .<span class="me1">GroupBy</span><span class="br0">&#40;</span>uselessConstant <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span>
                 .<span class="me1">Select</span><span class="br0">&#40;</span>r <span class="sy0">=&gt;</span> <span class="kw1">new</span>
                    <span class="br0">&#123;</span> 
                      Avg <span class="sy0">=</span> r.<span class="me1">Average</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> x.<span class="me1">Rating</span><span class="br0">&#41;</span><span class="sy0">,</span>
                      Max <span class="sy0">=</span> r.<span class="me1">Max</span><span class="br0">&#40;</span>x <span class="sy0">=&gt;</span> x.<span class="me1">Rating</span><span class="br0">&#41;</span>
                    <span class="br0">&#125;</span><span class="br0">&#41;</span>
                 .<span class="me1">FirstOrDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Voila (WTF!)</span></pre></div></div></div></div></div></div></div>


<p>This works, but remember that <em>good code is readable code</em>, naming the .GroupBy() lambda with something horrible like <em>uselessConstantThatAllowsSelectingTwo-AggregateColumnsWithoutHittingTheDbTwice</em>, is better that breaking the WTF-o-meter in a code-review or future maintenance. A comment may also be opportune in this case, perhaps even a link to this post ;)</p>
<p>Any comments or thoughts are welcome! Specially if you have a better way to solve this.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/linq-to-sql-and-multiple-aggregate-columns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using PhantomJS to make your AJAX web applications crawlable by Google</title>
		<link>http://blog.istepaniuk.com/phantomjs-to-make-your-ajax-web-crawlable-by-google/</link>
		<comments>http://blog.istepaniuk.com/phantomjs-to-make-your-ajax-web-crawlable-by-google/#comments</comments>
		<pubDate>Sun, 04 Nov 2012 10:44:30 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hijax]]></category>
		<category><![CDATA[PhantomJS]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=232</guid>
		<description><![CDATA[JavaScript is playing a stellar role in web development; However, the indexing mechanisms behind search engines such as Google or Bing do not execute JavaScript. Although they may try to follow JavaScript embedded URLs, this won&#8217;t prevent your JavaScript managed &#8230; <a href="http://blog.istepaniuk.com/phantomjs-to-make-your-ajax-web-crawlable-by-google/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>JavaScript is playing a stellar role in web development; However, the indexing mechanisms behind search engines such as Google or Bing do not execute JavaScript. Although they may try to follow JavaScript embedded URLs, this won&#8217;t prevent your JavaScript managed content to be hidden from the search engine, depending on your case, this could be a disaster from the SEO point of view.</p>
<h2>What about Hijax?</h2>
<p>This problem is not new; almost a decade ago, when JavaScript availability in the browser was something you could not rely on, an AJAX loaded content section would gracefully degrade and load as complete page if no JavaScript was at work, effectively solving the search engine problem a well. This technique was later called <a href="http://en.wikipedia.org/wiki/Hijax" target="_blank">Hijax</a>, and it requires your <em>backend</em> to be able to generate a full HTML version of what would have been otherwise rendered/composed on the browser.</p>
<p>If most of the HTML content is generated with the server-side tech (like in ASP.NET or PHP) I would still consider Hijax as an alternative, but if the content that you want indexed is served as JSON, XML, etc. and it never takes an HTML form until it is in the DOM, a hybrid Hijax-style solution would be expensive and complicated, let alone the case of using client-side templating engines like <a href="http://mustache.github.com/" target="_blank">mustache</a>, <a href="http://akdubya.github.com/dustjs/" target="_blank">dust.js</a>, <a href="http://handlebarsjs.com/" target="_blank">handlebars</a>, etc. This later case is the one we will talk about.</p>
<h2>The crawler requests</h2>
<p>Nowadays you can count that JavaScript will be there for you when the user loads the site, but what about the search engine crawlers? Fortunately, in 2009 <a href="https://developers.google.com/webmasters/ajax-crawling/docs/specification" target="_blank">Google defined a standard</a>, which latter Bing (and thus Yahoo) also supported in 2011. It basically defines a bidirectional mapping that is applied to every URL containing #!, allowing a link to:</p>
<pre>example.com/profile#!/jdoe</pre>
<p>To become a GET request for:</p>
<pre>example.com/profile?_escaped_fragment_=%2fjdoe</pre>
<p>That new URL is what the crawler will actually request when encountering and following a link with &#8216;#!&#8217; in the anchor fragment.  This solves an important part of the problem, but we still need to generate an HTML snapshot for the crawler to download, parse, and go on. How?&#8230;</p>
<h2>Generating content for the crawler</h2>
<p>The idea is to do for the crawler the job that it doesn&#8217;t want to do on it&#8217;s own, here is where <a href="http://phantomjs.org/" target="_blank">PhantomJS</a> comes in. <em>PhantomJS</em> is a full stack headless browser based on WebKit. Having a fast JavaScript enabled &#8220;browser&#8221; on the <em>backend</em> allows us to remap the Google bot request back to the #! format, and pass it to <em>PhantomJS</em>. The command-line process will return a nice HTML snapshot to the crawler, just as the users would see on their real browsers, and it will in turn contain more valid<em> #!</em> links to parse, convert and follow so the process goes on.</p>
<p><a href="http://blog.istepaniuk.com/wp-content/uploads/ajaxcrawl.jpg"><img class="wp-image-255 alignnone" title="Crawlable AJAX web using PhantomJS" src="http://blog.istepaniuk.com/wp-content/uploads/ajaxcrawl.jpg" alt="Crawlable AJAX web using PhantomJS" /></a></p>
<p>Depending on your JavaScript, generating a snapshot on the server-side is probably processor-intensive, but remember that it will only be used by the search engine crawlers, and that you will have absolute control over making a snapshot or just returning the cached HTML from a previous run, which will be actually really fast.</p>
<p>Note that any content meant to be indexed needs to be accessible through an <em>&lt;a&gt;</em> element with a proper #! formated href, otherwise it can not be followed by the crawler.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/phantomjs-to-make-your-ajax-web-crawlable-by-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of speakers at the Agile Testing Days 2012 conference, and their Twitter</title>
		<link>http://blog.istepaniuk.com/twitter-for-speakers-at-the-agile-testing-days-2012-conference/</link>
		<comments>http://blog.istepaniuk.com/twitter-for-speakers-at-the-agile-testing-days-2012-conference/#comments</comments>
		<pubDate>Sat, 03 Nov 2012 21:58:55 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[AgileTD]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=247</guid>
		<description><![CDATA[So! It is almost two weeks to go for the Agile Testing Days 2012 conference in Postdam/Berlin, Germany. The program looks awesome, there will be a lot of interesting talks and more than 70 speakers. Twitter is an awesome tool to keep &#8230; <a href="http://blog.istepaniuk.com/twitter-for-speakers-at-the-agile-testing-days-2012-conference/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>So! It is almost two weeks to go for the <a title="Agile Testing Days 2012" href="http://www.agiletestingdays.com/" target="_blank">Agile Testing Days 2012</a> conference in Postdam/Berlin, Germany. The <a title="AgileTD Program" href="http://www.agiletestingdays.com/program.php" target="_blank">program</a> looks awesome, there will be a lot of interesting talks and more than 70 speakers.</p>
<p>Twitter is an awesome tool to keep in touch with the Agile community (and any other IT related one), I just made a list with all the twitter handles of the people that will be speaking at the conference. There may be some mistakes and inaccuracies as the program has still some TBD entries, some may be wrong or missing altogether. If you spot a mistake please leave a comment!</p>
<table>
<tbody>
<tr>
<td>Alexander Schwartz</td>
<td><a class="twitter-follow-button" href="https://twitter.com/alexschwartzbln" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Alexander Tarnowski</td>
<td><a class="twitter-follow-button" href="https://twitter.com/alexander_tar" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Alexandra Schladebeck</td>
<td><a class="twitter-follow-button" href="https://twitter.com/alex_schl" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Andrea Provaglio</td>
<td><a class="twitter-follow-button" href="https://twitter.com/andreaprovaglio" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Andreas Grabner</td>
<td><a class="twitter-follow-button" href="https://twitter.com/grabnerandi" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Andreas Schliep</td>
<td><a class="twitter-follow-button" href="https://twitter.com/andreasschliep" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Arie van Bennekum</td>
<td><a class="twitter-follow-button" href="https://twitter.com/arievanbennekum" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Arjan Brands</td>
<td>?</td>
</tr>
<tr>
<td>Asaf Saar</td>
<td><a class="twitter-follow-button" href="https://twitter.com/saarasaf" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Bart Knaack</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Btknaack" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Carlos Blé</td>
<td><a class="twitter-follow-button" href="https://twitter.com/carlosble" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Cecile Davis</td>
<td><a class="twitter-follow-button" href="https://twitter.com/cecileAdavis" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Cirilo Wortel</td>
<td><a class="twitter-follow-button" href="https://twitter.com/sietstweets" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Clement Escoffier</td>
<td>?</td>
</tr>
<tr>
<td>Dani Almog</td>
<td>?</td>
</tr>
<tr>
<td>David Evans</td>
<td><a class="twitter-follow-button" href="https://twitter.com/DavidEvans66" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Dawn Haynes</td>
<td><a class="twitter-follow-button" href="https://twitter.com/DawnMHaynes" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Dominik Dary</td>
<td><a class="twitter-follow-button" href="https://twitter.com/DomeLG" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Eduard Kunce</td>
<td><a class="twitter-follow-button" href="https://twitter.com/ekunce" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Georg Hansbauer</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Testbirds" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Gitte Ottosen</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Godtesen" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Gojko Adzic</td>
<td><a class="twitter-follow-button" href="https://twitter.com/gojkoadzic" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Hartwig Schwier</td>
<td>?</td>
</tr>
<tr>
<td>Henrik Andersson</td>
<td><a class="twitter-follow-button" href="https://twitter.com/henkeandersson" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Huib Schoots</td>
<td><a class="twitter-follow-button" href="https://twitter.com/huibschoots" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Ilari Henrik Aegerter</td>
<td><a class="twitter-follow-button" href="https://twitter.com/ilarihenrik" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Iván Stepaniuk</td>
<td><a class="twitter-follow-button" href="https://twitter.com/istepaniuk" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>James Lyndsay</td>
<td><a class="twitter-follow-button" href="https://twitter.com/workroomprds" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Jana Noack</td>
<td>?</td>
</tr>
<tr>
<td>Janet Gregory</td>
<td><a class="twitter-follow-button" href="https://twitter.com/janetgregoryca" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Jan Jaap Cannegieter</td>
<td><a class="twitter-follow-button" href="https://twitter.com/jjcannegieter" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Jason Ayers</td>
<td><a class="twitter-follow-button" href="https://twitter.com/SimplyTalking" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Jean-Paul Varwijk</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Arborosa" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Jurgen Appelo</td>
<td><a class="twitter-follow-button" href="https://twitter.com/jurgenappelo" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Lasse Koskela</td>
<td><a class="twitter-follow-button" href="https://twitter.com/lassekoskela" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Leo van der Aalst</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Sogeti" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Lisa Crispin</td>
<td><a class="twitter-follow-button" href="https://twitter.com/lisacrispin" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Lloyd Roden</td>
<td>?</td>
</tr>
<tr>
<td>Mads Troels Hansen</td>
<td><a class="twitter-follow-button" href="https://twitter.com/madsth" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Markus Gärtner</td>
<td><a class="twitter-follow-button" href="https://twitter.com/mgaertne" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Matt Heusser</td>
<td><a class="twitter-follow-button" href="https://twitter.com/mheusser" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Meike Mertsch</td>
<td><a class="twitter-follow-button" href="https://twitter.com/meikemertsch" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Michael Hüttermann</td>
<td><a class="twitter-follow-button" href="https://twitter.com/huettermann" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Michael Minigshofer</td>
<td><a class="twitter-follow-button" href="https://twitter.com/MMinigshofer" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Michael Palotas</td>
<td><a class="twitter-follow-button" href="https://twitter.com/michael_palotas" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Mike Scott</td>
<td>?</td>
</tr>
<tr>
<td>Niels Malotaux</td>
<td><a class="twitter-follow-button" href="https://twitter.com/nielsmx" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Ola Ellnestam</td>
<td><a class="twitter-follow-button" href="https://twitter.com/ellnestam" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Oleksiy Shepetko</td>
<td>?</td>
</tr>
<tr>
<td>Patrick Kua</td>
<td><a class="twitter-follow-button" href="https://twitter.com/patkua" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Paul Gerrard</td>
<td><a class="twitter-follow-button" href="https://twitter.com/paul_gerrard" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Peter Varhol</td>
<td><a class="twitter-follow-button" href="https://twitter.com/pvarhol" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Peter Walen</td>
<td><a class="twitter-follow-button" href="https://twitter.com/PeteWalen" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Ralph Jocham</td>
<td><a class="twitter-follow-button" href="https://twitter.com/rjocham" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Ray Scott</td>
<td><a class="twitter-follow-button" href="https://twitter.com/GridTools" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Rik Teuben</td>
<td><a class="twitter-follow-button" href="https://twitter.com/Rteuben" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Scott Barber</td>
<td><a class="twitter-follow-button" href="https://twitter.com/sbarber" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Scott W. Ambler</td>
<td><a class="twitter-follow-button" href="https://twitter.com/scottwambler" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Sebastian Keller</td>
<td><a class="twitter-follow-button" href="https://twitter.com/se_keller" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Sigge Birgisson</td>
<td><a class="twitter-follow-button" href="https://twitter.com/siggeb" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Simon Morley</td>
<td><a class="twitter-follow-button" href="https://twitter.com/YorkyAbroad" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Stevan Zivanovic</td>
<td><a class="twitter-follow-button" href="https://twitter.com/stevanzivanovic" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Thomas Sundberg</td>
<td><a class="twitter-follow-button" href="https://twitter.com/thomassundberg" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Tom Roden</td>
<td><a class="twitter-follow-button" href="https://twitter.com/TommRoden" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Tony Bruce</td>
<td><a class="twitter-follow-button" href="https://twitter.com/tonybruce77" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Werner Lieblang</td>
<td><a class="twitter-follow-button" href="https://twitter.com/wernerlieblang" data-show-count="false">Follow</a></td>
</tr>
<tr>
<td>Zuzana Sochova</td>
<td><a class="twitter-follow-button" href="https://twitter.com/zuzuzka" data-show-count="false">Follow</a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/twitter-for-speakers-at-the-agile-testing-days-2012-conference/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Five Focusing Steps: Theory of Constraints</title>
		<link>http://blog.istepaniuk.com/five-focusing-steps-theory-of-constraints/</link>
		<comments>http://blog.istepaniuk.com/five-focusing-steps-theory-of-constraints/#comments</comments>
		<pubDate>Tue, 30 Oct 2012 16:13:47 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[CAS2012]]></category>
		<category><![CDATA[TOC]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=234</guid>
		<description><![CDATA[During the CAS2012 I had the chance to participate in a workshop by Masa K. Maeda on the five focusing steps of the Theory of Constraints. The part of the workshop I valued most was a completely hands-on game, and &#8230; <a href="http://blog.istepaniuk.com/five-focusing-steps-theory-of-constraints/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>During the <a title="Conferencia Agile Spain 2012" href="http://conferencia2012.agile-spain.org/" target="_blank">CAS2012 </a>I had the chance to participate in a workshop by <a title="Masa K. Maeda, PhD." href="https://twitter.com/masaKmaeda" target="_blank">Masa K. Maeda</a> on the five focusing steps of the <a href="http://en.wikipedia.org/wiki/Theory_of_constraints" target="_blank">Theory of Constraints</a>.</p>
<p>The part of the workshop I valued most was a completely hands-on game, and it was incredibly fun!, and it was an effective way to transmit how we can apply the TOC to understand and adjust our continuous improvement process in Agile teams.</p>
<p>TOC is based on the premise that the throughput of a goal-oriented system is limited by at least one constraint. Only by increasing flow through the constraint we can increase the overall throughput.</p>
<p>Assuming the goal of a system and its measurements have been defined, the five steps are:</p>
<ol>
<li><strong>Identify</strong> the system&#8217;s constraint that prevents the organization from obtaining  a higher throughput.</li>
<li><strong>Exploit</strong> the identified constraint to get the most out of it.</li>
<li><strong>Subordinate</strong> everything else to the above decision to support it.</li>
<li><strong>Elevate</strong> the system&#8217;s constraint making other major changes needed to break it.</li>
<li><strong>Repeat</strong> all the previous steps, do not allow inertia to cause a system&#8217;s constraint.</li>
</ol>
<p>The game consisted in 4 iterations of 260 seconds (representing a year of working days) in which each team of five people formed a production chain of paper airplanes. At the end of each iteration, we made changes to the production process based on the first four focusing steps, then we analyzed the production throughput. (in this case, how much money we have made selling good airplanes, or lost making bad or incomplete airplanes).</p>
<p><img class="alignleft size-full wp-image-240" title="Masa K. Maeda at the CAS2012 in Cáceres, Spain." src="http://blog.istepaniuk.com/wp-content/uploads/IMG_20121026_102704.jpg" alt="Masa K. Maeda at the CAS2012 in Cáceres, Spain." width="494" height="369" /></p>
<p>I am looking forward to try this out in our company soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/five-focusing-steps-theory-of-constraints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter is currently down for &lt;%= reason %&gt;.</title>
		<link>http://blog.istepaniuk.com/twitter-is-currently-down/</link>
		<comments>http://blog.istepaniuk.com/twitter-is-currently-down/#comments</comments>
		<pubDate>Thu, 26 Jul 2012 17:14:46 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Idle]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=208</guid>
		<description><![CDATA[&#8220;We expect to be back in &#60;%= deadline %&#62;. For more information, check out Twitter Status. Thanks foryour patience! Following today&#8217;s Azure outage and Google Talk being out of service, now Twitter is completely down. What is wrong with the intertubes &#8230; <a href="http://blog.istepaniuk.com/twitter-is-currently-down/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<div id="attachment_216" class="wp-caption alignleft" style="width: 317px"><a href="http://blog.istepaniuk.com/wp-content/uploads/leaking-pipe.jpg"><img class=" wp-image-216 " title="leaking pipe" src="http://blog.istepaniuk.com/wp-content/uploads/leaking-pipe-300x200.jpg" alt="&quot;Leaking Pipe&quot; By http://gayru.deviantart.com/" width="307" height="205" /></a><p class="wp-caption-text"><span style="color: #c0c0c0;">Leaking Pipe &#8211; By Gayru (gayru.deviantart.com) C.C. Attribution-Noncommercial-No Derivative Works 3.0</span></p></div>
<p><em><em>&#8220;We expect to be back in &lt;%= deadline %&gt;. For more information, check out <a href="http://status.twitter.com/">Twitter Status</a>. Thanks for</em>your patience!</em></p>
<p>Following today&#8217;s <a title="Windows Azure nodes in Europe are down" href="http://blog.istepaniuk.com/windows-azure-is-down/">Azure outage</a> and <a title="Google Talk out of service" href="http://www.zdnet.com/google-talk-down-and-out-in-google-im-voip-and-video-conferencing-7000001660/">Google Talk being out of service,</a> now Twitter is completely down. What is wrong with the <strong>intertubes</strong> today?!</p>
<p><a href="http://blog.istepaniuk.com/wp-content/uploads/Twitter-is-down.png"><img class="alignleft size-full wp-image-209" title="Twitter is down" src="http://blog.istepaniuk.com/wp-content/uploads/Twitter-is-down.png" alt="" width="773" height="426" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/twitter-is-currently-down/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows Azure nodes in Europe are down</title>
		<link>http://blog.istepaniuk.com/windows-azure-is-down/</link>
		<comments>http://blog.istepaniuk.com/windows-azure-is-down/#comments</comments>
		<pubDate>Thu, 26 Jul 2012 13:02:40 +0000</pubDate>
		<dc:creator>Iván Stepaniuk</dc:creator>
				<category><![CDATA[Idle]]></category>
		<category><![CDATA[azure]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.istepaniuk.com/?p=195</guid>
		<description><![CDATA[Since 11:09 AM UTC today, the compute nodes in  the Windows Azure Platform are not responding for the West-Europe region. According to Microsoft, they [...] are experiencing an availability issue in the West Europe sub-region, which impacts access to hosted &#8230; <a href="http://blog.istepaniuk.com/windows-azure-is-down/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Since 11:09 AM UTC today, the compute nodes in  the Windows Azure Platform are not responding for the West-Europe region.</p>
<p>According to Microsoft, they [...] <em>are experiencing an availability issue in the West Europe sub-region, which impacts access to hosted services in this region.</em> [...]</p>
<p>No technical explanation is provided on the site whatsoever.</p>
<p>More info at the <a title="Azure dashboard" href="http://www.windowsazure.com/en-us/support/service-dashboard/">Azure dashboard</a></p>
<p><strong>UPDATE:</strong><br />
Microsoft Reports that at 1:33 PM UTC &#8220;<em>The issue has been addressed&#8221;.</em></p>
<p>This is the second major outage in 2012 for the Windows Azure cloud as it was hit by downtime on Feb. 29th because of the &#8220;Leap Day&#8221; incident, triggered by a security certificate date with 29th Feb. on a date.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.istepaniuk.com/windows-azure-is-down/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Object Caching 3010/3010 objects using disk: basic

 Served from: blog.istepaniuk.com @ 2013-05-24 21:56:52 by W3 Total Cache -->