<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7893377207140697247</id><updated>2024-09-04T22:18:03.703-05:00</updated><category term=".NET"/><category term="Castle"/><category term="IoC"/><category term="HPC"/><title type='text'>ὅπερ ἔδει ποιῆσαι (hoper edei poiēsai)</title><subtitle type='html'>TDD, HPC, Clusters, et alia.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default?alt=atom&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default?alt=atom&amp;start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-8552062087934035346</id><published>2009-09-24T09:12:00.004-05:00</published><updated>2010-02-02T18:43:01.948-05:00</updated><title type='text'>Blog has moved</title><content type='html'>I have moved my blog to a new host, and there are a number of added and updated posts. I apologize for not making this post sooner. Please go to &lt;a href=&quot;http://innovatian.com/blog&quot;&gt;http://innovatian.com/blog&lt;/a&gt; for all of my new posts.</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/8552062087934035346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/8552062087934035346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8552062087934035346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8552062087934035346'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2009/09/blog-has-moved.html' title='Blog has moved'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-1690765445723652964</id><published>2008-12-28T18:28:00.001-05:00</published><updated>2008-12-28T18:28:05.674-05:00</updated><title type='text'>Ruby First Impressions</title><content type='html'>&lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;I tried to use JetBrains’ RubyMine, but I couldn’t get anything to run. I know it is a public preview, but for the time I am willing to put into Ruby, there was just too much friction for now. I look forward to trying out the full product when it is RTM.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;What I like&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;very straightforward language      &lt;ul&gt;       &lt;li&gt;I loved that when I wanted to shift the elements of an array I found it was built-in &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Class library &lt;/li&gt;    &lt;li&gt;being able to have a line of code like this; I wish I knew what to call it&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;return SolveUsingClosedFormExpression( n ) if ( 0..1474 ).include? n&lt;/li&gt;      &lt;li&gt;return SolveUsingClosedFormExpression( n ) if (0..1474) === n&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;I will complain about this as well, but in writing the closed form Fibonacci solution, the data type changes allowing for huge results&lt;/li&gt;    &lt;ul&gt;     &lt;p&gt;def SolveUsingClosedFormExpression(n)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; left = GOLDENRATIO ** n        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; right = (-GOLDENRATIOINV) ** n        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return ( (left - right) / ROOT5 ).to_i        &lt;br /&gt;end&lt;/p&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;What I didn’t like&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Trying to figure out how to use gems (packages, not the tool) and files in the class library &lt;/li&gt;    &lt;li&gt;Lack of type information &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Yes, yes, I know, I know, but for a c, c++/cli, c#&amp;#160; programmer, it feels just wrong &lt;/li&gt;      &lt;li&gt;Declaring a variable feels like I am introducing a magic variable - *poof* it exists. At least in TI-Basic I had to declare my dynamically typed variables. \&lt;/li&gt;      &lt;li&gt;Lack of method return types&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;At least four ways to return a value from a method, see below.&lt;/li&gt;    &lt;li&gt;Inconsistent API&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;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.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Ruby is supposed to be super OO, but what object contains puts/print? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;What I really didn’t like&lt;/p&gt;  &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; bgcolor=&quot;#000000&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;400&quot;&gt;         &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;background: #bfd2f9; color: gray&quot;&gt;multiplyWithReturn&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2 &lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;result &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1 &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;result&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;/span&gt;&lt;span style=&quot;background: #bfd2f9; color: gray&quot;&gt;multiplyLocalVariable&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2 &lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;result &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1 &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;/span&gt;&lt;span style=&quot;background: #bfd2f9; color: gray&quot;&gt;multiplyNoVariables&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2 &lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1 &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;/span&gt;&lt;span style=&quot;background: #bfd2f9; color: gray&quot;&gt;multiplyAssignToMethodName&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2 &lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;multiplyAssignToMethodName &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val1 &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;val2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;puts multiplyWithReturn&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;puts multiplyLocalVariable&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;puts multiplyNoVariables&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;puts multiplyAssignToMethodName&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;background: #3399ff; color: white&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Running this code prints&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; bgcolor=&quot;#000000&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;br /&gt;    &lt;tr&gt;&lt;br /&gt;      &lt;td valign=&quot;top&quot; width=&quot;400&quot;&gt;&lt;br /&gt;        &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;30&lt;br /&gt;30&lt;br /&gt;30&lt;br /&gt;30&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/1690765445723652964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/1690765445723652964' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1690765445723652964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1690765445723652964'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/12/ruby-first-impressions.html' title='Ruby First Impressions'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-8085255967409851865</id><published>2008-12-15T11:36:00.001-05:00</published><updated>2008-12-15T11:36:04.494-05:00</updated><title type='text'>Continuous Build Systems</title><content type='html'>&lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;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:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There are several ways to support FinalBuilder:     &lt;br /&gt; 1. You may start using CommandLine runner to start the process.      &lt;br /&gt; 2. To Add custom FinalBuilder reporting you may use TeamCity service messages.      &lt;br /&gt;&amp;#160;&amp;#160; Please refer to      &lt;br /&gt;&lt;a href=&quot;http://www.jetbrains.net/confluence/display/TCD4/Build+Script+Interaction+with+TeamCity&quot;&gt;http://www.jetbrains.net/confluence/display/TCD4/Build+Script+Interaction+with+TeamCity&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160; documentation article on service messages for details      &lt;br /&gt; 3. You may start FinalBuilder from any other build scripts,      &lt;br /&gt;&amp;#160;&amp;#160; for example NAnt, MSBuild, Ant, Maven.      &lt;br /&gt;&amp;#160;&amp;#160; If&amp;#160; you&amp;#160; need&amp;#160; custom&amp;#160; logging,&amp;#160; you&amp;#160; may&amp;#160; consider using TeamCity      &lt;br /&gt;&amp;#160;&amp;#160; Service messages as well      &lt;br /&gt; 4. Write a build runner plugin for TeamCity. There are two      &lt;br /&gt;&amp;#160;&amp;#160; public available examples on the build runners at:      &lt;br /&gt;&lt;a href=&quot;http://www.jetbrains.net/confluence/display/TW/Rake+Runner&quot;&gt;http://www.jetbrains.net/confluence/display/TW/Rake+Runner&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160; and      &lt;br /&gt;&lt;a href=&quot;http://svn.jetbrains.org/teamcity/plugins/fxcop/&quot;&gt;http://svn.jetbrains.org/teamcity/plugins/fxcop/&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160; Please feel free asking any questions on the integration.      &lt;br /&gt; 5. Post an issue to our tracker at      &lt;br /&gt;&amp;#160;&amp;#160; &lt;a href=&quot;http://www.jetbrains.net/tracker&quot;&gt;http://www.jetbrains.net/tracker&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;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&amp;#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 &lt;a href=&quot;http://www.jetbrains.net/tracker/issue/TW-6442&quot;&gt;submitted a feature request TW-6442&lt;/a&gt;. With FinalBuilder support I don’t need any other build runners/tools as FinalBuilder most likely wraps them up in its UI.&lt;/p&gt;  &lt;p&gt;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&amp;#160; artifacts to deploy that build to Dev/Stage/Production environment.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/8085255967409851865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/8085255967409851865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8085255967409851865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8085255967409851865'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/12/continuous-build-systems.html' title='Continuous Build Systems'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-7069229871207291449</id><published>2008-11-29T11:49:00.001-05:00</published><updated>2008-11-29T11:49:18.164-05:00</updated><title type='text'>Ninject MessageBroker Update</title><content type='html'>&lt;p&gt;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.&lt;/p&gt;  &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;821&quot; bgcolor=&quot;#000000&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;819&quot;&gt;&lt;font style=&quot;background-color: #000000&quot; face=&quot;Courier New&quot; color=&quot;#ffc9a0&quot;&gt;&lt;/font&gt;          &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Diagnostics&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Net&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;RegularExpressions&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Ninject&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Core&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Ninject&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Extensions&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;MessageBroker&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;namespace &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;NinjectMessageBroker&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;internal class &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Program&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;private static void &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Main&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Intialize our injection kernel adding message broker functionality.&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;using &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;kernel &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;StandardKernel&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;[] { &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;MessageBrokerModule&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;() }))&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Get the event publisher. It reads the current time and fires an event&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;pub &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;kernel&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;TimeReader&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Assert&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;pub &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Get the subscriber, it waits to get the current time and writes it to stdout&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;sub &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;kernel&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;TimeWriter&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Assert&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;sub &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Verify that they were wired together&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Assert&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;HasListeners&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Assert&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;sub&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;LastMessage &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;== &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Get the current time. It should automatically let the TimeWriter know&lt;br /&gt;                // without either of them ever knowing of one another.&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;GetCurrentTime&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Wait to exit.&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;ReadLine&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;internal class &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;TimeWriter&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;LastMessage &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;; }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Subscribe&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #d896cd&quot;&gt;&amp;quot;message://Time/MessageReceived&amp;quot;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)]&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;OnMessageReceived&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;object &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;sender&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;LastMessage &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;EventData&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;WriteLine&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;LastMessage&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;internal class &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;TimeReader&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public bool &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;HasListeners&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;get &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;MessageReceived &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Publish&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #d896cd&quot;&gt;&amp;quot;message://Time/MessageReceived&amp;quot;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)]&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public event &lt;/span&gt;&lt;span style=&quot;background: black; color: #2b91af&quot;&gt;EventHandler&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;MessageReceived&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// &lt;/span&gt;&lt;span style=&quot;background: black; color: #df9bd0&quot;&gt;Gets the current time and updates all subscribers.&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public virtual void &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;GetCurrentTime&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;text &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;GetWebPage&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;regex &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;Regex&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #a31515&quot;&gt;@&amp;quot;\d\d:\d\d:\d\d&amp;quot;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;MatchCollection &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;matches &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;regex&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Matches&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;time &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;matches&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Count &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;== 2&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;? &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;matches&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;] : &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;matches&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;SendMessage&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// &lt;/span&gt;&lt;span style=&quot;background: black; color: #df9bd0&quot;&gt;Gets the contents of a web page as a string.&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;private static string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;GetWebPage&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;const string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;url &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #d896cd&quot;&gt;&amp;quot;http://www.time.gov/timezone.cgi?Eastern/d/-5&amp;quot;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;webClient &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;WebClient&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;webClient&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;DownloadString&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// &lt;/span&gt;&lt;span style=&quot;background: black; color: #df9bd0&quot;&gt;Sends the message to all subscribers in a threadsafe manner.&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&lt;/span&gt;&lt;span style=&quot;background: black; color: #df9bd0&quot;&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #df9bd0&quot;&gt;The message.&lt;/span&gt;&lt;span style=&quot;background: black; color: silver&quot;&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;SendMessage&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #2b91af&quot;&gt;EventHandler&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;messageReceived &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;MessageReceived&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;if &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;messageReceived &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;!= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;messageReceived&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public class &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;TData&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public new static readonly &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;TData&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Empty&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;static &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;Empty &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff80ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;TData&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;private &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;EventArgs&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;TData eventData&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;EventData &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;eventData&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;TData EventData &lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;private set&lt;/span&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/7069229871207291449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/7069229871207291449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7069229871207291449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7069229871207291449'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/11/ninject-messagebroker-update.html' title='Ninject MessageBroker Update'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-2587947870744882117</id><published>2008-11-28T13:52:00.001-05:00</published><updated>2008-11-28T13:52:32.413-05:00</updated><title type='text'>C++ if statement oddity</title><content type='html'>&lt;p&gt;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:&lt;/p&gt;  &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;444&quot; bgcolor=&quot;#000000&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;442&quot;&gt;         &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;background: black; color: #e2e2e2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ffc9a0&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;hRes &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;GetApplicationState&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;NT_SUCCESS&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background: black; color: #8ce6ff&quot;&gt;hRes&lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;))&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;background: black; color: lime&quot;&gt;// Do something&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;background: black; color: #ff8080&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Yes, that is a comma inside of the if statement. To the left of the comma is executed first and then the if statement uses the right side as its evaluation expression.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/2587947870744882117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/2587947870744882117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/2587947870744882117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/2587947870744882117'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/11/c-if-statement-oddity.html' title='C++ if statement oddity'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-5275616689956777413</id><published>2008-11-28T13:34:00.001-05:00</published><updated>2008-11-28T13:34:20.066-05:00</updated><title type='text'>Open Source Projects</title><content type='html'>&lt;p&gt;I had two open source projects: Ensurance, and IMAPI.Net. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ensurance did not really fit into any particular group. It was a tool for me while Spec# was still a research project at MS. I wanted to be able to use pre/post conditions, parameter constraints, and tie them into logging and debugging. I don’t think that Spec# will do the last bit, but I am really looking forward to its release.&lt;/li&gt;    &lt;li&gt;IMAPI.Net is a C# cd authoring library that wraps the IMAPI system in windows to allow programmers of any application to write to CD. It supports data and audio discs. It was expensive to test the library and the COM issues were a huge problem for a while. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;PInvoke.net was a good help for the most part, but the marshalling took a long time to get right. I started the project back in .net 1.1 while working on my BS - and it worked. With each .NET release the project would have been easier to write with the COM interop support increasing. I used to be the lead of the XPBurn component project on GotDotNet before it shut down; in truth though, I had stopped supporting it a couple months before that. No one would read directions, read the forum, follow any kind of guidelines and would essentially expect me to figure out why they are using the code wrong. It became too much hassle in the end for what I got out of the project. It was a great learning experience though.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Both projects are essentially dead and I will be closing down the Ensurance&amp;#160; project on CodePlex. I will leave IMAPI.Net up on google code in case anyone ever finds use for the code. If I get the time I will try to add my PInvoke code to the wiki so others don’t have to work as hard as I did.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/5275616689956777413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/5275616689956777413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5275616689956777413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5275616689956777413'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/11/open-source-projects.html' title='Open Source Projects'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-5705486839555599223</id><published>2008-06-13T22:01:00.001-05:00</published><updated>2008-06-13T22:01:14.967-05:00</updated><title type='text'>Yet Another Video Update (YAVU)</title><content type='html'>&lt;p&gt;Here is the latest PLAYXPERT video demo. While playing the game the user:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Starts playing a song.&lt;/li&gt;    &lt;li&gt;Searches the web for a video.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Web browser&lt;/li&gt;      &lt;li&gt;AJAX&lt;/li&gt;      &lt;li&gt;FLASH&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Opens the Friends widget and initiates an IM session&lt;/li&gt;    &lt;li&gt;Continues playing the game the whole time.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:08d8f27d-e2d3-4e3a-8086-bf10c637eda7&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;&lt;div&gt;&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/E4oSB1tWXsI&amp;amp;hl=en&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/E4oSB1tWXsI&amp;amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;STAY IN GAME!&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/5705486839555599223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/5705486839555599223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5705486839555599223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5705486839555599223'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/06/yet-another-video-update-yavu.html' title='Yet Another Video Update (YAVU)'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-7045426245722863448</id><published>2008-05-02T18:41:00.002-05:00</published><updated>2008-05-02T19:17:10.572-05:00</updated><title type='text'>PLAYXPERT in Action</title><content type='html'>Although this blog is in no way associated with my employer, I feel I need to post this. It is a video of PLAYXPERT running in game. For many years I had wished there was a product like this, and now I get to be part of the team that brings it to life :)&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/xCCFNq2GrtY&amp;hl=en&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/xCCFNq2GrtY&amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/7045426245722863448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/7045426245722863448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7045426245722863448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7045426245722863448'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/05/playxpert-in-action.html' title='PLAYXPERT in Action'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-815130996885214536</id><published>2008-01-16T15:54:00.001-05:00</published><updated>2008-01-16T15:54:53.530-05:00</updated><title type='text'>Ninject Message Broker</title><content type='html'>&lt;p&gt;I updated my local copy of &lt;a href=&quot;http://ninject.org/&quot;&gt;Ninject&lt;/a&gt; today and decided to try out the message broker. I opened the test fixture to see how it is used and wrote up this little test.&amp;#160; Overall I am very happy with how this simple demo worked out. I am going to try to set aside some time to try something more in depth. This simple example has one object getting the current time from the Internet and then publishes the new time it received. The second object listens for the time to be updated and then writes it to the console. What I really dig is that the two objects never know of one another.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &quot; new??=&quot;new??&quot; courier=&quot;courier&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &quot; new??=&quot;new??&quot; courier=&quot;courier&quot;&gt; &lt;/span&gt;&lt;/p&gt;  &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;internal&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; IKernel _kernel;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Intialize our injection kernel&lt;/span&gt;&lt;br /&gt;        _kernel = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; StandardKernel();&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Add message broker functionality.&lt;/span&gt;&lt;br /&gt;        _kernel.Connect&amp;lt;IMessageBroker&amp;gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; StandardMessageBroker());&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Get the event publisher. It reads the current time and fires an event&lt;/span&gt;&lt;br /&gt;        TimeReader pub = _kernel.Get&amp;lt;TimeReader&amp;gt;();&lt;br /&gt;        Debug.Assert(pub != &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Get the subscriber, it waits to get the current time and writes it to stdout&lt;/span&gt;&lt;br /&gt;        TimeWriter sub = _kernel.Get&amp;lt;TimeWriter&amp;gt;();&lt;br /&gt;        Debug.Assert(sub != &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Verify that they were wired together&lt;/span&gt;&lt;br /&gt;        Debug.Assert(pub.HasListeners);&lt;br /&gt;        Debug.Assert(sub.LastMessage == &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Get the current time. It should automatically let the TimeWriter know&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// without either of them ever knowing of one another.&lt;/span&gt;&lt;br /&gt;        pub.GetCurrentTime();&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;// Wait to exit.&lt;/span&gt;&lt;br /&gt;        Console.ReadLine();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;internal&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; TimeWriter&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _lastMessage;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; LastMessage&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _lastMessage; }&lt;br /&gt;        set { _lastMessage = &lt;span style=&quot;color: #0000ff&quot;&gt;value&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Subscribe(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;message://Time/MessageReceived&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; OnMessageReceived(&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt; sender, EventArgs&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&amp;gt; args)&lt;br /&gt;    {&lt;br /&gt;        _lastMessage = args.EventData;&lt;br /&gt;        Console.WriteLine(_lastMessage);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;internal&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; TimeReader&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;bool&lt;/span&gt; HasListeners&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; (MessageReceived != &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;); }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Publish(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;message://Time/MessageReceived&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;event&lt;/span&gt; EventHandler&amp;lt;EventArgs&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&amp;gt;&amp;gt; MessageReceived;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// Gets the current time and updates all subscribers.&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetCurrentTime()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; text = GetWebPage();&lt;br /&gt;        Regex regex = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Regex(&lt;span style=&quot;color: #006080&quot;&gt;@&amp;quot;&amp;lt;b&amp;gt;\d\d:\d\d:\d\d&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Match match = regex.Match(text);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; time = match.Value.TrimStart(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;&amp;lt;b&amp;gt;&amp;quot;&lt;/span&gt;.ToCharArray()).TrimEnd(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;.ToCharArray());&lt;br /&gt;        SendMessage(time);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// Gets the contents of a web page as a string.&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; GetWebPage()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; url = &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;http://www.time.gov/timezone.cgi?Eastern/d/-5&amp;quot;&lt;/span&gt;;&lt;br /&gt;        HttpWebRequest webRequest = WebRequest.Create(url) &lt;span style=&quot;color: #0000ff&quot;&gt;as&lt;/span&gt; HttpWebRequest;&lt;br /&gt;        webRequest.Method = &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; (WebResponse webResponse = webRequest.GetResponse())&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; (StreamReader sr = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; sr.ReadToEnd();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// Sends the message to all subscribers in a threadsafe manner.&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;param name=&amp;quot;message&amp;quot;&amp;gt;The message.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; SendMessage(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; message)&lt;br /&gt;    {&lt;br /&gt;        EventHandler&amp;lt;EventArgs&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&amp;gt;&amp;gt; messageReceived = MessageReceived;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; (messageReceived != &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            messageReceived(&lt;span style=&quot;color: #0000ff&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; EventArgs&amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&amp;gt;(message));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/815130996885214536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/815130996885214536' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/815130996885214536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/815130996885214536'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2008/01/ninject-message-broker.html' title='Ninject Message Broker'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-7080975300346906699</id><published>2007-12-11T00:59:00.001-05:00</published><updated>2007-12-11T00:59:58.911-05:00</updated><title type='text'>Visual Studio 2008 InstallFest</title><content type='html'>&lt;p&gt;I will be attending the &lt;a href=&quot;http://msevents.microsoft.com/CUI/EventDetail.aspx?culture=en-US&amp;amp;EventID=1032360766&quot;&gt;Visual Studio 2008 InstallFest&lt;/a&gt; in Spokane Valley on Wednesday the 12th with a few other deve lopers from &lt;a href=&quot;http://www.playxpert.com&quot;&gt;PLAYXPERT&lt;/a&gt;. It will be nice to meet some other .NET coders in the Spokane area. Hopefully we can pick something up soon (better SIGS). I was really looking forward to attending the Agile Philly and Philly ALT.NET group meetings before the move to Spokane.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/7080975300346906699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/7080975300346906699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7080975300346906699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7080975300346906699'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/12/visual-studio-2008-installfest.html' title='Visual Studio 2008 InstallFest'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-6391436941284922897</id><published>2007-12-11T00:16:00.001-05:00</published><updated>2007-12-11T00:16:03.258-05:00</updated><title type='text'>Settling In</title><content type='html'>&lt;p&gt;Well, I have been in Spokane for a week now. I still feel like I am just settling in. My car finally shipped (thanks to MN for helping) and should arrive this week. The contents of my apt may not be here until Christmas, so it will be a little rough until then. The weather the last two weekends has been as bad as the worst I saw in Philadelphia (and it is only December). I wish I could find reliable information on what are the best winter tires.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/6391436941284922897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/6391436941284922897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6391436941284922897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6391436941284922897'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/12/settling-in.html' title='Settling In'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-4481935876525586983</id><published>2007-11-12T20:32:00.001-05:00</published><updated>2007-11-12T20:32:36.993-05:00</updated><title type='text'>SC07: It Begins</title><content type='html'>&lt;p&gt;All around you will find Intel trying to make waves&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Celebrating the 45nm Launch - 45 steps to Technology Leadership&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ok. So they made 45nm, what&#39;s next? With the physical limit a few nm away (from what I understand, 30nm is the limit), what are they going to shock and awe us with next? &lt;/p&gt;  &lt;p&gt;Everyone is trying to get the final touches finished on their booths while eagerly awaiting the food coming in just 5 minutes. After an hour of eating, we will have a half hour break before the VIPs get their privileged two hour private run on the show floor. From what I hear, D-Wave is claiming to have the first quantum computer presented here, but we will have to see about that.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/4481935876525586983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/4481935876525586983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4481935876525586983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4481935876525586983'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/11/sc07-it-begins.html' title='SC07: It Begins'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-1340869868924911193</id><published>2007-11-10T11:53:00.001-05:00</published><updated>2007-11-10T11:53:00.032-05:00</updated><title type='text'>News</title><content type='html'>&lt;p&gt;It has been too long since my last post, for which there are a number of reasons. &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Super Computing 2007&lt;/li&gt; &lt;li&gt;Vacation Preparation&lt;/li&gt; &lt;li&gt;New Job&lt;/li&gt; &lt;li&gt;Moving&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I head to Reno, Nevada early tomorrow morning for &lt;a href=&quot;http://sc07.supercomputing.org/&quot;&gt;SC07&lt;/a&gt;. I have been trying to get my research ready for presentation.&amp;nbsp; Hopefully this year will be as fun and interesting as last.&lt;/p&gt; &lt;p&gt;The day after I get back from Reno, my girlfriend and I are flying to Aruba for ten days.&lt;/p&gt; &lt;p&gt;There is a lot of preparation when I will essentially be gone for fifteen days. This should be a nice break compared to the bedlam to come.&lt;/p&gt; &lt;p&gt;I resigned.&amp;nbsp; When I get back from Aruba, I will be working my last week as a Software Developer for NAVTEQ. I will be moving 2529 miles from Philadelphia to Spokane, WA to take the role of Software Quality Assurance Director for &lt;a href=&quot;http://www.playxpert.com/&quot;&gt;PlayXPert&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I will be doing software architecture, software development, developer management, project management, system administration, continuous integration, QA management, and other tasks.&lt;/p&gt; &lt;p&gt;Along with the new job comes moving. I work for one week, during which I need to pack every morning and night ( as I will be gone for the two weeks prior ) which leaves no room for anything. I start Monday, December 3rd. &lt;/p&gt; &lt;p&gt;This come as a stumbling block for my Ensurance project on CodePlex. It is stable, fully featured, and usable, but I will not be able to work on it for a month which really pains me. The only pieces missing are the distribution tasks such as strong naming, finishing internationalization, and such. I was really looking forward to implementing the full set of fluent parameter attributes, but there is a minimal implementation right now.&lt;/p&gt; &lt;p&gt;I will try to post from SC07 with anything that I find.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/1340869868924911193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/1340869868924911193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1340869868924911193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1340869868924911193'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/11/news.html' title='News'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-5255883019401502479</id><published>2007-10-11T17:43:00.001-05:00</published><updated>2007-10-11T17:43:14.657-05:00</updated><title type='text'>New Ensurance Release</title><content type='html'>&lt;p&gt;Yesterday I released version &lt;a href=&quot;https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=Ensurance&amp;amp;ReleaseId=7562&quot;&gt;0.4&lt;/a&gt; on Codeplex. All of the functionality for the 1.0 release is finished. I am trying to wrap up all of the tasks needed for a distribution. When all of that is done I will mark the release as 1.0. I am still looking for functionality ideas.&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/5255883019401502479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/5255883019401502479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5255883019401502479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5255883019401502479'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/10/new-ensurance-release.html' title='New Ensurance Release'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-9152517553052633521</id><published>2007-10-05T14:35:00.001-05:00</published><updated>2007-10-05T14:35:13.555-05:00</updated><title type='text'>Long time, no posts, new OS project Ensurance</title><content type='html'>&lt;p&gt;I have been incredibly busy lately and thus there have been no posts. I have finally published the first release of my project &lt;a href=&quot;http://www.codeplex.com/Ensurance&quot; target=&quot;_blank&quot;&gt;Ensurance&lt;/a&gt; on &lt;a href=&quot;http://www.codeplex.com/&quot; target=&quot;_blank&quot;&gt;CodePlex&lt;/a&gt;. It is based on the &lt;a href=&quot;http://www.nunit.com&quot; target=&quot;_blank&quot;&gt;NUnit&lt;/a&gt; 2.4.3 framework and is intended to be used for production code to verify particular constraints in an application. Check out the CodePlex page for more information. I will be posting sample code soon.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/9152517553052633521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/9152517553052633521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/9152517553052633521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/9152517553052633521'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/10/long-time-no-posts-new-os-project.html' title='Long time, no posts, new OS project Ensurance'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-8080287252545876343</id><published>2007-09-02T10:16:00.001-05:00</published><updated>2007-09-02T10:16:47.738-05:00</updated><title type='text'>Portable &amp;#39;supercomputer&amp;#39;</title><content type='html'>&lt;p&gt;The story of the Calvin College portable supercomputer really irks me. It is getting a lot of attention for doing nothing. You can see it on &lt;a href=&quot;http://www.engadget.com/2007/09/02/calvin-college-duo-creates-cheap-portable-supercomputer/&quot;&gt;engadget&lt;/a&gt;, &lt;a href=&quot;http://hardware.slashdot.org/hardware/07/08/31/0235242.shtml&quot;&gt;Slashdot&lt;/a&gt;, and others. Anyone can build a cluster like what they have. The only credit I will give them is that not everyone would go through the benchmark and analysis as they did. On the other hand, these people are still on the same old trail of HPC. They ignore the entire issue of programming -- they used&amp;nbsp;HPL code. Ask if they can write their own code for the microwolf. What kind of real application performance can they achieve? The engadget article says &quot;Talk about a solid price-to-performance ratio.&quot; - what load of crap. How about asking real questions and reporting real HPC news?&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/8080287252545876343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/8080287252545876343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8080287252545876343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8080287252545876343'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/09/portable.html' title='Portable &amp;#39;supercomputer&amp;#39;'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-4819356047924139698</id><published>2007-09-02T07:39:00.001-05:00</published><updated>2007-09-02T07:39:24.742-05:00</updated><title type='text'>Ninject Dependency Injection Framework</title><content type='html'>&lt;p&gt;I have been playing with &lt;a title=&quot;Ninject Home&quot; href=&quot;http://ninject.org/&quot;&gt;Ninject&lt;/a&gt; for a couple days now and I am having a lot of fun. One feature I have been really digging is Contextual Binding. The kernel allows multiple modules to be loaded that define the bindings of your types. So depending on which modules and bindings are set, I can change the way other binding resolve. Here is an example:&lt;/p&gt; &lt;p&gt;Say I want to resolve a different type of car dependent on a selected engine. I have an interface IEngine and two classes V4, V6 that inherit from IEngine. If V4 is resolved by the kernel then the car returned would be a Civic; an Accord if a V6 is returned. Here is the code in custom modules:&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; EngineModule : StandardModule&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Load()&lt;br /&gt;        {&lt;br /&gt;            Bind&amp;lt;IEngine&amp;gt;().To( &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( V4 ) );&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; CarModule : StandardModule&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Load()&lt;br /&gt;        {&lt;br /&gt;            IContext context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; StandardContext( Kernel, &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( IEngine ) );&lt;br /&gt;            IBinding binding = Kernel.GetBinding&amp;lt;IEngine&amp;gt;( context );&lt;br /&gt;            Type implementationType = binding.Provider.GetImplementationType( context, &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt; );&lt;br /&gt;&lt;br /&gt;            Bind&amp;lt;ICar&amp;gt;().To( &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( Accord ) ).OnlyIf(&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;delegate&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; ( implementationType == &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( V6 ) )&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;                } );&lt;br /&gt;&lt;br /&gt;            Bind&amp;lt;ICar&amp;gt;().To( &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( Civic ) ).OnlyIf(&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;delegate&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; ( implementationType == &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt; ( V4 ) )&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;                } );&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I can then load the modules into my kernel and use it to resolve cars:&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main( &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args )&lt;br /&gt;        {&lt;br /&gt;            IModule[] modules = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; IModule[] { &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SettingsModule(), &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; EngineModule(), &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; CarModule() };&lt;br /&gt;            IKernel kernel = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; StandardKernel( modules );&lt;br /&gt;&lt;br /&gt;            ICar car = kernel.Get&amp;lt;ICar&amp;gt;();&lt;br /&gt;            Console.WriteLine( &lt;span class=&quot;str&quot;&gt;&quot;I just got a brand new {0} {1}.&quot;&lt;/span&gt;, car.Manufacturer, car.Model );&lt;br /&gt;            Console.WriteLine( &lt;span class=&quot;str&quot;&gt;&quot;It has a {0} cylinder engine with {1} horsepower and {2} ft-lb torqe.&quot;&lt;/span&gt;, car.Engine.Cylinders, car.Engine.Horsepower, car.Engine.Torque );&lt;br /&gt;            Console.WriteLine( &lt;span class=&quot;str&quot;&gt;&quot;Time to start the Engine!&quot;&lt;/span&gt; );&lt;br /&gt;            car.Engine.Start();&lt;br /&gt;            Console.WriteLine( &lt;span class=&quot;str&quot;&gt;&quot;Sound good, but I am going to turn it off for now.&quot;&lt;/span&gt; );&lt;br /&gt;            car.Engine.Stop();&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://kohari.org/&quot;&gt;Nate Kohari&lt;/a&gt; just wrote a first cut &lt;a href=&quot;http://ninject.org/users-guide.html&quot;&gt;user guide&lt;/a&gt; that is very helpful when getting started.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/4819356047924139698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/4819356047924139698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4819356047924139698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4819356047924139698'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/09/ninject-dependency-injection-framework.html' title='Ninject Dependency Injection Framework'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-6493681761764365474</id><published>2007-08-27T12:22:00.001-05:00</published><updated>2007-08-27T12:22:58.464-05:00</updated><title type='text'>Running Mocked Unit Tests in FinalBuilder With Coverage</title><content type='html'>&lt;p&gt;I just read an &lt;a href=&quot;http://www.craigmurphy.com/blog/?p=654&quot; target=&quot;_blank&quot;&gt;article&lt;/a&gt; by Craig Murphy on running unit tests in &lt;a href=&quot;http://finalbuilder.com/&quot; target=&quot;_blank&quot;&gt;FinalBuilder&lt;/a&gt;. I liked the article and it gives some good pointers. I wish he had written it a while ago, it would have been helpful to me. We use TypeMock which will not allow us to make our unit tests as simply. When I wrote our build scripts I took the same general approach he did.&lt;/p&gt; &lt;p&gt;Starting in the Main ActionList we defined a few variables that give the paths to the applications we use. I also created an ActionList call RunTest which I will go into detail below. For each DLL being tested a call to RunTest is made passing in the name of the DLL to be tested.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/Ian.F.Davis/Blog/photo#5103422722611313922&quot;&gt;&lt;img src=&quot;http://lh3.google.com/Ian.F.Davis/RtL_7VfnfQI/AAAAAAAAAE4/sTfu7hJ_hpc/s800/MainActionList.png&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;In each call we set the CURRENTDLL ActionList Parameter with the name of the&amp;nbsp;DLL (Animation,Audio,Core,..). &lt;/p&gt;&lt;a href=&quot;http://picasaweb.google.com/Ian.F.Davis/Blog/photo#5103422722611313906&quot;&gt;&lt;img src=&quot;http://lh3.google.com/Ian.F.Davis/RtL_7VfnfPI/AAAAAAAAAEw/G3OyUwiSVOo/s800/ActionListParameters.png&quot;&gt;&lt;/a&gt;  &lt;p&gt;NCOVEROPTIONS holds the command-line options for ncover.console.exe. The same follows for NUNITOPTIONS and TMOCKRUNNEROPTIONS.&amp;nbsp; The rest of the ActionList Parameters are used as temporary variables allowing me to put together very complex command argument strings and parse XML into variables.&lt;/p&gt; &lt;p&gt;The RunTest ActionList&amp;nbsp;is separated into two try...catch blocks. The first to run the tests and the second to process the results.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/Ian.F.Davis/Blog/photo#5103422726906281234&quot;&gt;&lt;img src=&quot;http://lh4.google.com/Ian.F.Davis/RtL_7lfnfRI/AAAAAAAAAFA/IZyt7v8V1uo/s800/RunTestActionList.png&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here are what the commands are doing:&lt;/p&gt; &lt;p&gt;Set Variable NCOVEROPTIONS&lt;br&gt;//x &quot;%BUILDDIR%\%CURRENTDLL%Coverage.Xml&quot; //l &quot;%BUILDDIR%\%CURRENTDLL%Coverage.Log&quot;&lt;/p&gt; &lt;p&gt;Set Variable TESTDLLS&lt;br&gt;&quot;%ROOTDIR%\bin\%CURRENTDLL%Tests\%CURRENTDLL%.Tests.dll&quot;&lt;/p&gt; &lt;p&gt;Set Variable NUNITOPTIONS&lt;br&gt;%TESTDLLS% /xml:&quot;%BUILDDIR%\%CURRENTDLL%TestResult.xml&quot; /noshadow&lt;/p&gt; &lt;p&gt;Set Variable PARAMETERS&lt;br&gt;-first -link NCover %NCOVER% %NCOVEROPTIONS% %NUNIT% %NUNITOPTIONS%&lt;/p&gt; &lt;p&gt;Execute Program&lt;br&gt;%TMOCKRUNNER% %PARAMETERS%&lt;br&gt;-Wait For Completion, Log Output, and Hide Window are checked. I do not check the exit code. The second try block handles it.&lt;/p&gt; &lt;p&gt;The first sets up all of our variables and launches the TMockRunner application with all of our parameters. The second tries to read the test results into the TESTFAILURES variable. If the TMockRunner failed then the file will not exist and the Catch block will append our error message to indicate this. If there are test failures we read the failed test cases into a temporary error variable using XPath. This temporary variable is appended to the error message variable which is sent via email to our team. This allows us to find the exact tests that failed directly from our email.&lt;/p&gt; &lt;p&gt;That is basically it. Our CI server runs the FinalBuilder script with a few extra options and processes the NCover output to give us a nice web page.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/6493681761764365474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/6493681761764365474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6493681761764365474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6493681761764365474'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/running-mocked-unit-tests-in.html' title='Running Mocked Unit Tests in FinalBuilder With Coverage'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-1746941810688448379</id><published>2007-08-18T10:36:00.001-05:00</published><updated>2007-08-18T10:36:44.154-05:00</updated><title type='text'>Parallel Functionals</title><content type='html'>&lt;p&gt;I have used the loop tiling code with scheduling algorithms to parallelize &lt;a href=&quot;http://diditwith.net/&quot;&gt;Dustin Campbell&#39;s&lt;/a&gt; code from his post &lt;a href=&quot;http://diditwith.net/2007/06/21/AHigherCalling.aspx&quot;&gt;A Higher Calling&lt;/a&gt;. The parallelized funtionals can be found &lt;a href=&quot;http://docs.google.com/Doc?id=dhbhb4dm_34gb39cv&quot;&gt;here&lt;/a&gt;. It uses the scheduling algorithm code from the last post. The parallel reduction is actually based on Joe Duffy&#39;s serial reduction.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/1746941810688448379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/1746941810688448379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1746941810688448379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/1746941810688448379'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/parallel-functionals.html' title='Parallel Functionals'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-8896726130034224350</id><published>2007-08-18T10:11:00.001-05:00</published><updated>2007-08-18T10:11:12.993-05:00</updated><title type='text'>Scheduling Algorithms</title><content type='html'>&lt;p&gt;I have uploaded my current version of the scheduling algorithms code that I referenced in my previous post. You can view the file &lt;a href=&quot;http://docs.google.com/Doc?id=dhbhb4dm_335s7kvt&quot;&gt;here&lt;/a&gt;. I no longer have access to a multi core/processor machine so I cannot benchmark them properly right now.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/8896726130034224350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/8896726130034224350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8896726130034224350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/8896726130034224350'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/scheduling-algorithms.html' title='Scheduling Algorithms'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-4013548927453743945</id><published>2007-08-12T16:58:00.001-05:00</published><updated>2007-08-12T16:58:03.666-05:00</updated><title type='text'>Correctness of Parallel Code</title><content type='html'>&lt;p&gt;One of the big problems in writing parallel applications is code correctness. How do we know that our parallel implementations are correct? While multi-core correctness has been researched and documented a great deal, correctness for clustering code&amp;nbsp;appears to still be in its infancy. Writing, debugging, and verifying the correctness of your applications remains incredibly difficult. Now, I am not talking about grid computing or web services. I am specifically referring to MPI and the like doing high performance computing.&lt;/p&gt; &lt;p&gt;When debugging a parallel application, a user must set breakpoints, attach to multiple processes, and then try to step through the applications in parallel. This becomes even more unwieldy if you are also trying to write the library/service and test your applications. I am not a fan of debugging, and parallel debugging just makes my skin crawl. So, what can one do?&lt;/p&gt; &lt;p&gt;When designing the implementation of SPPM I wanted to approach it in a way that would allow flexibility never seen in a parallel programming system. Starting at the highest level, I abstracted the service to a well defined interface. Given this interface, I can actually implement several versions of my service that can be swapped out at runtime. But why would I want multiple versions? Using a framework like Castle, I can specify implementations of my service in a configuration file for the WindsorContainer to resolve. Depending on how I want to test, I can change my service implementation. I have&amp;nbsp;two implementations right now: the real service, and&amp;nbsp;a local virtual service. The real service tells my library that when calls are made, try to talk to an external service which runs on every node in the cluster. The local virtual service is used when you want to test a master and worker application without needing a cluster or external service. From the applications&#39; point of view nothing changes. They make the same library calls, but the service implementation has changed allowing the programmer to focus on their application and not its dependencies.&lt;/p&gt; &lt;p&gt;Another set of work dealt with the library implementation. All calls were implemented with a composite pattern partnering the command pattern and template method pattern. All commands would request a pointer&amp;nbsp;from a communication interface factory which would return a pointer to come kind of network transmission class. This class is switched out when the service implementation changes - it may get a TCP socket communicator, a remoting communicator, or, just a pointer to an object that routes calls into the local virtual service.&lt;/p&gt; &lt;p&gt;Up to this point, all of the features has been done with design patterns and object containers. To push things one step further, I had to solve a problem that has really bothered me. Why must I actually&amp;nbsp;execute all of my parallel applications together in order to test them? Why must I run a service, master, and worker just to verify that the simplest case works? I have already shown how to test using just the master and worker by abstracting the service, so what about verifying the correctness of the master and worker independently of one another? Impossible? Why? External Dependencies? What about the service layer? Is it at all possible to apply TDD to HPC and clusters? Of coarse, but it is far from obvious.&lt;/p&gt; &lt;p&gt;Aspect-oriented programming will allow us to simulate our dependencies without changing our code. The &lt;a href=&quot;http://typemock.com/Docs/HowTypeMockHelps.html&quot;&gt;TypeMock&lt;/a&gt; web site does a good job at illustrating this. Our problem breaks down to the need to simulate external dependencies. Write unit tests for your parallel applications, but where external library calls would be made, like&amp;nbsp;a parallel library which talks to the cluster, mock the calls! Below is a small sample trying to mock the worker of a parallel matrix multiplication application. The worker application is supposed to get the B matrix, and a series of rows Ai&amp;nbsp;from A, and&amp;nbsp;compute a sub-result Ci which is sent back to the master. The Check method will be called when the Put call is made and intercepted, and the Ci matrix will be verified for correct contents. The term tuple tells the worker application to exit when it tries to get the next piece of A.&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;[Test]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; WorkerTest() {&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// We use this call to tell TypeMock that the next creation of&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// the InjectionLibrary needs to be faked. TypeMock will replace&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// the instance that should have been created with its own&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// empty implementation. The mocks we set up below tell&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// TypeMock that we are going to have calls made by another component&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// and we need to insert fake results.&lt;/span&gt;&lt;br /&gt;    Mock mock = MockManager.Mock(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(InjectionLibrary));&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// Fake the B call. When the Worker application calls&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// Slm.Get(&quot;B&quot;)&lt;/span&gt;&lt;br /&gt;    mock.ExpectAndReturn(&lt;span class=&quot;str&quot;&gt;&quot;Get&quot;&lt;/span&gt;, 0).Args(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(&lt;span class=&quot;str&quot;&gt;&quot;B&quot;&lt;/span&gt;), &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(B));&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// fake the Ai call&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; tupleName = String.Format(&lt;span class=&quot;str&quot;&gt;&quot;A0:A{0}&quot;&lt;/span&gt;, N - 1);&lt;br /&gt;    mock.ExpectAndReturn(&lt;span class=&quot;str&quot;&gt;&quot;Get&quot;&lt;/span&gt;, 0).Args(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(tupleName, &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(A)));&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// Grab the put of Ci and validate the result&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// We tell TypeMock to call the Check method below to&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// validate the argument (Ci matrix).&lt;/span&gt;&lt;br /&gt;    mock.ExpectCall(&lt;span class=&quot;str&quot;&gt;&quot;Put&quot;&lt;/span&gt;).Args(Check.CustomChecker(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ParameterCheckerEx(Check)));&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// Fake the term tuple&lt;/span&gt;&lt;br /&gt;    mock.ExpectAndReturn(&lt;span class=&quot;str&quot;&gt;&quot;Get&quot;&lt;/span&gt;, 0).Args(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(&lt;span class=&quot;str&quot;&gt;&quot;A0:A0&quot;&lt;/span&gt;), &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Assign(term));&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// This next line is mocked, the library is static&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// and the faked instance is shared.&lt;/span&gt;&lt;br /&gt;    InjectionLibrary Slm = InjectionLibrary.Instance;&lt;br /&gt;    &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// Call our worker&#39;s main method.&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// All of the calls that were mocked above will&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// have there calls hijacked.&lt;/span&gt;&lt;br /&gt;    OCMMWorker.Main(&lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;Here we have referenced a .NET application like an external DLL and invoked its Main method. Everything is run from the comfort of your TestFixture and you have verified one case in your worker application without the need of a cluster, master, or external/virtual service. Using these methods, we can write parallel cluster code while minimizing our need to debug. Why debug when you know it works?&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/4013548927453743945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/4013548927453743945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4013548927453743945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/4013548927453743945'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/correctness-of-parallel-code.html' title='Correctness of Parallel Code'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-5710572617110129425</id><published>2007-08-11T18:20:00.001-05:00</published><updated>2007-08-11T20:43:35.215-05:00</updated><title type='text'>Overhead of Parallel Applications and Scheduling Algorithms</title><content type='html'>&lt;p&gt;When we typically try to measure the speedup&amp;nbsp;of a parallelized&amp;nbsp;algorithm, many people only calculate the serial vs. parallel running time (&lt;em&gt;Sp&lt;/em&gt; = &lt;em&gt;Tseq&lt;/em&gt;/&lt;em&gt;Tpar&lt;/em&gt;). The effective speedup can more closely be approximated with the following equation to further define &lt;em&gt;Tpar&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Tpar&lt;/em&gt; = &lt;em&gt;Tcomp&lt;/em&gt; + &lt;em&gt;Tcomm&lt;/em&gt; + &lt;em&gt;Tmem&lt;/em&gt; + &lt;em&gt;Tsync&lt;/em&gt;&lt;br&gt;&lt;em&gt;Tpar&lt;/em&gt; is the total parallel running time.&lt;br&gt;&lt;em&gt;Tcomp&lt;/em&gt; is the time spent in parallel computation on all machines / processors.&lt;br&gt;&lt;em&gt;Tmem&lt;/em&gt; is the time spent in main memory or disk.&lt;br&gt;&lt;em&gt;Tsync&lt;/em&gt; is the time required to synchronize.&lt;/p&gt; &lt;p&gt;All of these are easily quantifiable with the exception of &lt;em&gt;Tsync&lt;/em&gt;. In an ideal world &lt;em&gt;Tsync&lt;/em&gt; is zero, but this is never the case. A single slow processor/machine/data link can make a huge difference with &lt;em&gt;Tsync&lt;/em&gt;. So, how can we manage it?&lt;/p&gt; &lt;p&gt;The most straightforward way to try to minimize &lt;em&gt;Tsync&lt;/em&gt; it it to apply a fixed chunk load. MPI uses this method. This is fine unless you have a heterogeneous cluster or other applications are running on the processors/machines being used.&lt;/p&gt; &lt;p&gt;An extension of the fixed chunking is to create a normalized value for all of your computing resources. Then, let the computing resources get jobs whose size is comparable to their ability. Another way, say we have three machines whose computing powers are A:1, B:2, C:3 (C is three times as powerful as A). If we have twelve pieces of work&amp;nbsp;to distribute, we can group them into six groups of two (total / sum of power). In the time C will compute three of the chunks, B will have done two and A will have done one. The entire job should wrap up with a minimal &lt;em&gt;Tsync&lt;/em&gt;. This kind of work load balancing works very well for heterogeneous clusters.&lt;/p&gt; &lt;p&gt;Other scheduling methods had been tried in clusters; factoring and guided self-scheduling being two, but they seem to&amp;nbsp;add too much overhead for the &lt;em&gt;Tcomm&lt;/em&gt;. There has to be a balance in creating&amp;nbsp;chunky communication&amp;nbsp;and minimizing &lt;em&gt;Tsync&lt;/em&gt;.&amp;nbsp;They may however work as valid scheduling algorithms for multi-core processing. The &lt;em&gt;Tcomm&lt;/em&gt; is greatly reduced compared to cluster computing.&lt;/p&gt; &lt;p&gt;Working again from &lt;a href=&quot;http://www.bluebytesoftware.com/blog/&quot;&gt;Joe Duffy&#39;s&lt;/a&gt; MSDN article &quot;&lt;a href=&quot;http://msdn.microsoft.com/msdnmag/issues/07/05/CLRInsideOut/default.aspx&quot;&gt;Reusable Parallel Data Structures and Algorithms: Reusable Parallel Data Structures and Algorithms&lt;/a&gt;&quot;, I have reworked the loop tiling code to support scheduling algorithms.&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;[ThreadStatic]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; partitions = ProcessorCount;&lt;br /&gt;&lt;br /&gt;[ThreadStatic]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; SchedulingAlgorithms algorithm = SchedulingAlgorithms.Factoring;&lt;br /&gt;&lt;br /&gt;[ThreadStatic]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;double&lt;/span&gt; factor = 0.5;&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; For&amp;lt;TInput&amp;gt;( IList&amp;lt;TInput&amp;gt; data, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; from, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; to, Action&amp;lt;TInput&amp;gt; dataBoundClause, Action&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;&amp;gt; indexBoundClause )&lt;br /&gt;{&lt;br /&gt;    Debug.Assert( from &amp;lt; to );&lt;br /&gt;    Debug.Assert( ( dataBoundClause != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; ) || ( indexBoundClause != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; ) );&lt;br /&gt;    Debug.Assert( ( data != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; dataBoundClause != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; ) ||&lt;br /&gt;                  ( data == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; dataBoundClause == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; ) );&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; size = to - from;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; offset = 0;&lt;br /&gt;    List&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;&amp;gt; gp = GetPartitionList( size );&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; parts = gp.Count;&lt;br /&gt;    CountdownLatch latch = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; CountdownLatch( parts );&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; parts; i++) {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; start = offset + from;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; partitionSize = gp[0];&lt;br /&gt;        gp.RemoveAt( 0 );&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; end = Math.Min( to, start + partitionSize );&lt;br /&gt;        offset += partitionSize;&lt;br /&gt;        ThreadPool.QueueUserWorkItem( &lt;span class=&quot;kwrd&quot;&gt;delegate&lt;/span&gt;&lt;br /&gt;                                      {&lt;br /&gt;                                          &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; j = start; j &amp;lt; end; j++) {&lt;br /&gt;                                              &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; ( data != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; ) {&lt;br /&gt;                                                  dataBoundClause( data[j] );&lt;br /&gt;                                              }&lt;br /&gt;                                              &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; {&lt;br /&gt;                                                  indexBoundClause( j );&lt;br /&gt;                                              }&lt;br /&gt;                                          }&lt;br /&gt;&lt;br /&gt;                                          latch.Signal();&lt;br /&gt;                                      } );&lt;br /&gt;    }&lt;br /&gt;    latch.Wait();&lt;br /&gt;}&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; List&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;&amp;gt; GetPartitionList( &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; size ) {&lt;br /&gt;    ISchedulingAlgorithm schedulingAlgorith = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;switch&lt;/span&gt; ( Algorithm ) {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; SchedulingAlgorithms.FixedChunking:&lt;br /&gt;            schedulingAlgorith = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; FixedChunking( size, Math.Min( size, partitions ) );&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; SchedulingAlgorithms.GuidedSelfScheduling:&lt;br /&gt;            schedulingAlgorith = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; GuidedSelfScheduling( size );&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; SchedulingAlgorithms.Factoring:&lt;br /&gt;            schedulingAlgorith = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Factoring( size, factor, factoringThreshold );&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    Debug.Assert( schedulingAlgorith != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt; );&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; schedulingAlgorith.GetPartitionSizes();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With this setup, all you have to do is set the algorithm that you would like to use along with the scheduling algorithm. The variables are thread static so that many threads can have their own algorithms, but since the for loop is blocking you only need one copy per thread.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It will take a little bit of tweaking for your application&#39;s algorithm, but these should produce reasonable results. My next goal is to get them benchmarked under different scenarios.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/5710572617110129425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/5710572617110129425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5710572617110129425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/5710572617110129425'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/overhead-of-parallel-applications-and.html' title='Overhead of Parallel Applications and Scheduling Algorithms'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-6351620894834359052</id><published>2007-08-11T05:04:00.001-05:00</published><updated>2007-08-11T05:04:47.773-05:00</updated><title type='text'>Follow Up: Frustration Caused by Amdahl&amp;#39;s &amp;#39;Law&amp;#39;</title><content type='html'>&lt;p&gt;Michael Suess from &lt;a href=&quot;http://www.thinkingparallel.com/&quot;&gt;Thinking Parallel&lt;/a&gt; was kind enough to point me to a paper he coauthored &quot;&lt;a href=&quot;http://www.michaelsuess.net/publications/suess_leopold_irregular_para_06.pdf&quot;&gt;Implementing Irregular Parallel Algorithms with OpenMP&lt;/a&gt;&quot;. In it he goes on to describe a way to implement the early thread sync that I mentioned&amp;nbsp;using OpenMP. If you are interested in more of his papers, here is his &lt;a href=&quot;http://www.michaelsuess.net/publications.php&quot;&gt;publications page&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/6351620894834359052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/6351620894834359052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6351620894834359052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/6351620894834359052'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/followup-frustration-caused-by-amdahl.html' title='Follow Up: Frustration Caused by Amdahl&amp;#39;s &amp;#39;Law&amp;#39;'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-7404786982556634272</id><published>2007-08-11T04:53:00.001-05:00</published><updated>2007-08-11T04:53:02.246-05:00</updated><title type='text'>RE: Why are int[,], double[,], single[,], et alia so slow?</title><content type='html'>&lt;p&gt;I actually wrote the previous post in October of 2006. Since then, someone was nice enough to look up the reasons for me. &lt;a title=&quot;Wesner Moise&#39;s Blog&quot; href=&quot;http://wesnerm.blogs.com/net_undocumented/&quot;&gt;Wesner Moise&lt;/a&gt; posted&amp;nbsp;&lt;a title=&quot;Arrays UNDOCUMENTED&quot; href=&quot;http://www.codeproject.com/dotnet/arrays.asp&quot;&gt;this article&lt;/a&gt; on &lt;a href=&quot;http://www.codeproject.com/&quot;&gt;CodeProject&lt;/a&gt; that I think explains a lot.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/7404786982556634272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/7404786982556634272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7404786982556634272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/7404786982556634272'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/re-why-are-int-double-single-et-alia-so.html' title='RE: Why are int[,], double[,], single[,], et alia so slow?'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7893377207140697247.post-398308733349042914</id><published>2007-08-08T10:34:00.001-05:00</published><updated>2007-08-08T10:34:01.386-05:00</updated><title type='text'>Jamie Cansdale - TestDriven.Net - Silently Posts a Resolution with Microsoft</title><content type='html'>&lt;p&gt;From the 2.8.2130 release notes&lt;/p&gt; &lt;blockquote&gt; &lt;h3&gt;Release Notes - TestDriven.NET: 2.8&lt;/h3&gt; &lt;h4&gt;993: Retire Visual Studio Express support&lt;/h4&gt; &lt;p&gt;Joint statement: &quot;Jamie Cansdale and Microsoft Corporation have agreed to concentrate on working together on future releases of TestDriven.Net for Microsoft&#39;s officially extensible editions of Visual Studio, as opposed to spending time litigating their differences.&quot;&lt;/p&gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://xoctian.blogspot.com/feeds/398308733349042914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7893377207140697247/398308733349042914' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/398308733349042914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7893377207140697247/posts/default/398308733349042914'/><link rel='alternate' type='text/html' href='http://xoctian.blogspot.com/2007/08/jamie-cansdale-testdrivennet-silently.html' title='Jamie Cansdale - TestDriven.Net - Silently Posts a Resolution with Microsoft'/><author><name>Ian Davis</name><uri>http://www.blogger.com/profile/04108763407781783639</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>