<?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>Innovatian Software &#187; Uncategorized</title>
	<atom:link href="http://innovatian.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://innovatian.com</link>
	<description></description>
	<lastBuildDate>Sat, 12 Nov 2011 16:40:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Fibonacci LINQ Sequence Generator</title>
		<link>http://innovatian.com/2010/04/fibonacci-linq-sequence-generator/</link>
		<comments>http://innovatian.com/2010/04/fibonacci-linq-sequence-generator/#comments</comments>
		<pubDate>Sat, 01 May 2010 00:24:19 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://innovatian.com/?p=410</guid>
		<description><![CDATA[I wanted to see what could be done with the Fibonacci sequence, but I didn&#8217;t have something that played nicely with LINQ. Here is my first cut: public static class Fibonacci { public static IEnumerable&#60;BigInteger&#62; Generate( int n ) { return Generate( (long) n ); } public static IEnumerable&#60;BigInteger&#62; Generate( long n ) { yield [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I wanted to see what could be done with the Fibonacci sequence, but I didn&#8217;t have something that played nicely with LINQ. Here is my first cut:</p>
<pre>public static class Fibonacci
{
    public static IEnumerable&lt;BigInteger&gt; Generate( int n )
    {
        return Generate( (long) n );
    }

    public static IEnumerable&lt;BigInteger&gt; Generate( long n )
    {
        yield return 1;
        if ( n == 1 )
        {
            yield break;
        }
        yield return 1;
        if ( n == 2 )
        {
            yield break;
        }

        BigInteger n1 = 1, n2 = 1;
        for ( BigInteger i = 3; i &lt;= n; i++ )
        {
            BigInteger n3 = n1 + n2;
            n1 = n2;
            n2 = n3;
            yield return n3;
        }
    }
}</pre>
<p>Then you can do all sorts of computations.</p>
<pre>// Sum all
Fibonacci.Generate( 144 ).Aggregate( BigInteger.Add ); // 1454489111232772683678306641952
// Average them (via extension method below)
Fibonacci.Generate( 144 ).Average(); // (10100618828005365858877129458, remainder 0, total 144)
</pre>
<p>But why <code>BigInteger</code>? When using <code>int</code>, the 46th Fibonacci number is the last capable of being represented; making the data type a <code>uint</code> gets us the 47th. When using <code>long</code>, the 92nd is the last with the and with <code>ulong</code> the 93rd. With the <code>BigInteger</code> implementation, I can generate the 250,000th in about four seconds! And I can go much higher. If .NET had shipped with a BigFloat class I would have tried using the closed form solution which we could use to calculate the series in parallel. Having to sort may negate the speedup, but any solutions that don&#8217;t require order might benefit well.</p>
<p>There is another problem with using <code>BigInteger</code>; I can&#8217;t return a BigFloat from an <code>.Average()</code> calculation and <code>BigInteger</code> doesn&#8217;t support any kind of fraction support other than modulo. I wonder how much work it would be to create a BogFloat based on <code>BigInteger</code>.</p>
<pre>public static class BigIntegerExtensions
{
    public static Tuple&lt;BigInteger, BigInteger, BigInteger&gt; Average( this IEnumerable&lt;BigInteger&gt; source )
    {
        BigInteger total = BigInteger.Zero;
        BigInteger elements = BigInteger.Zero;
        foreach ( BigInteger item in source )
        {
            total += item;
            elements += BigInteger.One;
        }
        BigInteger remainder;
        BigInteger average = BigInteger.DivRem( total, elements, out remainder );
        return new Tuple&lt;BigInteger, BigInteger, BigInteger&gt;( average, remainder, elements );
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2010/04/fibonacci-linq-sequence-generator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configuring a Kinesis Ergo Advantage</title>
		<link>http://innovatian.com/2010/04/configuring-a-kinesis-ergo-advantage/</link>
		<comments>http://innovatian.com/2010/04/configuring-a-kinesis-ergo-advantage/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 00:25:02 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://innovatian.com/?p=391</guid>
		<description><![CDATA[I had to reset my keyboard and I had forgotten the setup that I need to do in order to get it configured the way I like it. In case anyone else ever wants to set theirs up, here is mine: To disable tones used by Caps Lock, Keypad, and others, hold down Progrm and [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I had to reset my keyboard and I had forgotten the setup that I need to do in order to get it configured the way I like it. In case anyone else ever wants to set theirs up, here is mine:</p>
<ul>
<li>To disable tones used by Caps Lock, Keypad, and others, hold down Progrm and press the hyphen (-) key. Repeat to turn then back on.</li>
<li>To disable key click audio hold down Progrm and press the Backslash key (“\”) located just below the hyphen key)</li>
<li>Remapping embedded Insert key to top layer (This is critical for ReSharper):<br />
If you would like to remap the embedded Insert key to the top layer, follow these instructions:<br />
1). Turn Keypad On.<br />
2). Press and hold the Progrm key and tap F12 (LED&#8217;s on keyboard will flash rapidly).<br />
3). Press and release the &#8220;Insert&#8221; key (LED&#8217;s will slow down).<br />
6). Press and release the Keypad key.<br />
7). Press and release the Insert key again (LED&#8217;s will speed up).<br />
8). Exit by repeating step 2 (LED&#8217;s will stop flashing).</li>
<li>Hold &#8216;=&#8217; and press &#8216;w&#8217; in a text editor. Hold &#8216;=&#8217; and press &#8216;s&#8217; and you should see:<br />
v3.1[SL K H e ] or v3.2[SL K H e ]<br />
- Thumb key modifier keys are optimized for Windows<br />
- Keypad = is the same as Number row =<br />
- Scroll lock performs scroll lock action<br />
- Keyboard stays awake when computer sleeps setting is active<br />
- Fast mouse speed is set on</li>
</ul>
<p>You can use whatever macros you like, but this setup is most conducive to my workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2010/04/configuring-a-kinesis-ergo-advantage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS Shell Extension</title>
		<link>http://innovatian.com/2010/01/tfs-shell-extension/</link>
		<comments>http://innovatian.com/2010/01/tfs-shell-extension/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:36:15 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://innovatian.com/?p=226</guid>
		<description><![CDATA[If you are using the TFS Shell Extension and you get an error dialog when choosing Team Foundation Server -&#62; Reconnect &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; Unable to Reconnect &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; Unable to connect to Team Foundation Server &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; OK &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; There is a workaround. TFS extension only supports windows credentials at the moment, so if the server is using [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>If you are using the TFS Shell Extension and you get an error dialog when choosing Team Foundation Server -&gt; Reconnect</p>
<div id="_mcePaste">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<div id="_mcePaste">Unable to Reconnect</div>
<div id="_mcePaste">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<div id="_mcePaste">Unable to connect to Team Foundation Server</div>
<div id="_mcePaste">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<div id="_mcePaste">OK</div>
<div id="_mcePaste">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<p>There is a workaround. TFS extension only supports windows credentials at the moment, so if the server is using domain authentication, you can try to open your TFS server url in an IE window, enter your domain\user credentials and password. Now try try reconnect and you should be able to use the shell extension.</p>
<p>If you are using Windows 7, maybe Vista as well, you can use the Credential Manager in the Control Panel to manage the caching of this information without IE.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2010/01/tfs-shell-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running an elevated child process</title>
		<link>http://innovatian.com/2009/06/running-an-elevated-child-process-2/</link>
		<comments>http://innovatian.com/2009/06/running-an-elevated-child-process-2/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 23:57:53 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=97</guid>
		<description><![CDATA[If you ever need to run a child process in an elevated state, you can easily set the Verbs property on the ProcessStartInformation to &#8220;runas&#8221; and the child process will ask for permission when started. You need to watch out the the user denying access however as a Win32Exception will be thrown with its NativeErrorCode [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>If you ever need to run a child process in an elevated state, you can easily set the Verbs property on the ProcessStartInformation to &#8220;runas&#8221; and the child process will ask for permission when started. You need to watch out the the user denying access however as a Win32Exception will be thrown with its NativeErrorCode = 1223. Here is a simple example launching the admin command prompt.</p>
<pre>internal class Program
{
	private const int UserCanceled = 1223;

	private static void Main( string[] args )
	{
		var psInfo = new ProcessStartInfo
					 {
						 FileName = Environment.GetEnvironmentVariable (&quot;ComSpec&quot;),
						 UseShellExecute = true,
						 Verb = ( Environment.OSVersion.Version.Major &gt;= 6 ) ? &quot;runas&quot; : string.Empty
					 };

		try
		{
			Process process = Process.Start( psInfo );
			Console.WriteLine( &quot;Process has Id: {0}&quot;, process.Id );
			Console.WriteLine( &quot;Waiting for app to exit.&quot; );
			process.WaitForExit();
		}
		catch ( Win32Exception ex )
		{
			if ( ex.NativeErrorCode != UserCanceled )
			{
				throw;
			}
			// permission was denied.
			Console.WriteLine( &quot;The operation was canceled by the user.&quot; );
		}

		Console.WriteLine( &quot;App exited, press enter to exit.&quot; );
		Console.ReadLine();
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2009/06/running-an-elevated-child-process-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More on delay loading .Net assemblies</title>
		<link>http://innovatian.com/2009/06/more-on-delay-loading-net-assemblies-2/</link>
		<comments>http://innovatian.com/2009/06/more-on-delay-loading-net-assemblies-2/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 17:59:28 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=91</guid>
		<description><![CDATA[You can build off of the previous article and make dealing with the dual libraries much easier using an IoC container. Instead of building an interface that constantly has to check which code path to execute based on the current platform, you can load the services into an IoC container. Once you know what platform [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>You can build off of the <a href="http://disassembla.net/blog/?p=78">previous article</a> and make dealing with the dual libraries much easier using an IoC container. Instead of building an interface that constantly has to check which code path to execute based on the current platform, you can load the services into an IoC container. Once you know what platform you are on, you can reference the type forcing its assembly to be loaded into your current AppDomain (as shown previously). Once done, you can get the assembly through a few different ways and build up services with an IoC container.</p>
<p>You can use the assembly scanner in StructureMap, or other mechanisms in another container, to go through the assembly and build up services that you can run. If your platform specific assemblies reference a third contract definition assembly then you are in great shape. If not, you might use string resolution (container.Get(&#8220;MyService&#8221;)) to obtain the object and either duck type or reflection invoke its members.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2009/06/more-on-delay-loading-net-assemblies-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delay loading .Net assemblies</title>
		<link>http://innovatian.com/2009/06/delay-loading-net-assemblies/</link>
		<comments>http://innovatian.com/2009/06/delay-loading-net-assemblies/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 17:48:11 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=78</guid>
		<description><![CDATA[I had to figure out how to make an application run as its native type while loading only the proper dlls for that platform &#8211; when the application runs on x64, load only x64 assemblies so that the application will run fully as x64 and the same for x86. The answer is counterintuitive and not [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I had to figure out how to make an application run as its native type while loading only the proper dlls for that platform &#8211; when the application runs on x64, load only x64 assemblies so that the application will run fully as x64 and the same for x86. The answer is counterintuitive and not straightforward.</p>
<p>Below is an example application that exhibits this behavior. The Amd64Library.Foo is defined in an assembly compiled for x64; the Win32Library.Foo is similarly defined in an x86 assemly. The Loader application is compiled as &#8216;Any CPU&#8217; so it will load natively on either platform as long as we load the correct dependency assemblies. Remember that the using statement, is just a compiler hint and doesn&#8217;t effect the created MSIL application.</p>
<pre>#region Using Directives

using System;
using Win32Library;

#endregion

namespace LoaderApplication
{
    internal class Program
    {
        private static void Main( string[] args )
        {
            //RunLoadingBothAssemblies(); // will crash.
            RunLoadingOneAssembly();
            Console.ReadLine();
        }

        private static void RunLoadingBothAssemblies()
        {
            if ( IntPtr.Size == 4 )
            {
                var foo = new Foo();
                foo.Bar();
            }
            else
            {
                var foo = new Amd64Library.Foo();
                foo.Bar();
            }
        }

        private static void RunLoadingOneAssembly()
        {
            if ( IntPtr.Size == 4 )
            {
                LoadWin32Foo();
            }
            else
            {
                LoadAmd64Foo();
            }
        }

        private static void LoadAmd64Foo()
        {
            var foo = new Amd64Library.Foo();
            foo.Bar();
        }

        private static void LoadWin32Foo()
        {
            var foo = new Foo();
            foo.Bar();
        }
    }
}</pre>
<p>The LoaderApplication references both x64 and x86 assemblies &#8211; yes, at the same time. The key is that the assemblies aren&#8217;t loaded into the process until the last possible moment. If you look at the RunLoadingBothAssemblies method, the moment you enter the method, the .NET runtime will load the assemblies for the types in that method. This means it will try to load the x64 library into a 32bit process and vise versa resulting in errors. The RunLoadingOneAssembly determines which platform is being used and then makes another call so that only the library needed is loaded.</p>
<p>There is a caveat to this method. The assemblies need to use separate namespaces or different type names. If both assemblies use the same namespace, you will run into type resolution issues as the compiler won&#8217;t know which class you are trying to load while referencing both assemblies.  If you have source access to the assembly that has to be compiled for each platform, #if statements will allow you to easily adjust the namespaces or type names.</p>
<p>You can watch this application run on x64 and the process name will not have *32 as it will be running natively. So, if you want to have a single build of your application, but run on x64 and x86, this is one way to go.</p>
<p>You can download the full source <a href="http://disassembla.net/Downloads/Blog/DelayLoadAssemblies.zip">here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2009/06/delay-loading-net-assemblies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby First Impressions</title>
		<link>http://innovatian.com/2008/12/ruby-first-impressions/</link>
		<comments>http://innovatian.com/2008/12/ruby-first-impressions/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 23:28:00 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=33</guid>
		<description><![CDATA[I decided to try out Ruby today. I have wanted to try it out for quite a while. Some of my impressions may be inaccurate, but I have done what I can. I have Zero interest in DB and web ‘programming’ so I am going to skip rails and related material. Edit I intially tried [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I decided to try out Ruby today. I have wanted to try it out for quite a while. Some of my impressions may be inaccurate, but I have done what I can. I have Zero interest in DB and web ‘programming’ so I am going to skip rails and related material.</p>
<p><strong>Edit</strong><br />
I intially tried to use JetBrains’ RubyMine and had a few issues. Since then I tried it again and everything worked great. It is very comparable to Ruby In Steel (IMHO) and another great product from JetBrains.</p>
<p>I installed Ruby In Steel Personal Edition and that was a great way to get started. I ran the installers and I was up and running in a familiar environment. I created a Ruby project and I started with hello world. After that I started going through the guide at Techtopia and the RDocs. I love the product for a free version, but for someone trying to learn Ruby, the intellisence feature would be handy. I am never going to pay $200 for an IDE that I would use as a hobby; that being said, if I ever were to program Ruby as a job, $200 is a great price.</p>
<p>What I like</p>
<ul>
<li>very straightforward language
<ul>
<li>I loved that when I wanted to shift the elements of an array I found it was built-in</li>
</ul>
</li>
<li>Class library</li>
<li>being able to have a line of code like this; I wish I knew what to call it
<ul>
<li>return SolveUsingClosedFormExpression( n ) if ( 0..1474 ).include? n</li>
<li>return SolveUsingClosedFormExpression( n ) if (0..1474) === n</li>
</ul>
</li>
<li>I will complain about this as well, but in writing the closed form Fibonacci solution, the data type changes allowing for huge results
<ul>def SolveUsingClosedFormExpression(n)<br />
left = GOLDENRATIO ** n<br />
right = (-GOLDENRATIOINV) ** n<br />
return ( (left &#8211; right) / ROOT5 ).to_i<br />
end</ul>
</li>
</ul>
<p>What I didn’t like</p>
<ul>
<li>Trying to figure out how to use gems (packages, not the tool) and files in the class library</li>
<li>Lack of type information
<ul>
<li>Yes, yes, I know, I know, but for a c, c++/cli, c#  programmer, it feels just wrong</li>
<li>Declaring a variable feels like I am introducing a magic variable &#8211; *poof* it exists. At least in TI-Basic I had to declare my dynamically typed variables. \</li>
<li>Lack of method return types</li>
</ul>
</li>
<li>At least four ways to return a value from a method, see below.</li>
<li>Inconsistent API
<ul>
<li>I was very frustrated when trying to use .power! only to find that it isn’t defined for Float types – I have to use ** everywhere.</li>
</ul>
</li>
<li>Ruby is supposed to be super OO, but what object contains puts/print?</li>
</ul>
<p>What I really didn’t like</p>
<pre>def multiplyWithReturn(val1, val2 )
    result = val1 * val2
    return result
end

def multiplyLocalVariable(val1, val2 )
    result = val1 * val2
end

def multiplyNoVariables(val1, val2 )
    val1 * val2
end

def multiplyAssignToMethodName(val1, val2 )
    multiplyAssignToMethodName = val1 * val2
end

puts multiplyWithReturn(5,6)
puts multiplyLocalVariable(5,6)
puts multiplyNoVariables(5,6)
puts multiplyAssignToMethodName(5,6)
</pre>
<p>Running this code prints 30303030</p>
<p>I don’t know if I am missing a key ‘feature’ of the language, but at least four ways to return a value from a method just really irks me. Given that there is no return type of a method, reading code to determine what is returning a value and what methods are void seems ridiculous.</p>
<p>I have never programmed in a dynamic language, so it has been a bit of a ride. There a so many nuances to the language, it will take a while to get them down, but they allow for very concise code.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2008/12/ruby-first-impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous Build Systems</title>
		<link>http://innovatian.com/2008/12/continuous-build-systems/</link>
		<comments>http://innovatian.com/2008/12/continuous-build-systems/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 16:36:00 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=32</guid>
		<description><![CDATA[I have gone through so many tools trying to create the right build environment that it is a bit disheartening. I have set up multiple continuous integration systems and it keeps getting easier, but there is still a bit too much friction. I tried to look into using Team Foundation Server and Team Build, but [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I have gone through so many tools trying to create the right build environment that it is a bit disheartening. I have set up multiple continuous integration systems and it keeps getting easier, but there is still a bit too much friction.</p>
<p>I tried to look into using Team Foundation Server and Team Build, but the cost is very high for a startup (even with the top msdn subscription). This is compounded when you have external developers that must also hook into the system.</p>
<p>I have fallen for TeamCity but with one deal breaker for me: no FinalBuilder support. I submitted some feedback and I received a detailed response from JetBrains; I have always received great customer support from JetBrains:</p>
<blockquote><p>There are several ways to support FinalBuilder:     <br /> 1. You may start using CommandLine runner to start the process.      <br /> 2. To Add custom FinalBuilder reporting you may use TeamCity service messages.      <br />&#160;&#160; Please refer to      <br /><a href="http://www.jetbrains.net/confluence/display/TCD4/Build+Script+Interaction+with+TeamCity">http://www.jetbrains.net/confluence/display/TCD4/Build+Script+Interaction+with+TeamCity</a>      <br />&#160;&#160; documentation article on service messages for details      <br /> 3. You may start FinalBuilder from any other build scripts,      <br />&#160;&#160; for example NAnt, MSBuild, Ant, Maven.      <br />&#160;&#160; If&#160; you&#160; need&#160; custom&#160; logging,&#160; you&#160; may&#160; consider using TeamCity      <br />&#160;&#160; Service messages as well      <br /> 4. Write a build runner plugin for TeamCity. There are two      <br />&#160;&#160; public available examples on the build runners at:      <br /><a href="http://www.jetbrains.net/confluence/display/TW/Rake+Runner">http://www.jetbrains.net/confluence/display/TW/Rake+Runner</a>      <br />&#160;&#160; and      <br /><a href="http://svn.jetbrains.org/teamcity/plugins/fxcop/">http://svn.jetbrains.org/teamcity/plugins/fxcop/</a>      <br />&#160;&#160; Please feel free asking any questions on the integration.      <br /> 5. Post an issue to our tracker at      <br />&#160;&#160; <a href="http://www.jetbrains.net/tracker">http://www.jetbrains.net/tracker</a></p>
</blockquote>
<p>I checked out the code for the build runner plugins, but it is too much work. It is hard not to sound lazy in saying that, but I haven’t used java since my sophomore&#160; year in college, and it doesn’t sit high on my list to spend hours getting a build runner going (I am looking for less friction, not more). I chose the 5th option and <a href="http://www.jetbrains.net/tracker/issue/TW-6442">submitted a feature request TW-6442</a>. With FinalBuilder support I don’t need any other build runners/tools as FinalBuilder most likely wraps them up in its UI.</p>
<p>One other feature that I would like to have, but am hesitant to request right now, is to be able to selected a successful build, and run a publish script (through the web interface (see Cruise)) that can tag the build and use the build&#160; artifacts to deploy that build to Dev/Stage/Production environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2008/12/continuous-build-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ninject MessageBroker Update</title>
		<link>http://innovatian.com/2008/11/ninject-messagebroker-update/</link>
		<comments>http://innovatian.com/2008/11/ninject-messagebroker-update/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 16:49:00 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=31</guid>
		<description><![CDATA[It has been a long time (10 months) since I worked with the Ninject MessageBroker and a couple things have changed since my last post. In the old version you had to connect the MessageBroker as a kernel component by hand. Since then the extension environment has been flushed out a lot more. Now you [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>It has been a long time (10 months) since I worked with the Ninject MessageBroker and a couple things have changed since my last post. In the old version you had to connect the MessageBroker as a kernel component by hand. Since then the extension environment has been flushed out a lot more. Now you can register the MessageBrokerModule when constructing your kernel object.</p>
<pre>using System;
using System.Diagnostics;
using System.Net;
using System.Text.RegularExpressions;
using Ninject;
using Ninject.Extensions.MessageBroker;

namespace NinjectMessageBroker
{
    internal class Program
    {
        private static void Main()
        {
            // Intialize our injection kernel adding message broker functionality.
            using (var kernel = new StandardKernel(new MessageBrokerModule()))
            {
                // Get the event publisher. It reads the current time and fires an event
                var pub = kernel.Get&lt;TimeReader&gt;();
                Debug.Assert(pub != null);

                // Get the subscriber, it waits to get the current time and writes it to stdout
                var sub = kernel.Get&lt;TimeWriter&gt;();
                Debug.Assert(sub != null);

                // Verify that they were wired together
                Debug.Assert(pub.HasListeners);
                Debug.Assert(sub.LastMessage == null);

                // Get the current time. It should automatically let the TimeWriter know
                // without either of them ever knowing of one another.
                pub.GetCurrentTime();

                // Wait to exit.
                Console.ReadLine();
            }
        }
    }

    internal class TimeWriter
    {
        public string LastMessage { get; set; }

        [Subscribe(&quot;message://Time/MessageReceived&quot;)]
        public void OnMessageReceived(object sender, EventArgs&lt;string&gt; args)
        {
            LastMessage = args.EventData;
            Console.WriteLine(LastMessage);
        }
    }

    internal class TimeReader
    {
        public bool HasListeners
        {
            get { return (MessageReceived != null); }
        }

        [Publish(&quot;message://Time/MessageReceived&quot;)]
        public event EventHandler&lt;EventArgs&lt;string&gt;&gt; MessageReceived;

        /// &lt;summary&gt;
        /// Gets the current time and updates all subscribers.
        /// &lt;/summary&gt;
        public virtual void GetCurrentTime()
        {
            string text = GetWebPage();
            var regex = new Regex(@&quot;\d\d:\d\d:\d\d&quot;);
            MatchCollection matches = regex.Matches(text);
            string time = ((matches.Count == 2) ? matches[1] : matches[0]).Value;
            SendMessage(time);
        }

        /// &lt;summary&gt;
        /// Gets the contents of a web page as a string.
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private static string GetWebPage()
        {
            const string url = &quot;http://www.time.gov/timezone.cgi?Eastern/d/-5&quot;;
            var webClient = new WebClient();
            return webClient.DownloadString(url);
        }

        /// &lt;summary&gt;
        /// Sends the message to all subscribers in a threadsafe manner.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;message&quot;&gt;The message.&lt;/param&gt;
        public void SendMessage(string message)
        {
            EventHandler&lt;EventArgs&lt;string&gt;&gt; messageReceived = MessageReceived;

            if (messageReceived != null)
            {
                messageReceived(this, new EventArgs&lt;string&gt;(message));
            }
        }
    }

    public class EventArgs&lt;TData&gt; : EventArgs
    {
        public new static readonly EventArgs&lt;TData&gt; Empty;

        static EventArgs()
        {
            Empty = new EventArgs&lt;TData&gt;();
        }

        private EventArgs()
        {
        }

        public EventArgs(TData eventData)
        {
            EventData = eventData;
        }

        public TData EventData { get; private set; }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2008/11/ninject-messagebroker-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C++ if statement oddity</title>
		<link>http://innovatian.com/2008/11/c-if-statement-oddity/</link>
		<comments>http://innovatian.com/2008/11/c-if-statement-oddity/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 18:52:00 +0000</pubDate>
		<dc:creator>Ian Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://disassembla.net/blog/?p=30</guid>
		<description><![CDATA[I found that you can do work such as assigning a variable and executing a method outside of the main expression of an if statement. For example: if(hRes = GetApplicationState(), NT_SUCCESS(hRes)) { // Do something }]]></description>
			<content:encoded><![CDATA[<p></p><p>I found that you can do work such as assigning a variable and executing a method outside of the main expression of an if statement. For example:</p>
<pre>if(hRes = GetApplicationState(), NT_SUCCESS(hRes))
{
// Do something
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://innovatian.com/2008/11/c-if-statement-oddity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

