<?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: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-8015724</id><updated>2012-02-16T02:55:17.741-08:00</updated><category term='android'/><category term='money'/><title type='text'>Software, Mathematics and Money</title><subtitle type='html'>&lt;i&gt;A contractor's pedagogical journey in Computational Finance&lt;/i&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default?start-index=101&amp;max-results=100'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>113</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8015724.post-1138685894187562173</id><published>2011-05-19T05:07:00.001-07:00</published><updated>2011-05-19T05:07:54.821-07:00</updated><title type='text'>Static excursion aka GPS Noise</title><content type='html'>&lt;p&gt;Two views of the same phenomenon. Aka noise&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/TdUH_h6pZJI/AAAAAAAABNo/p2CHz5247L8/s1600-h/image%5B2%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_990MwuRZkU0/TdUIFqH62oI/AAAAAAAABNs/N1S9boSNaKQ/image_thumb.png?imgmax=800" width="244" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;500751504,A,110519063636,N5121.3833W00011.1017,000,247,NA,17800000,108&amp;#160; &lt;br /&gt;500751504,A,110519063606,N5121.3835W00011.1007,007,247,NA,17800000,108&amp;#160; &lt;br /&gt;500751504,A,110519063536,N5121.3832W00011.0866,000,074,NA,17800000,108&amp;#160; &lt;br /&gt;500751504,A,110519063506,N5121.3706W00011.0796,000,345,NA,17800000,108&amp;#160; &lt;br /&gt;500751504,A,110519063448,N5121.3673W00011.0927,010,086,NA,17800000,110&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1138685894187562173?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1138685894187562173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1138685894187562173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1138685894187562173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1138685894187562173'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/05/static-excursion-aka-gps-noise.html' title='Static excursion aka GPS Noise'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_990MwuRZkU0/TdUIFqH62oI/AAAAAAAABNs/N1S9boSNaKQ/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7132260965261429280</id><published>2011-05-01T14:52:00.001-07:00</published><updated>2011-05-01T14:52:53.768-07:00</updated><title type='text'>VS2010–Flaky IDE. I don’t want to send any information, I just want an IDE that doesn’t crash every 30 minutes.</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/Tb3WMBem3rI/AAAAAAAABNg/zzzWYKJ6njA/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_990MwuRZkU0/Tb3WM6qfTvI/AAAAAAAABNk/hoe_eOD9ijs/image_thumb%5B4%5D.png?imgmax=800" width="708" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7132260965261429280?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7132260965261429280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7132260965261429280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7132260965261429280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7132260965261429280'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/05/vs2010flaky-ide-i-dont-want-to-send-any.html' title='VS2010–Flaky IDE. I don’t want to send any information, I just want an IDE that doesn’t crash every 30 minutes.'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_990MwuRZkU0/Tb3WM6qfTvI/AAAAAAAABNk/hoe_eOD9ijs/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-172024328909022813</id><published>2011-04-16T15:32:00.001-07:00</published><updated>2011-04-16T15:34:34.810-07:00</updated><title type='text'>You have to setup and tear down</title><content type='html'>&lt;p&gt;Recently I witnessed the execution of performance test runs that did not include the elements necessary for successful and reliable result generation.&lt;/p&gt;  &lt;p&gt;The test run should have included the following activities:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Test setup&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Seed the database with fresh data&lt;/li&gt;      &lt;li&gt;Rebuild indexes&lt;/li&gt;      &lt;li&gt;Recreate statistics&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;Test execution and&lt;/li&gt;    &lt;li&gt;Test tear down&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Delete data generated during the test&lt;/li&gt;      &lt;li&gt;Clear caches&lt;/li&gt;      &lt;li&gt;Recycle application pools&lt;/li&gt;      &lt;li&gt;Remove all database deadlocks&lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;The initial performance run included steps 1-2; subsequent runs only included step 2. When the results from all runs where compared, it was observed that the performance of the system under test(SUT) gradually deteriorated.&lt;/p&gt;  &lt;p&gt;The main point is that without proper tear down and setup after each performance run, the tests were measuring a different SUT each time. &lt;/p&gt;  &lt;p&gt;For performance comparisons to be meaningful, one has got to compare similar SUTs. &lt;/p&gt;  &lt;p&gt;If you can’t perform steps 1-3 because of complexities in your environment, then abandon your performance tests until these prerequisites are resolved.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-172024328909022813?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/172024328909022813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=172024328909022813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/172024328909022813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/172024328909022813'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/04/you-have-to-setup-and-tear-down.html' title='You have to setup and tear down'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3241612259220198019</id><published>2011-04-05T13:52:00.001-07:00</published><updated>2011-04-05T13:52:45.006-07:00</updated><title type='text'>Google Chart API</title><content type='html'>&lt;p&gt;We are building a lightweight reporting module; our charts need to scale and given that we could be hosting the report module on a nix platform, using the .NET charting APIs was not an option.&lt;/p&gt;  &lt;p&gt;After a bit of digging we settled on using the Google Chart API which provides a POST API. All we needed to do to perform integration was supply the data series, labels, chart type, chart dimensions etc.&lt;/p&gt;  &lt;p&gt;&lt;a title="https://chart.googleapis.com/chart?cht=p3&amp;amp;chs=300x100&amp;amp;chl=Agribusiness|Haulage|Jobs|Other|Property&amp;amp;chd=t:6,3,2,2,1" href="https://chart.googleapis.com/chart?cht=p3&amp;amp;chs=300x100&amp;amp;chl=Agribusiness|Haulage|Jobs|Other|Property&amp;amp;chd=t:6,3,2,2,1"&gt;https://chart.googleapis.com/chart?cht=p3&amp;amp;chs=300x100&amp;amp;chl=Agribusiness|Haulage|Jobs|Other|Property&amp;amp;chd=t:6,3,2,2,1&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The rendered chart is displayed below&lt;/p&gt;  &lt;p&gt;&lt;img src="https://chart.googleapis.com/chart?cht=p3&amp;amp;chs=300x100&amp;amp;chl=Agribusiness|Haulage|Jobs|Other|Property&amp;amp;chd=t:6,3,2,2,1" /&gt;&lt;/p&gt;  &lt;p&gt;This is a great services from Google and demonstrates the power of software as a service(SaaS). Software development should be about assembling and orchestrating various services to build a cohesive feature set.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3241612259220198019?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3241612259220198019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3241612259220198019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3241612259220198019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3241612259220198019'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/04/google-chart-api.html' title='Google Chart API'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7029578526221417416</id><published>2011-04-03T09:09:00.001-07:00</published><updated>2011-04-03T11:54:09.335-07:00</updated><title type='text'>Zam-Track on track</title><content type='html'>&lt;p&gt;Based on current data volumes and interest expressed in the Z-Track platform, we expect to process about 1 million data points this year. Each data item has the following structure:&lt;/p&gt;  &lt;p&gt;%%800704,A,110402201650,N5121.3489W00011.1780,000,230,NA,47000000,531,CFG:Z31,10,1|&lt;/p&gt;  &lt;p&gt;A JSON representation of this feed looks like this:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;ID&lt;/font&gt;:800704,&lt;font color="#0000ff"&gt;GPSValid&lt;/font&gt;:A,&lt;font color="#0000ff"&gt;DateTime&lt;/font&gt;:110402201650,&lt;font color="#0000ff"&gt;Loc&lt;/font&gt;:N5121.3489W00011.1780,&lt;font color="#0000ff"&gt;Speed&lt;/font&gt;:000,&lt;font color="#0000ff"&gt;Dir&lt;/font&gt;:230,&lt;font color="#0000ff"&gt;Temp&lt;/font&gt;:NA,&lt;font color="#0000ff"&gt;Status&lt;/font&gt;:47000000,&lt;font color="#0000ff"&gt;Event&lt;/font&gt;:531, &lt;font color="#0000ff"&gt;Message&lt;/font&gt;:CFG:Z31,10,1|&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The structure of the data makes it ideal for a document-centric data store. We have evaluated MongoDB as the storage solution; other contenders in the running are CouchDB. Fast data writes and reads are essential for our application.&lt;/p&gt;  &lt;p&gt;The feed gives us vast opportunities to integrate with HR, Payroll and financials systems.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7029578526221417416?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7029578526221417416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7029578526221417416' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7029578526221417416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7029578526221417416'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/04/zam-track-on-track.html' title='Zam-Track on track'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8522374069312765683</id><published>2011-03-15T18:27:00.001-07:00</published><updated>2011-03-16T02:35:47.729-07:00</updated><title type='text'>Quick time to market with DTSTTCPW</title><content type='html'>&lt;p&gt;We are developing all our products using this development philosophy with the caveat that we then “refactor mercilessly”. So far this has helped us to deliver key application features in record time. The success of this approach relies in having the discipline to rapidly payoff the technical debt that inevitably accrues.&lt;/p&gt;  &lt;p&gt;And of course as with everything – context matters. Simplicity is relative.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8522374069312765683?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8522374069312765683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8522374069312765683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8522374069312765683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8522374069312765683'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/quick-time-to-market-with-dtsttcpw.html' title='Quick time to market with DTSTTCPW'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5899283723757158371</id><published>2011-03-15T18:06:00.001-07:00</published><updated>2011-03-15T18:11:58.031-07:00</updated><title type='text'>reCaptcha</title><content type='html'>&lt;p&gt;Is pure genius and makes you think about how the solution to one problem, Spambots, can provide valuable commercial opportunities in another totally unrelated area. Great idea! But do the deciphered publications end up in the public domain or will Google charge us for this material?&lt;/p&gt;  &lt;p&gt;Integration of reCaptcha is quick and painless, so we are adding it to all our online form submission workflows.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5899283723757158371?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5899283723757158371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5899283723757158371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5899283723757158371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5899283723757158371'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/recaptcha.html' title='reCaptcha'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4943284507650628784</id><published>2011-03-15T17:50:00.001-07:00</published><updated>2011-03-15T17:50:47.793-07:00</updated><title type='text'>Just Tether It</title><content type='html'>&lt;p&gt;So my mobile phone provider says I can eat as much data as I like on the current tariff; the truth of the matter is that I don’t really surf the web whilst I am out and about. At the end of my billing period I have tonnes of unused bandwidth. Luckily I have managed to download a USB tethering utility, PdaNet, that allows me to use my phone as a wi-fi hotspot via USB cable. Sweet. Let the feasting begin…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4943284507650628784?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4943284507650628784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4943284507650628784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4943284507650628784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4943284507650628784'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/just-tether-it.html' title='Just Tether It'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1734899136680736011</id><published>2011-03-13T16:00:00.001-07:00</published><updated>2011-03-13T16:00:59.200-07:00</updated><title type='text'>Fleet Management Platform codenamed Z-Track now in development</title><content type='html'>&lt;p&gt;Zainco Ventures is developing a fleet management and asset tracking platform,&amp;#160; Z-track , aimed at providing deep integration with back office systems. The first beta release is planned for Q3 2011.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1734899136680736011?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1734899136680736011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1734899136680736011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1734899136680736011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1734899136680736011'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/fleet-management-platform-codenamed-z.html' title='Fleet Management Platform codenamed Z-Track now in development'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2457718406846760901</id><published>2011-03-13T15:16:00.001-07:00</published><updated>2011-03-13T16:32:27.556-07:00</updated><title type='text'>Chisamba order confirmed</title><content type='html'>&lt;p&gt;After a difficult trading period in February, business is definitely picking up. Zainco Ventures has been engaged again by the Food Reserve Agency to help with the movement of 300 metric tonnes of vital grain stocks. This is a ringing endorsement of the services provided by the company. Last year Zainco Ventures helped the Zambian government to move over 4000 metric tonnes of grain to safe storage.&lt;/p&gt;  &lt;p&gt;With a forecast yield of 2.8 million metric tonnes in the 2010/11 agriculture season, we will definitely be busy.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2457718406846760901?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2457718406846760901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2457718406846760901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2457718406846760901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2457718406846760901'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/chisamba-order-confirmed.html' title='Chisamba order confirmed'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-916461239020431162</id><published>2011-03-13T15:10:00.001-07:00</published><updated>2011-03-13T15:10:23.141-07:00</updated><title type='text'>Reviewing the £100 Android tablet</title><content type='html'>&lt;p&gt;There is a tablet for almost any budget. My tablet arrived 1 week ago and since then I have been evaluating the wowPad.&lt;/p&gt;  &lt;p&gt;I have successfully upgraded the firmware using a download from the internet. Everything works as it should.&lt;/p&gt;  &lt;p&gt;The camera is low spec, but this is to be expected for a budget tablet.&lt;/p&gt;  &lt;p&gt;Overall – I am quite impressed with device. Would I buy more units? Definitely yes!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-916461239020431162?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/916461239020431162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=916461239020431162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/916461239020431162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/916461239020431162'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/03/reviewing-100-android-tablet.html' title='Reviewing the £100 Android tablet'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2369650721855380272</id><published>2011-02-08T12:07:00.003-08:00</published><updated>2011-02-08T12:07:56.084-08:00</updated><title type='text'>Description Resource Path Location Type error: No resource identifier found for attribute 'onClick' in package 'android' main.xml /HelloFieldroid/res/layout line 9 Android AAPT Problem</title><content type='html'>&lt;p&gt;Appears there is a problem with using events declaratively, so have ended up implementing the event handler in code&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2369650721855380272?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2369650721855380272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2369650721855380272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2369650721855380272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2369650721855380272'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/description-resource-path-location-type.html' title='Description Resource Path Location Type error: No resource identifier found for attribute &amp;#39;onClick&amp;#39; in package &amp;#39;android&amp;#39; main.xml /HelloFieldroid/res/layout line 9 Android AAPT Problem'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7569880602881259546</id><published>2011-02-08T12:07:00.001-08:00</published><updated>2011-02-08T12:07:36.549-08:00</updated><title type='text'>An SDK Target must be specified when you try to create a new Android Project in Eclipse</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_990MwuRZkU0/TVGifdgrNiI/AAAAAAAABNQ/SJiJQkLi0dE/s1600-h/image2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_990MwuRZkU0/TVGigD6QqdI/AAAAAAAABNU/uRuuT5jPGjs/image_thumb.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is caused by the SDK path not being set in the Eclipse IDE. This is resolved by selecting Window—&amp;gt;Preferences—&amp;gt;Android and enter the path to your Android SDK, then hit OK. You will see a list of all your Android Platforms as shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_990MwuRZkU0/TVGihU3kbsI/AAAAAAAABNY/Tkt5_URzmuk/s1600-h/image5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_990MwuRZkU0/TVGih2ZhJlI/AAAAAAAABNc/qRlpMzrmCI0/image_thumb1.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;LinearLayout&lt;/span&gt; &lt;span class="attr"&gt;xmlns:android&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="attr"&gt;android:orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;vertical&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;android:layout_width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;fill_parent&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="attr"&gt;android:layout_height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;fill_parent&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextView&lt;/span&gt; &lt;span class="attr"&gt;android:layout_width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;fill_parent&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="attr"&gt;android:layout_height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;wrap_content&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;android:text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@string/hello&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EditText&lt;/span&gt; &lt;span class="attr"&gt;android:id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@+id/editText1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;android:layout_height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;wrap_content&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="attr"&gt;android:layout_width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;fill_parent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;android:autoText&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EditText&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;android:layout_height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;wrap_content&amp;quot;&lt;/span&gt;    &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="attr"&gt;android:layout_width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;wrap_content&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;android:id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@+id/button1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="attr"&gt;android:text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;save note&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="attr"&gt;android:onClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;saveNote&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;LinearLayout&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", 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;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7569880602881259546?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7569880602881259546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7569880602881259546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7569880602881259546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7569880602881259546'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/sdk-target-must-be-specified-when-you.html' title='An SDK Target must be specified when you try to create a new Android Project in Eclipse'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_990MwuRZkU0/TVGigD6QqdI/AAAAAAAABNU/uRuuT5jPGjs/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1647117267100136874</id><published>2011-02-08T12:06:00.001-08:00</published><updated>2011-02-08T12:06:43.576-08:00</updated><title type='text'>Monodroid vs Eclispe with ADT</title><content type='html'>&lt;p&gt;For 400USD looks like Monodroid is definitely an expensive way for .NET developers to join the Android game. Using Eclipse and the Android Development Toolkit(ADT) an experienced .NET developer will be productive in no time. I downloaded the tools 1st thing in the morning and by midday I had a simple data driven application with the appropriate test coverage.&lt;/p&gt;  &lt;p&gt;The Eclipse tool support for Android is unbeatable. You get design surfaces, inbuilt editors for resource files and the comfort that these tools are mature and bug free. The other side effect is that you end up learning Java.&lt;/p&gt;  &lt;p&gt;Viva free tools!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1647117267100136874?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1647117267100136874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1647117267100136874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1647117267100136874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1647117267100136874'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/monodroid-vs-eclispe-with-adt.html' title='Monodroid vs Eclispe with ADT'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6571128609410489320</id><published>2011-02-05T14:36:00.001-08:00</published><updated>2011-02-05T15:03:01.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Lift off!</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_990MwuRZkU0/TU3Q1lxHn8I/AAAAAAAABMw/_-k2zhUg8gg/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_990MwuRZkU0/TU3Q3AiWcMI/AAAAAAAABM0/H6T_DKth_Mc/image_thumb.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/TU3W1nFkbeI/AAAAAAAABM4/XP_f8I8R2es/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/TU3W2d04YdI/AAAAAAAABM8/a0FGvJODINk/image_thumb%5B1%5D.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/TU3XIenBolI/AAAAAAAABNE/F-n1SsJYjqg/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_990MwuRZkU0/TU3XJDk6EuI/AAAAAAAABNI/GZbKep5aqhA/image_thumb%5B2%5D.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6571128609410489320?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6571128609410489320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6571128609410489320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6571128609410489320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6571128609410489320'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/lift-off.html' title='Lift off!'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_990MwuRZkU0/TU3Q3AiWcMI/AAAAAAAABM0/H6T_DKth_Mc/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7557617853488465920</id><published>2011-02-04T19:05:00.001-08:00</published><updated>2011-02-04T19:07:34.396-08:00</updated><title type='text'>Monodroid resource generation fails</title><content type='html'>&lt;div class="csharpcode"&gt;   &lt;p&gt;------ Rebuild All started: Project: Com.Fieldroid.Search, Configuration: Debug Any CPU ------     &lt;br /&gt;C:\Program Files\MSBuild\Novell\Novell.MonoDroid.Common.targets(281,2): error MSB6006: &amp;quot;aresgen.exe&amp;quot; exited with code 1.      &lt;br /&gt;========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7557617853488465920?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7557617853488465920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7557617853488465920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7557617853488465920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7557617853488465920'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/monodroid-resource-generation-fails.html' title='Monodroid resource generation fails'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1435398203267621628</id><published>2011-02-04T18:56:00.001-08:00</published><updated>2011-02-04T18:56:25.516-08:00</updated><title type='text'>Error 1 "aresgen.exe" exited with code 1. SmsSearch</title><content type='html'>  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1435398203267621628?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1435398203267621628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1435398203267621628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1435398203267621628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1435398203267621628'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/error-1-exited-with-code-1-smssearch.html' title='Error 1 &amp;quot;aresgen.exe&amp;quot; exited with code 1. SmsSearch'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1154448542712864430</id><published>2011-02-04T03:35:00.001-08:00</published><updated>2011-02-04T03:35:07.811-08:00</updated><title type='text'>Another Successful release... times are good</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;We STP Heroes &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; - YES, We have done it AGAIN! &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; Another milestone success!!&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;We hear from Business that Sprint 13 Release in PROD is doing great!&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Thanks to all for all the hard work on this one other major milestone release that has gone LIVE this morning.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Celebrations… we are just shot of balloons – that is all …&lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;I have brought in a little Sainsbury's Sweet shop, yes really!!!!!&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Keep up the nice work &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;Grab the sweets before they vanish. I am running a TPL Parallel LINQ query to eat all sweets…. &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;font face="Arial" color="green" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Arial"&gt;// A little celeberation in my style… ;) with C#&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;font face="Arial" color="teal" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: Arial"&gt;// Sundar: Start diving into the sweets… use TPL so I can eat ALL, FAST… &lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font face="Wingdings" color="teal" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font face="Arial" color="teal" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: Arial"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;font face="Arial" color="teal" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: Arial"&gt;// But of course,  I am running an i7 980X 12 MB cache, with Six-cores… hyper-threaded to 12 virtual cores, mind you…. wohoooo……..&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="#993300" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #993300; FONT-FAMILY: Consolas"&gt;Parallel&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;.&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="blue" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Consolas"&gt;ForEach&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; ( &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="#993300" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #993300; FONT-FAMILY: Consolas"&gt;sweetsOnMyDesk&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;, &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="#993300" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #993300; FONT-FAMILY: Consolas"&gt;oneSweet&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; =&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;            {&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;                &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="green" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"&gt;// The more sweets I eat here, the greater the speed compared to if I used a non-parallel foreach loop for my eating process &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="green" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;                &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="blue" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Consolas"&gt;var&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="#993300" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #993300; FONT-FAMILY: Consolas"&gt;sweet&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; = CeleberationsHelperUtils.UnPackSweet(oneSweet);&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;                &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="blue" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Consolas"&gt;this&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;.Eat(sweet); &lt;/span&gt;&lt;/font&gt;&lt;b&gt;&lt;font face="Consolas" color="green" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"&gt;// I really wanted to say Me.Eat(…) but that would sound like &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt; ;)  Grrrrrrr……… I am "C# house", baby! &lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font face="Wingdings" color="green" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font face="Consolas" color="green" size="2"&gt;&lt;span style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;            } &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;            /&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="green" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"&gt;/ Wow!! what a sweet C# lambda expression I have got there – don't you love it? &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="green" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;            );&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;         &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="#339966" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #339966; FONT-FAMILY: Consolas"&gt;            // Execution done!&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="WORD-BREAK: break-all; TEXT-INDENT: 36pt"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;     &lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="green" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"&gt;// Let others know I am eating… very fast… using Parallel extensions ;)&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="WORD-BREAK: break-all"&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;            Console.WriteLine(&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="#a31515" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: Consolas"&gt;&amp;quot;Sundar has completed eating ALL (?) sweets. Press any key to let me continue to work on Sprint 14 &lt;/span&gt;&lt;/font&gt;&lt;font face="Wingdings" color="#a31515" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: Wingdings"&gt;J&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="#a31515" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: #a31515; FONT-FAMILY: Consolas"&gt;.&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas" color="black" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Consolas"&gt;);&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;font face="Arial" color="navy" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1154448542712864430?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1154448542712864430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1154448542712864430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1154448542712864430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1154448542712864430'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/02/another-successful-release-times-are.html' title='Another Successful release... times are good'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-9129470087947825565</id><published>2011-01-11T08:25:00.001-08:00</published><updated>2011-01-11T08:25:59.773-08:00</updated><title type='text'>Developing WCF Services on a locked down corporate build</title><content type='html'>&lt;div class="gmail_quote"&gt; &lt;div lang="EN-GB" vlink="purple" link="blue"&gt; &lt;div&gt; &lt;p class="MsoNormal"&gt;&lt;font face="Arial" size="2"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;img height="800" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=9644cc338d&amp;amp;view=att&amp;amp;th=12d75e441accb6b1&amp;amp;attid=0.1&amp;amp;disp=emb&amp;amp;zw" width="1280"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-9129470087947825565?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/9129470087947825565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=9129470087947825565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/9129470087947825565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/9129470087947825565'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2011/01/developing-wcf-services-on-locked-down.html' title='Developing WCF Services on a locked down corporate build'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2839153624373628896</id><published>2010-11-06T08:09:00.001-07:00</published><updated>2010-11-07T01:29:50.565-07:00</updated><title type='text'>Software archaeology</title><content type='html'>&lt;p&gt;A recent addition to our portfolio of problems is a widely successful application that has been developed by business users to process commission payments. &lt;/p&gt;  &lt;p&gt;The application has largely been built by the client over a period of time and continues to be useful to this day. A change in the operational landscape means that&amp;#160; this software won’t scale beyond its current functionality and processing capacity. An upgrade to a full-scale enterprise system is a must rather than a luxury. &lt;/p&gt;  &lt;p&gt;As is the case with such organic systems, the entire concepts of the domain are embedded in functions with lines in excess of 1000. You start off following the code and break pointing every significant statement, and before you know it you have lost your bearings. The questions then becomes - “what was the intention of the civilization that built this technology”; with curiously named variables and loops nested to a depth of 5+ deciphering the intention is non-trivial. One has to methodically piece together all the inputs, configuration data and perhaps chant some voodoo spells to get the system to work.&lt;/p&gt;  &lt;p&gt;UML Interaction diagrams seem to be a powerful tool in understanding the runtime intention of legacy software, but the subtlety contained in conditional statements can be quite problematic to document. It is tempting to ignore the body of knowledge embodied in the legacy application, but doing so makes the reverse and forward engineering unnecessarily complex. So like the archaeologist sifting through the fossilised remains of a once flourishing civilization, I crack open the IDE and good old NotePad in an attempt to gain understanding.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2839153624373628896?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2839153624373628896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2839153624373628896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2839153624373628896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2839153624373628896'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/11/software-archaeology.html' title='Software archaeology'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4002020006355184611</id><published>2010-10-18T11:28:00.001-07:00</published><updated>2010-10-18T11:28:58.532-07:00</updated><title type='text'>A good coffee from back home...Zambia Terranova</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_990MwuRZkU0/TLyR6-LQD9I/AAAAAAAABL8/GG6BkM6dHYw/s1600/2010-10-18+18.56.33-738533.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_990MwuRZkU0/TLyR6-LQD9I/AAAAAAAABL8/GG6BkM6dHYw/s320/2010-10-18+18.56.33-738533.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5529454884812754898" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I have been contemplating going back to Soho to get my coffee supplies replenished, but this rare find in Sainsburys saved me the trek to central London. The taste is not as sour as I would like and it has not got the heavy taste I have become accustomed to. Anyway I would give it a 3/5.&lt;br&gt;  &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4002020006355184611?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4002020006355184611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4002020006355184611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4002020006355184611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4002020006355184611'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/10/good-coffee-from-back-homezambia.html' title='A good coffee from back home...Zambia Terranova'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_990MwuRZkU0/TLyR6-LQD9I/AAAAAAAABL8/GG6BkM6dHYw/s72-c/2010-10-18+18.56.33-738533.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-949235865950839596</id><published>2010-10-17T08:55:00.001-07:00</published><updated>2010-10-17T14:47:49.833-07:00</updated><title type='text'>A delightfully parallel problem</title><content type='html'>&lt;p&gt;I am currently recruiting and part of this process involves the analysis of lots of CVs. This can be quite time consuming, so I have decided that I will expedite the process by developing a small text mining application that analyzes the resumes and produces a signature for each document. The most commons words in the CV will then be readout by the computer and if I like the sound of the digest I will shortlist the candidate.&lt;/p&gt;  &lt;p&gt;The essential parts of text mining are being able to tokenize the document and filtering out noise words. Thanks to PLINQ, I can do the following:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b95ffac6-fbf3-40a0-948f-ca4616bd0d7b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;PLINQ clusters words in doc&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;IGrouping&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; CalculateWordFrequency(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] content)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; groupedWords =&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        content.Select(word =&amp;gt; word.ToLowerInvariant()).GroupBy(word =&amp;gt; word.ToLowerInvariant()).Where(&lt;/li&gt; &lt;li&gt;            word =&amp;gt; word.Count&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;() &amp;gt; 2);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; groupedWords.AsParallel();&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The document tokenizer approach is fairly naive and could do with more work.&lt;/p&gt;  &lt;p&gt;After we have grouped the words in each resume, we then use the Microsoft Speech API found in the namespace, &lt;em&gt;System.Speech.Synthesis &lt;/em&gt;to recite the most common terms&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:84ae24ef-b57c-4183-9b3b-9faac923319a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Reciting the most common terms&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; ReciteResume()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; speechSynthesizer = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SpeechSynthesizer&lt;/span&gt;())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; item &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; GetGroupedTermsInResume(FilterContent(TokenizeContent(ReadDocument()))))&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            speechSynthesizer.SetOutputToDefaultAudioDevice();&lt;/li&gt; &lt;li&gt;            speechSynthesizer.Speak(item.Key);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I have already hired a dozen plus developers using the traditional filtering approach, so it would be interesting to see how the results of the automated CV selection process compare.&lt;/p&gt;  &lt;p&gt;An alternative method of representing the CV digest is to generate a logarithmic plot,&amp;#160; “signature file” as shown below. I wonder what signature represents an ideal candidate. I would probably need to analyze large amounts of data to arrive at an empirically valid conclusion.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/TLscVPvUU2I/AAAAAAAABL0/JZDeIRRdwSQ/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/TLscV8fUKbI/AAAAAAAABL4/5wN6L4DjnT8/image_thumb%5B4%5D.png?imgmax=800" width="717" height="354" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Incidentally this candidate was not hired as their CV contained a lot of buzzwords and they could not explain how they had used the technologies.&lt;/p&gt;  &lt;p&gt;And this is what it sounds like [audio file].&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-949235865950839596?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/949235865950839596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=949235865950839596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/949235865950839596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/949235865950839596'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/10/delightfully-parallel-problem.html' title='A delightfully parallel problem'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_990MwuRZkU0/TLscV8fUKbI/AAAAAAAABL4/5wN6L4DjnT8/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6382814687314751673</id><published>2010-10-09T11:04:00.001-07:00</published><updated>2010-10-09T11:04:32.269-07:00</updated><title type='text'>You gotta love Design By Contract</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:91c58496-a7a6-47de-a18c-76338a987c48" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af"&gt;TestMethod&lt;/span&gt;]&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;[&lt;span style="color:#2b91af"&gt;ExpectedException&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#ff0000"&gt;TradingServiceException&lt;/span&gt;))]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; ShouldThrowExceptionForInvalidTrade()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; mockTrade = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;AbstractTrade&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af"&gt;MockBehavior&lt;/span&gt;.Strict);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    mockTrade.SetupAllProperties();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    mockTrade.Setup(trade =&amp;gt; trade.IsValid()).Returns(&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; tradeManager = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TradeManager&lt;/span&gt;(mockTrade.Object);&lt;/li&gt; &lt;li&gt;    tradeManager.Execute();&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    mockTrade.Verify();   &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And when the test fails, we get the following message:&lt;/p&gt;  &lt;h4&gt;TradeGeneratorTests.ShouldThrowExceptionForInvalidTrade : Failed&lt;/h4&gt;  &lt;p&gt;Test method Zainco.Commodities.Unit.Tests.TradeGeneratorTests.ShouldThrowExceptionForInvalidTrade threw exception:&amp;#160; &lt;br /&gt;Zainco.Commodities.Exceptions.TradingServiceException: Precondition failed: Trade.IsValid() == true&amp;#160; Trade execution failed&lt;/p&gt;  &lt;p&gt;at System.Diagnostics.Contracts.__ContractsRuntime.Requires&amp;lt;TException&amp;gt;(Boolean condition, String message, String conditionText) in :line 0   &lt;br /&gt;at Zainco.Commodities.TradingService.TradeManager.Execute() in &lt;a href="projectfile%3A825BBFEE-89F8-4251-87AA-67D70921170F%2Ff%3ATradeManager.cs%3F28%3F1"&gt;TradeManager.cs: line 28&lt;/a&gt;    &lt;br /&gt;at Zainco.Commodities.Unit.Tests.TradeGeneratorTests.ShouldThrowExceptionForInvalidTrade() in &lt;a href="projectfile%3AC7D5F418-AE3E-4D72-89A0-C78ACA9A1EED%2Ff%3ATradeGeneratorTests.cs%3F36%3F1"&gt;TradeGeneratorTests.cs: line 36&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Sweet!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6382814687314751673?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6382814687314751673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6382814687314751673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6382814687314751673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6382814687314751673'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/10/you-gotta-love-design-by-contract.html' title='You gotta love Design By Contract'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-784072726437479907</id><published>2010-10-09T10:54:00.001-07:00</published><updated>2010-10-09T11:07:16.658-07:00</updated><title type='text'>CodeContracts break encapsulation and Resharper 5.0 is blissfully unaware of them</title><content type='html'>&lt;p&gt;Seems I have to make my helper methods public if I want to use them within a code contract, but I avoid this by defining a property with the private setter to end up with the Contract.Requires&amp;lt;TException&amp;gt;(…) implementation below:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e1d91780-0e81-408f-86d1-f9b29bdb3bb9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AbstractTrade&lt;/span&gt; Trade &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt; { _trade = &lt;span style="color:#0000ff"&gt;value&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; _trade; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Execute()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires&amp;lt;&lt;span style="color:#ff0000"&gt;TradingServiceException&lt;/span&gt;&amp;gt;(Trade.IsValid(),&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                               &lt;span style="color:#a31515"&gt;&amp;quot;Trade execution failed&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (TradeExecutedEvent != &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    {&lt;/li&gt; &lt;li&gt;        TradeExecutedEvent(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TradeEventArgs&lt;/span&gt;(Trade));&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;C:\Sandbox\Pricing\CommodityServer\TradingService\TradeManager.cs(24,13): error CC1038: Member 'Zainco.Commodities.TradingService.TradeManager.get_Trade' has less visibility than the enclosing method 'Zainco.Commodities.TradingService.TradeManager.Execute'.    &lt;br /&gt;C:\Sandbox\Pricing\CommodityServer\TradingService\TradeManager.cs(24,13): warning CC1036: Detected call to method 'Zainco.Commodities.Interfaces.AbstractTrade.IsValid' without [Pure] in contracts of method 'Zainco.Commodities.TradingService.TradeManager.Execute'.     &lt;br /&gt;&amp;#160; elapsed time: 294.0169ms&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-784072726437479907?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/784072726437479907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=784072726437479907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/784072726437479907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/784072726437479907'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/10/codecontracts-break-encapsulation-and.html' title='CodeContracts break encapsulation and Resharper 5.0 is blissfully unaware of them'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4525556330060326372</id><published>2010-10-08T15:22:00.001-07:00</published><updated>2010-10-08T15:38:27.577-07:00</updated><title type='text'>Are all circular dependencies created equal?</title><content type='html'>&lt;p&gt;I am using the separated interface pattern to implement a commodity trading engine for a bourse in the emerging markets. My unit test package is mocking one of the interfaces and consequently has a dependency on the interfaces package. Likewise the Service package depends on the interfaces package.&lt;/p&gt;  &lt;p&gt;Superficially I appear to have a circular dependency and eager Resharper 5.0 complains about this with a fairly descriptive error message &lt;font color="#ff0000"&gt;“Failed to reference module. Probably reference will produce circular dependencies between projects.”&lt;/font&gt;&lt;font color="#000000"&gt;. The result is that intellisense breaks!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/TK-ZtJ0ECdI/AAAAAAAABLQ/KBN6aEWd7kM/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_990MwuRZkU0/TK-ZthX7xII/AAAAAAAABLU/eolZYmEVQeE/image_thumb.png?imgmax=800" width="244" height="36" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_990MwuRZkU0/TK-ZuFUPBrI/AAAAAAAABLg/atQoEFiOefQ/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/TK-ZujmtG1I/AAAAAAAABLk/0b3yiFUGySE/image_thumb%5B3%5D.png?imgmax=800" width="244" height="100" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;What to do? &lt;/p&gt;  &lt;p&gt;Are all circular dependencies created equal? Does it matter that the offending dependency in this case is an abstraction rather than a concrete type?&lt;/p&gt;  &lt;p&gt;On further examination, the only real dependency is between the test package and the trading service, the other dependencies essentially enforce the contracts between the interface package and those that must either implement the behaviours defined by this package or use the behaviours provided by these contracts.&lt;/p&gt;  &lt;p&gt;Tools hmmm….&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4525556330060326372?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4525556330060326372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4525556330060326372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4525556330060326372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4525556330060326372'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/10/are-all-circular-dependencies-created.html' title='Are all circular dependencies created equal?'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_990MwuRZkU0/TK-ZthX7xII/AAAAAAAABLU/eolZYmEVQeE/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2320572183830976275</id><published>2010-08-05T04:04:00.001-07:00</published><updated>2010-08-05T04:04:48.722-07:00</updated><title type='text'>Today I learnt about A/B testing and applied it to an optimisation problem</title><content type='html'>&lt;p&gt;Learn and apply…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2320572183830976275?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2320572183830976275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2320572183830976275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2320572183830976275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2320572183830976275'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/08/today-i-learnt-about-ab-testing-and.html' title='Today I learnt about A/B testing and applied it to an optimisation problem'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7714343291149086358</id><published>2010-07-29T15:20:00.001-07:00</published><updated>2010-07-29T15:20:18.277-07:00</updated><title type='text'>Refreshing Exceptions…</title><content type='html'>&lt;p&gt;Ever faced the cryptic exceptions that leave you red-eyed from looking at the debug window and inspecting automatic variables? Well if you have spent most of your adult life making money from software development, the probability of this happening is fairly high. So when you encounter an exception message like the one below, you kind of know that the software/API has been developed by developers that care:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;WorkOrderTests.ShouldSaveWorkOrderDocument : Failed&lt;/h4&gt;  &lt;p&gt;Test method WorMaSysUnitTests.WorkOrderTests.ShouldSaveWorkOrderDocument threw exception:&amp;#160; &lt;br /&gt;System.InvalidOperationException: The maximum number of requests (30) allowed for this session has been reached.     &lt;br /&gt;Raven limits the number of remote calls that a session is allowed to make as an early warning system. Sessions are expected to be short lived, and&amp;#160; &lt;br /&gt;Raven provides facilities like Load(string[] keys) to load multiple documents at once and batch saves.     &lt;br /&gt;You can increase the limit by setting DocumentConvention.MaxNumberOfRequestsPerSession or DocumentSession.MaxNumberOfRequestsPerSession, but it is     &lt;br /&gt;advisable that you'll look into reducing the number of remote calls first, since that will speed up your application signficantly and result in a&amp;#160; &lt;br /&gt;more responsive application.&lt;/p&gt;  &lt;p&gt;at Raven.Client.Document.InMemoryDocumentSessionOperations.IncrementRequestCount()    &lt;br /&gt;at Raven.Client.Document.DocumentSession.SaveChanges()     &lt;br /&gt;at WorMaSysUnitTests.WorkOrderTests.ShouldSaveWorkOrderDocument() in &lt;a href="projectfile%3A60E16553-D35A-42B9-9F0B-B15153F4BD5F%2Ff%3AWorkOrderTests.cs%3F58%3F1"&gt;WorkOrderTests.cs: line 58&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7714343291149086358?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7714343291149086358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7714343291149086358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7714343291149086358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7714343291149086358'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/07/refreshing-exceptions.html' title='Refreshing Exceptions…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-751239233691431749</id><published>2010-07-29T13:00:00.001-07:00</published><updated>2010-07-29T13:00:08.446-07:00</updated><title type='text'>Playing with the Raven</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/TFHdv5eA8rI/AAAAAAAABKw/BIhgjwCswZg/s1600-h/image6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_990MwuRZkU0/TFHdxuY5z3I/AAAAAAAABK0/dFcCNp2DHYk/image_thumb4.png?imgmax=800" width="673" height="589" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Zainco is currently evaluating NoSQL approaches for a groundbreaking application we are developing for a security client. At present Raven is looking very promising.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-751239233691431749?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/751239233691431749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=751239233691431749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/751239233691431749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/751239233691431749'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/07/playing-with-raven.html' title='Playing with the Raven'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_990MwuRZkU0/TFHdxuY5z3I/AAAAAAAABK0/dFcCNp2DHYk/s72-c/image_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3772596958342506108</id><published>2010-06-05T01:43:00.001-07:00</published><updated>2010-06-05T01:43:46.319-07:00</updated><title type='text'>Blogging from new Nexus device</title><content type='html'>&lt;p&gt;It&amp;#39;s the Epsom Derby today.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3772596958342506108?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3772596958342506108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3772596958342506108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3772596958342506108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3772596958342506108'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/06/blogging-from-new-nexus-device.html' title='Blogging from new Nexus device'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-445464750604494516</id><published>2010-05-18T13:42:00.001-07:00</published><updated>2010-05-18T13:46:18.233-07:00</updated><title type='text'>30 sprints later…</title><content type='html'>&lt;p&gt;I have spent the best part of the last 1 year on a large project with many cross functional teams building a .NET application that integrates with a specialised vendor ERP system. As with any experience, you learn a great deal about yourself and others.&lt;/p&gt;  &lt;p&gt;My greatest lesson is that there is a lot of crap software out there making lots of money and that good software (read this as open source) rarely, if ever, makes money.&lt;/p&gt;  &lt;p&gt;With the crap software come the zealots and snake oil salesmen selling their bogus cures and panaceas .&lt;/p&gt;  &lt;p&gt;If ever I had to express this in mathematical terms, I would say that:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;The rate of return on investment on a software asset is inversely proportional to the quality of the code deployed.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This appears to tie with the empirical data, but as with any such observations, outliers or exceptions will exist.&lt;/p&gt;  &lt;p&gt;I suppose our challenge as software craftsmen is to ensure that quality and ROI is balanced.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-445464750604494516?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/445464750604494516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=445464750604494516' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/445464750604494516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/445464750604494516'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/05/15-sprints-later.html' title='30 sprints later…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-298626894298864074</id><published>2010-01-31T15:23:00.001-08:00</published><updated>2010-01-31T15:23:06.785-08:00</updated><title type='text'>Overheard - "Agile ain't working, we need a plan"</title><content type='html'>&lt;p&gt;Commentary to follow&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-298626894298864074?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/298626894298864074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=298626894298864074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/298626894298864074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/298626894298864074'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/01/overheard-agile-aint-working-we-need.html' title='Overheard - &quot;Agile ain&apos;t working, we need a plan&quot;'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-561649702134451003</id><published>2010-01-28T12:15:00.001-08:00</published><updated>2010-01-28T12:15:08.120-08:00</updated><title type='text'>Composite Applications Framework</title><content type='html'>Testing the blogging service via Yahoo mail&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-561649702134451003?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/561649702134451003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=561649702134451003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/561649702134451003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/561649702134451003'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/01/composite-applications-framework.html' title='Composite Applications Framework'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8410796137367628727</id><published>2010-01-23T12:10:00.001-08:00</published><updated>2010-01-23T12:10:09.178-08:00</updated><title type='text'></title><content type='html'> &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8410796137367628727?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8410796137367628727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8410796137367628727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8410796137367628727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8410796137367628727'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/01/blog-post_23.html' title=''/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6627436976195121390</id><published>2010-01-22T02:34:00.001-08:00</published><updated>2010-01-22T02:34:43.461-08:00</updated><title type='text'></title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_990MwuRZkU0/S1l_Q9cKkAI/AAAAAAAABJ0/-zIzEoQDKxA/s1600-h/2010-01-22+10.33.44-783462.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_990MwuRZkU0/S1l_Q9cKkAI/AAAAAAAABJ0/-zIzEoQDKxA/s320/2010-01-22+10.33.44-783462.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5429510755119173634" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6627436976195121390?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6627436976195121390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6627436976195121390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6627436976195121390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6627436976195121390'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2010/01/blog-post.html' title=''/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_990MwuRZkU0/S1l_Q9cKkAI/AAAAAAAABJ0/-zIzEoQDKxA/s72-c/2010-01-22+10.33.44-783462.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8878383438601413397</id><published>2009-10-03T13:21:00.001-07:00</published><updated>2009-10-03T13:21:29.760-07:00</updated><title type='text'>Eurotunnel...</title><content type='html'>&lt;p&gt;The hiatus is over; in death is renewal and the realisation that we are indeed mortal. &lt;br&gt; One&lt;br&gt; Anyway back to the subject of this blog, software.&lt;/p&gt; &lt;p&gt;At present we face a number of software engineering challenges amongst these is the centralisation of field application logs(FAL). SaaS appears to be a natural solution to this problem. The service interface would ideally accept a log message and persist this for later consumption by development and support staff.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8878383438601413397?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8878383438601413397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8878383438601413397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8878383438601413397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8878383438601413397'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/10/eurotunnel.html' title='Eurotunnel...'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-730870212587171397</id><published>2009-08-21T15:01:00.001-07:00</published><updated>2009-08-21T15:01:18.942-07:00</updated><title type='text'>Stuck in traffic</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/_990MwuRZkU0/So8ZLwm-PQI/AAAAAAAABDc/BiU74VvgMaM/s1600-h/2009-08-18+22.57.43-778943.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_990MwuRZkU0/So8ZLwm-PQI/AAAAAAAABDc/BiU74VvgMaM/s320/2009-08-18+22.57.43-778943.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5372540570293910786" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;device drop&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-730870212587171397?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/730870212587171397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=730870212587171397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/730870212587171397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/730870212587171397'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/08/stuck-in-traffic.html' title='Stuck in traffic'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_990MwuRZkU0/So8ZLwm-PQI/AAAAAAAABDc/BiU74VvgMaM/s72-c/2009-08-18+22.57.43-778943.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1506940791324628476</id><published>2009-08-19T16:56:00.001-07:00</published><updated>2009-08-19T16:56:23.894-07:00</updated><title type='text'>Some thoughts on home grown code gen</title><content type='html'>&lt;p&gt;The context: I have some xml that needs to be converted to C# class files. The xml is attribute-centric.&lt;br&gt; Possible implementation: transform using xslt, tokenize xml and use tokens to populate template; use Codedom ap; use code gen tool&lt;br&gt; Preferred option: CodeDom/Tokenization strategy&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1506940791324628476?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1506940791324628476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1506940791324628476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1506940791324628476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1506940791324628476'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/08/some-thoughts-on-home-grown-code-gen.html' title='Some thoughts on home grown code gen'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7237733928577417892</id><published>2009-08-19T16:45:00.001-07:00</published><updated>2009-08-19T16:45:51.312-07:00</updated><title type='text'>Applying Scrum in a non-software development context</title><content type='html'>&lt;p&gt;My experience of agile project management is confined to the field of software development, but as luck would have it, I have an opportunity to apply agile in an industry sector where brawn comes before brains. Well that&amp;#39;s not entirely correct, but I guess this domain thrives on a command control type structure. I will definitely need to adapt the methodology to take into account the cultural differences afterall we are dealing with complex adaptive systems...ahem&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7237733928577417892?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7237733928577417892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7237733928577417892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7237733928577417892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7237733928577417892'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/08/applying-scrum-in-non-software.html' title='Applying Scrum in a non-software development context'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3843408871128335969</id><published>2009-08-19T16:35:00.001-07:00</published><updated>2009-08-19T16:35:24.280-07:00</updated><title type='text'>Oh so this is SAP</title><content type='html'>&lt;p&gt;Recently started working with SAP as a data model for our .NET UI. All very exciting at the moment. Objects are modelled using a tool and each instance of an object is stored in a construct called a table. Associations and aggregations are aslo modelled using the tool. As someone once said &amp;quot;it&amp;#39;s dejavu all over again&amp;quot;. Based on these observations, I posit that SAP development exemplifies DDD. The ubiquitous language is developed as the model is formulated, dependencies amongst objects are also modelled accordingly. What I am yet to encounter is the notion of value objects. Entities are an intrinsic part of object definition.  Blogged from me Android...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3843408871128335969?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3843408871128335969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3843408871128335969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3843408871128335969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3843408871128335969'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/08/oh-so-this-is-sap.html' title='Oh so this is SAP'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5078359307151827704</id><published>2009-08-19T16:10:00.000-07:00</published><updated>2009-08-19T16:11:04.168-07:00</updated><title type='text'>That's your spec sir...my first foray into the world of haptics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/_990MwuRZkU0/SoyGiJLAxCI/AAAAAAAABDU/zpLY8iPbt50/s1600-h/2009-08-17+00.00.01-764170.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_990MwuRZkU0/SoyGiJLAxCI/AAAAAAAABDU/zpLY8iPbt50/s320/2009-08-17+00.00.01-764170.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5371816376681940002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What we have here is a meal planner structure which can be digitised and form a module in our Home Information Management System(HIMS). In this era of the Smart Meter and the Media Center, there is definitely a place for HIMS.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5078359307151827704?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5078359307151827704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5078359307151827704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5078359307151827704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5078359307151827704'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/08/thats-your-spec-sirmy-first-foray-into.html' title='That&apos;s your spec sir...my first foray into the world of haptics'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_990MwuRZkU0/SoyGiJLAxCI/AAAAAAAABDU/zpLY8iPbt50/s72-c/2009-08-17+00.00.01-764170.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2692958814719480770</id><published>2009-07-26T13:26:00.001-07:00</published><updated>2009-07-26T13:29:36.940-07:00</updated><title type='text'>220 Downloads later…</title><content type='html'>&lt;p&gt;A while ago I put together a little library that determines internal rate of return for a series of cash flows. This is a problem in the accounting domain and was prompted by the inadequacy of the features in excel. I did not want to haul the whole of excel into the application I was building. I tend to stay clear of Interop if I can help it. &lt;/p&gt;  &lt;p&gt;Well the short of it is that the lib averages 1.5 downloads per day. Not much for 15 mins work, but this has led me into thinking that perhaps there is a larger market for reusable math/scientific libraries. How about a DNA sequencing lib?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2692958814719480770?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2692958814719480770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2692958814719480770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2692958814719480770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2692958814719480770'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/07/220-downloads-later.html' title='220 Downloads later…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5025280486872283576</id><published>2009-07-26T13:15:00.001-07:00</published><updated>2009-07-26T13:15:14.567-07:00</updated><title type='text'>Now clean it up…</title><content type='html'>&lt;p&gt;In our attempt to clean up software engineering and make it a more rigorous profession, I assert that testing is one tool that will ensure that the discipline produces consistent results and repeatable quality. Testing should be at the forefront of a developers’ mind, but in most cases it is an after thought. I suppose this is a reflection on the human condition. We are forever optimists hoping that our artefacts will stand the test of time.&lt;/p&gt;  &lt;p&gt;Well I don’t live on hope and for me life is a set of precise constructs. Gravity always wins and code breaks. So lets get test-infected.&lt;/p&gt;  &lt;p&gt;Writing a good tests assumes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A knowledge of the domain or access to a subject matter expert – can be the product owner&lt;/li&gt;    &lt;li&gt;An adequate tests framework&lt;/li&gt;    &lt;li&gt;A testable architecture&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As someone once said, “any one can write a programme, it takes a disciplined developer to write code with tests”.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5025280486872283576?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5025280486872283576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5025280486872283576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5025280486872283576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5025280486872283576'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/07/now-clean-it-up.html' title='Now clean it up…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4648369362309709516</id><published>2009-07-10T15:08:00.001-07:00</published><updated>2009-07-10T15:08:21.579-07:00</updated><title type='text'>Balancing the risks of tool switching – a heuristic</title><content type='html'>&lt;p&gt;When/why should a team adopt/change its toolset?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If the current toolset is inadequate and results in a loss of productivity&lt;/li&gt;    &lt;li&gt;If the new toolset is a ground-breaking innovation and not merely a derivation and solves the business problem better than the incumbent&lt;/li&gt;    &lt;li&gt;If there are compliance/regulatory constraints that mandate the change – for example Sarbannes-Oxley.&lt;/li&gt;    &lt;li&gt;If the new tools will give you significant competitive advantage in the market place, otherwise the costs of learning/deploying the tools will erode marginal benefits&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When should a team not adopt/change its toolset&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Because it will look good or make the developers appear smarter when included on their CVs – remember the customer has to deal with mess once you have left the site&lt;/li&gt;    &lt;li&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4648369362309709516?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4648369362309709516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4648369362309709516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4648369362309709516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4648369362309709516'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/07/balancing-risks-of-tool-switching.html' title='Balancing the risks of tool switching – a heuristic'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2816862303183954292</id><published>2009-07-10T14:46:00.001-07:00</published><updated>2009-07-10T14:50:44.330-07:00</updated><title type='text'>The day we overloaded the scrum with issues that were not part of the “triumvirate”</title><content type='html'>&lt;p&gt;The context: A distributed team with very minimal inter-personal contact. Most conversations are by electronic means. &lt;/p&gt;  &lt;p&gt;The scrum started out with each engineer being asked the usual trio of questions. The expected responses were given and then a tangential conversation about the best approach to take for a new project took root. Big mistake! Before long we had a virtual bun-fight that risked creating permanent schism within the team.&lt;/p&gt;  &lt;p&gt;The lesson to learn from this saga is that face-to-face sessions are best when discussing issues bordering on religion. Once a jihad has taken root within the team then delivery of quality software will be impossible because the team is working against itself.&amp;#160; As a facilitator it is tempting to give additional bandwidth to groaners and the loudest shouters, but this has to be weighed against the greater needs of the team to work as a cohesive unit.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2816862303183954292?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2816862303183954292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2816862303183954292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2816862303183954292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2816862303183954292'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/07/day-we-overloaded-scrum-with-issues.html' title='The day we overloaded the scrum with issues that were not part of the “triumvirate”'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7268812224121935272</id><published>2009-07-01T13:22:00.001-07:00</published><updated>2009-07-01T13:22:05.149-07:00</updated><title type='text'>We have survived the death march…what’s next</title><content type='html'>&lt;p&gt;After the intense and somewhat heroic efforts by the team, a retrospective is definitely apropos. The key lessons learnt are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Scrum definitely works when used in a &lt;em&gt;chaordic &lt;/em&gt;context. What might appear as the ritualized trio of questions, &lt;em&gt;what did you do yesterday&lt;/em&gt;, &lt;em&gt;what do you plan to do today&lt;/em&gt;, &lt;em&gt;what are the impediments to progress&lt;/em&gt;, focuses the development team on what needs to get done. &lt;/li&gt;    &lt;li&gt;Working software is the ultimate measure of progress on any software project. If it’s buggy you will have trouble gaining the trust and required acceptance and signoff. &lt;/li&gt;    &lt;li&gt;Short feedback loops via daily stakeholder meetings help focus the development team on what needs to get done &lt;/li&gt;    &lt;li&gt;Having a developer who also happens to be a subject matter expert will propel the team further. &lt;/li&gt;    &lt;li&gt;Don’t change the domain model if it’s not broken. A distinction has to be made between purely technical changes and changing the semantics of the model. &lt;/li&gt;    &lt;li&gt;Regression issues will undermine the team and erode user confidence &lt;/li&gt;    &lt;li&gt;Make your tech choices before hand and adhere to them &lt;/li&gt;    &lt;li&gt;Beware of feature envy - &lt;a title="http://c2.com/cgi/wiki/Wiki?FeatureEnvy" href="http://c2.com/cgi/wiki/Wiki?FeatureEnvy"&gt;http://c2.com/cgi/wiki/Wiki?FeatureEnvy&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Keep the testers close and the customers closer &lt;/li&gt;    &lt;li&gt;Retrospective testing of code is much harder than TDD. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7268812224121935272?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7268812224121935272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7268812224121935272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7268812224121935272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7268812224121935272'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/07/we-have-survived-death-marchwhats-next.html' title='We have survived the death march…what’s next'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8981811097485398450</id><published>2009-06-11T15:43:00.001-07:00</published><updated>2009-06-11T15:51:21.279-07:00</updated><title type='text'>A severe case of coders block</title><content type='html'>&lt;p&gt;With an impossible deadline on my back and a tangle of excel spreadsheets as my spec, I punch the keyboard, but the juice fails to flow in the IDE. The first test says nothing about the problem I am solving. The coffee is insipid; the Ipod sounds like a broken digital record…perhaps the copy and paste coders are on to something…but I let that thought pass. Why bother with reuse if they refuse to use my API. Do I detect NIH?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8981811097485398450?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8981811097485398450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8981811097485398450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8981811097485398450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8981811097485398450'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/06/severe-case-of-coders-block.html' title='A severe case of coders block'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5565178359101643550</id><published>2009-06-11T15:37:00.001-07:00</published><updated>2009-06-11T15:37:48.178-07:00</updated><title type='text'>Making a case for dogmatic Extreme Programming</title><content type='html'>&lt;p&gt;Refactoring is now a common term in the developer’s vocabulary. However what most developers call refactoring is really hacking. Making a change to the code in the hope that it will work is somewhat analogous to smoking a cigarette whilst filling up your petrol tank. Both will inevitably end in tears. And this is where the dogma kicks in; it is not really refactoring unless you have a safety net of automated tests to verify that the state of the universe has not changed since you&amp;#160; last updated that pesky connection string. A bad test is better than no test at all. I guess that leads on to my next topic…false positives and false negatives. But for now get testing and buy a diesel.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5565178359101643550?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5565178359101643550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5565178359101643550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5565178359101643550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5565178359101643550'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/06/making-case-for-dogmatic-extreme.html' title='Making a case for dogmatic Extreme Programming'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1611600768473635679</id><published>2009-06-09T13:52:00.001-07:00</published><updated>2009-06-09T13:57:36.344-07:00</updated><title type='text'>Ok Mr. Customer…your software is late what are you gonna do now?</title><content type='html'>&lt;p&gt;How do projects get late? Well as Brooks says in the seminal &lt;em&gt;Mythical Man Month, “&lt;/em&gt;projects get late one day at a time”. That day the developers spent listening to that lousy presentation or fixing their development environments instead of delivering features, the project was getting late. That day the developers spent time chasing requirements because the product owner could not be bothered, the project was getting late. Kind of reminds me of the boiled frog metaphor.&lt;/p&gt;  &lt;p&gt;Scrum and daily releases mitigate this risk, but the can only succeed in an enabling context.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1611600768473635679?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1611600768473635679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1611600768473635679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1611600768473635679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1611600768473635679'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/06/ok-mr-customeryour-software-is-late.html' title='Ok Mr. Customer…your software is late what are you gonna do now?'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3780320721037329923</id><published>2009-06-09T12:21:00.001-07:00</published><updated>2009-06-09T12:24:17.206-07:00</updated><title type='text'>No guts no glory…</title><content type='html'>&lt;p&gt;Many enterprises pay lip service to agile. They wax lyrical about agility, but the minute one practices the principles that espouse agility, they run for cover in the command and control cave. This cavern contains the usual paraphernalia of document heavy processes, bottled-necked decision throughput and the waterfall methodology. Funny really, but not surprising as some corporate types are quick to latch on to the latest buzzwords without understanding the true essence of the discipline.&lt;/p&gt;  &lt;p&gt;As they say…”talk is cheap”. The agile acid test has got to be: ”if it talks like agile;walks like agile and smells like agile then it is agile. A form of agile duck-typing if ever there was such a thing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3780320721037329923?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3780320721037329923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3780320721037329923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3780320721037329923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3780320721037329923'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/06/no-guts-no-glory.html' title='No guts no glory…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2519025675956779666</id><published>2009-05-23T06:16:00.001-07:00</published><updated>2009-05-23T06:16:39.515-07:00</updated><title type='text'>The Last Mile</title><content type='html'>&lt;p&gt;How do you walk your software product through the wilderness of dumb users, dodgy machine builds and missing dependencies? &lt;/p&gt;  &lt;p&gt;You want to reduce your support footprint and the dysfunction of dealing with false positives(i.e. it’s your software not my machine syndrome). If you have control of the deployment landscape then a standardised machine build and knowledgeable first line support come in handy. Otherwise online users forums and comprehensive user documentation will help share knowledge of work arounds, gotchas and technical Voodo. The last thing you want is for the development team to be constantly building patches to support all machines under the sun. Doing this robs the team of the precious time required to develop new features and enrich the product’s functionality.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2519025675956779666?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2519025675956779666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2519025675956779666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2519025675956779666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2519025675956779666'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/05/last-mile.html' title='The Last Mile'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3867101452816848591</id><published>2009-05-23T05:57:00.001-07:00</published><updated>2009-05-23T06:28:47.283-07:00</updated><title type='text'>Time and Tide and Software releases…</title><content type='html'>&lt;p&gt;My team releases software every week regardless of the political landscape or inefficiencies of other departments. Ours is a disciplined and rigorous approach, we aim to be proactive and to keep the momentum forward, never backward. After all this is agile and we embrace the iterative and incremental nature of our game. To the gentlemen from the hydro-methodology this does not make sense. Surely you should only release when the business say so and when the business are ready for your release. If we did that then we would be constrained by the same inefficiencies that plague other teams. And that aint agile. So I suppose time and tide and software releases wait for no man.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3867101452816848591?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3867101452816848591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3867101452816848591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3867101452816848591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3867101452816848591'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/05/time-and-tide-and-software-releases.html' title='Time and Tide and Software releases…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4136084128960362997</id><published>2009-05-02T04:28:00.001-07:00</published><updated>2009-05-02T05:39:22.437-07:00</updated><title type='text'>Refactoring to a fluent configuration interface</title><content type='html'>&lt;font face="Times New Roman"&gt;The starting point was a configuration class that had the following definition: &lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;&lt;span style="color: blue"&gt;public const decimal &lt;/span&gt;AdultFactor = 6; &lt;br&gt;&lt;span style="color: blue"&gt;public const decimal &lt;/span&gt;ChildrenFactor = 3; &lt;br&gt;&lt;span style="color: blue"&gt;public const decimal &lt;/span&gt;GasKwHMinEstThreshold = 4000; &lt;br&gt;:&lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;These parameters are always used together in the context of a calculation for gas consumption. The client code uses these config values in the following fashion: &lt;br&gt;&lt;br&gt;calculatedUsageKw = AdjustUsageForRadiators(calculatedUsageKw, &lt;span style="color: #2b91af"&gt;GasConfiguration&lt;/span&gt;.AdultFactor, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;GasConfiguration&lt;/span&gt;.ChildrenFactor, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;GasConfiguration&lt;/span&gt;.RadiatorFactor, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;GasConfiguration&lt;/span&gt;.PersonsAtPropertyFactor);&lt;/font&gt; &lt;pre class="code"&gt;&lt;font face="Times New Roman"&gt;I wanted to give the setting of the gas consumption parameters a fluid feel in the following style&lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IFluentConfiguration &lt;/span&gt;Create()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;fluentConfig = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GasConfigurationFluent&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;    fluentConfig.SetAdultFactor(6).SetChildrenFactor(3).&lt;br /&gt;        SetGasKwHMinEstThreshold(4000).SetGasPointsMinThreshold(12).&lt;br /&gt;        SetGasPointsToKwHConvFactor(400).SetGasWaterHeatingAmount(10).&lt;br /&gt;        SetHobGasCooker(4).SetMainRoomFireOnGas(16).&lt;br /&gt;        SetPersonsAtPropertyFactor(2).SetRadiatorFactor(5);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;fluentConfig;&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;The client code accessing the fluent configuration interface was refactored to:&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private decimal&lt;/span&gt;? AdjustUsageForRadiators(&lt;span style="color: blue"&gt;decimal&lt;/span&gt;? calculatedUsageKw, &lt;span style="color: #2b91af"&gt;IFluentConfiguration &lt;/span&gt;fluentConfig)&lt;br&gt;&lt;br&gt;&lt;font face="Times New Roman"&gt;The &lt;span style="color: #2b91af"&gt;GasConfigurationFluent &lt;/span&gt;has setters that take the folllowing general approach:&lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IFluentConfiguration &lt;/span&gt;SetAdultFactor(&lt;span style="color: blue"&gt;decimal&lt;/span&gt;? adultFactor)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AdultFactor = adultFactor;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return this&lt;/span&gt;;&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;And yes my setters have a return value which is in effect the current context i.e. my fluent configuration.&lt;/font&gt;&lt;font face="Times New Roman"&gt;After applying this refactoring, a few things became apparent,&lt;br&gt;&lt;/font&gt;&lt;font face="Times New Roman"&gt;1. The method chaining enforces the fact that these parameters exist in the same context and somewhat provides a cohesive view of my configuration interface. The setting of the configuration values is much more concise.&lt;br&gt;2. The cohesive nature of this configuration hints at the fact that a DSL(Domain Specific Language) could possibly be built around the calculation of gas consumption.&lt;/font&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4136084128960362997?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4136084128960362997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4136084128960362997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4136084128960362997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4136084128960362997'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/05/refactoring-to-fluent-configuration.html' title='Refactoring to a fluent configuration interface'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7190920502455404167</id><published>2009-05-01T09:56:00.001-07:00</published><updated>2009-05-01T14:09:29.155-07:00</updated><title type='text'>Wide laps</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_990MwuRZkU0/Sfspr4ZzQnI/AAAAAAAABCU/CxtVbkDWoCc/s1600-h/1241196939454-775572.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_990MwuRZkU0/Sfspr4ZzQnI/AAAAAAAABCU/CxtVbkDWoCc/s320/1241196939454-775572.jpg" alt="" id="BLOGGER_PHOTO_ID_5330900417774830194" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;If the benefits of having a wide sturdy lap were ever in question, then look no further. On the left is my company laptop firmly glued to my thigh. The other limb is supporting my XPS M1330; looking on in the background is the Inspiron 1525.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7190920502455404167?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7190920502455404167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7190920502455404167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7190920502455404167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7190920502455404167'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/05/wide-laps.html' title='Wide laps'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_990MwuRZkU0/Sfspr4ZzQnI/AAAAAAAABCU/CxtVbkDWoCc/s72-c/1241196939454-775572.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-898641244247786827</id><published>2009-04-30T14:04:00.001-07:00</published><updated>2009-04-30T14:04:50.536-07:00</updated><title type='text'>Yesterday’s  scrum</title><content type='html'>&lt;!--&lt;br /&gt;begin tag cloud : generated by TagCrowd.com&lt;br /&gt;Feel free to modify as long as you keep this notice.&lt;br /&gt;&lt;br /&gt;This code and its rendered image are released under the Creative Commons Attribution-Noncommercial 3.0 Unported License.&lt;br /&gt;http://creativecommons.org/licenses/by-nc/3.0/&lt;br /&gt;&lt;br /&gt;For commercial use licensing, visit http://tagcrowd.com/licensing.html&lt;br /&gt;--&gt;&lt;style type="text/css"&gt;&lt;br /&gt; &lt;!-- #htmltagcloud{ font-family:'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif; line-height:2.4em; word-spacing:normal; letter-spacing:normal; text-decoration:none; text-transform:none; text-align:justify; text-indent:0ex; background-color:#fff; margin:1em 1em 0em 1em; border:2px dotted #ddd; padding:2em}#htmltagcloud a:link{text-decoration:none}#htmltagcloud a:visited{text-decoration:none}#htmltagcloud a:hover{text-decoration:none;color:white;background-color:#05f}#htmltagcloud a:active{text-decoration:none;color:white;background-color:#03d}span.tagcloud0{font-size:1.0em;padding:0em;color:#ACC1F3;z-index:10;position:relative}span.tagcloud0 a{text-decoration:none; color:#ACC1F3}span.tagcloud1{font-size:1.4em;padding:0em;color:#ACC1F3;z-index:9;position:relative}span.tagcloud1 a{text-decoration:none;color:#ACC1F3}span.tagcloud2{font-size:1.8em;padding:0em;color:#86A0DC;z-index:8;position:relative}span.tagcloud2 a{text-decoration:none;color:#86A0DC}span.tagcloud3{font-size:2.2em;padding:0em;color:#86A0DC;z-index:7;position:relative}span.tagcloud3 a{text-decoration:none;color:#86A0DC}span.tagcloud4{font-size:2.6em;padding:0em;color:#607EC5;z-index:6;position:relative}span.tagcloud4 a{text-decoration:none;color:#607EC5}span.tagcloud5{font-size:3.0em;padding:0em;color:#607EC5;z-index:5;position:relative}span.tagcloud5 a{text-decoration:none;color:#607EC5}span.tagcloud6{font-size:3.3em;padding:0em;color:#4C6DB9;z-index:4;position:relative}span.tagcloud6 a{text-decoration:none;color:#4C6DB9}span.tagcloud7{font-size:3.6em;padding:0em;color:#395CAE;z-index:3;position:relative}span.tagcloud7 a{text-decoration:none;color:#395CAE}span.tagcloud8{font-size:3.9em;padding:0em;color:#264CA2;z-index:2;position:relative}span.tagcloud8 a{text-decoration:none;color:#264CA2}span.tagcloud9{font-size:4.2em;padding:0em;color:#133B97;z-index:1;position:relative}span.tagcloud9 a{text-decoration:none;color:#133B97}span.tagcloud10{font-size:4.5em;padding:0em;color:#002A8B;z-index:0;position:relative}span.tagcloud10 a{text-decoration:none;color:#002A8B}span.freq{font-size:10pt !important;color:#bbb}#credit{text-align:center; font-size:0.7em; color:#333; margin-bottom:0.6em; font-family:'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif;}#credit a:link{color:#777; text-decoration:none;}#credit a:visited{color:#777; text-decoration:none;}#credit a:hover{text-decoration:none; color:white; background-color:#05f;}#credit a:active{text-decoration:underline;}// --&gt; &lt;/style&gt;  &lt;div id="htmltagcloud"&gt;&lt;span class="tagcloud0" id="0"&gt;&lt;a href="#tagcloud"&gt;allocations&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="1"&gt;&lt;a href="#tagcloud"&gt;app&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="2"&gt;&lt;a href="#tagcloud"&gt;bindings&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="3"&gt;&lt;a href="#tagcloud"&gt;build&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud10" id="4"&gt;&lt;a href="#tagcloud"&gt;calculator&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="5"&gt;&lt;a href="#tagcloud"&gt;client&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="6"&gt;&lt;a href="#tagcloud"&gt;consumption&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="7"&gt;&lt;a href="#tagcloud"&gt;data&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="8"&gt;&lt;a href="#tagcloud"&gt;db&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="9"&gt;&lt;a href="#tagcloud"&gt;encapsulation&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="10"&gt;&lt;a href="#tagcloud"&gt;engine&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="11"&gt;&lt;a href="#tagcloud"&gt;expiration&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="12"&gt;&lt;a href="#tagcloud"&gt;factory&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="13"&gt;&lt;a href="#tagcloud"&gt;gas&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="14"&gt;&lt;a href="#tagcloud"&gt;getlatest&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="15"&gt;&lt;a href="#tagcloud"&gt;googlemaps&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="16"&gt;&lt;a href="#tagcloud"&gt;internal&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="17"&gt;&lt;a href="#tagcloud"&gt;log4net&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="18"&gt;&lt;a href="#tagcloud"&gt;loggin&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="19"&gt;&lt;a href="#tagcloud"&gt;manual&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="20"&gt;&lt;a href="#tagcloud"&gt;migrate&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="21"&gt;&lt;a href="#tagcloud"&gt;mode&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="22"&gt;&lt;a href="#tagcloud"&gt;pitching&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud10" id="23"&gt;&lt;a href="#tagcloud"&gt;price&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="24"&gt;&lt;a href="#tagcloud"&gt;process&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="25"&gt;&lt;a href="#tagcloud"&gt;provider&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="26"&gt;&lt;a href="#tagcloud"&gt;repository&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="27"&gt;&lt;a href="#tagcloud"&gt;scripts&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="28"&gt;&lt;a href="#tagcloud"&gt;service&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="29"&gt;&lt;a href="#tagcloud"&gt;simple&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="30"&gt;&lt;a href="#tagcloud"&gt;slow&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="31"&gt;&lt;a href="#tagcloud"&gt;sourcesafe&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="32"&gt;&lt;a href="#tagcloud"&gt;sqlmetal&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="33"&gt;&lt;a href="#tagcloud"&gt;streetview&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="34"&gt;&lt;a href="#tagcloud"&gt;subversion&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="35"&gt;&lt;a href="#tagcloud"&gt;synchronization&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="36"&gt;&lt;a href="#tagcloud"&gt;timeline&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="37"&gt;&lt;a href="#tagcloud"&gt;update&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="38"&gt;&lt;a href="#tagcloud"&gt;vss&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="39"&gt;&lt;a href="#tagcloud"&gt;walklist&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="40"&gt;&lt;a href="#tagcloud"&gt;webservice&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="41"&gt;&lt;a href="#tagcloud"&gt;windows&lt;/a&gt;&lt;/span&gt; &lt;span class="tagcloud0" id="42"&gt;&lt;a href="#tagcloud"&gt;wireframes&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;  &lt;div id="credit"&gt;created at &lt;a href="http://tagcrowd.com"&gt;TagCrowd.com&lt;/a&gt;&lt;/div&gt; &lt;!-- end tag cloud : generated by TagCrowd.com : please keep this notice --&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-898641244247786827?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/898641244247786827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=898641244247786827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/898641244247786827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/898641244247786827'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/yesterdays-scrum.html' title='Yesterday’s  scrum'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8090616089913841540</id><published>2009-04-23T11:33:00.001-07:00</published><updated>2009-04-24T01:56:56.128-07:00</updated><title type='text'>Dinner @ the inn</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/_990MwuRZkU0/SfC0lpdia3I/AAAAAAAABBw/8R76q6F7G8A/s1600-h/1240511541655-737679.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_990MwuRZkU0/SfC0lpdia3I/AAAAAAAABBw/8R76q6F7G8A/s320/1240511541655-737679.jpg" alt="" id="BLOGGER_PHOTO_ID_5327956918057200498" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;Yesterday was St. George's day and in celebration of the patron saint of England, I went to the local Inn where they had layed out the very best in English cuisine. This ranged from the curiously named toad in the hole to the delicious Shepherds Pie.&lt;br /&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8090616089913841540?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8090616089913841540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8090616089913841540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8090616089913841540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8090616089913841540'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/dinner-inn.html' title='Dinner @ the inn'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_990MwuRZkU0/SfC0lpdia3I/AAAAAAAABBw/8R76q6F7G8A/s72-c/1240511541655-737679.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8323652178379862646</id><published>2009-04-19T14:46:00.001-07:00</published><updated>2009-04-19T14:49:18.624-07:00</updated><title type='text'>When Paradigms Collide- Sorting Spatial Data using the List Metaphor</title><content type='html'>&lt;p&gt;Given a spatial dataset that comprises physical locations that must be traversed efficiently, what’s the simplest solution that would accomplish this task?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8323652178379862646?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8323652178379862646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8323652178379862646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8323652178379862646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8323652178379862646'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/when-paradigms-collide-sorting-spatial.html' title='When Paradigms Collide- Sorting Spatial Data using the List Metaphor'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5200650960073542253</id><published>2009-04-19T12:20:00.001-07:00</published><updated>2009-04-19T14:21:31.652-07:00</updated><title type='text'>Trouble booting from CDROM on Sunblade 100.</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_990MwuRZkU0/Set5kDxcB2I/AAAAAAAABBg/WGy2gr6xIBU/s1600-h/1240168616927-748550.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_990MwuRZkU0/Set5kDxcB2I/AAAAAAAABBg/WGy2gr6xIBU/s320/1240168616927-748550.jpg" alt="" id="BLOGGER_PHOTO_ID_5326484644690659170" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;Possible causes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Corrupted media&lt;/li&gt;&lt;li&gt;Faulty CDROM drive&lt;/li&gt;&lt;li&gt;Non-bootable media&lt;/li&gt;&lt;li&gt;SunOS 5.9 limitations booting Ubuntu/Solaris 10&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5200650960073542253?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5200650960073542253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5200650960073542253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5200650960073542253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5200650960073542253'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/trouble-booting-from-cdrom-on-sunblade.html' title='Trouble booting from CDROM on Sunblade 100.'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_990MwuRZkU0/Set5kDxcB2I/AAAAAAAABBg/WGy2gr6xIBU/s72-c/1240168616927-748550.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3039551227749410850</id><published>2009-04-19T10:50:00.001-07:00</published><updated>2009-04-19T10:56:14.876-07:00</updated><title type='text'>A lean view of scrum</title><content type='html'>&lt;p&gt;The sources of waste are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Third-party delays in providing inputs required for the upcoming sprints &lt;/li&gt;    &lt;li&gt;Stories with insufficient detail to ensure that the team proceeds without interruption &lt;/li&gt;    &lt;li&gt;Scrum is yet to gain traction; the old way of doing things still haunts the project &lt;/li&gt;    &lt;li&gt;Delayed feedback&lt;/li&gt;    &lt;li&gt;Developer distractions – meetings; problems with machines; network connectivity; complex build process &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3039551227749410850?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3039551227749410850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3039551227749410850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3039551227749410850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3039551227749410850'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/lean-view-of-scrum.html' title='A lean view of scrum'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1823512915753944446</id><published>2009-04-19T10:35:00.001-07:00</published><updated>2009-04-19T10:59:20.438-07:00</updated><title type='text'>NIH…</title><content type='html'>&lt;p&gt;When a developer inherits a codebase, there is always a case of NIH(not invented here) syndrome. I am guilty of it, but with experience and professional maturity I have become more objective in my evaluation of third-party codebases. Recently, I had the chance to work on a codebase that ticked all the boxes of what a good software application should contain. The codebase exhibited the following characteristics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Unit testing and Mock objects &lt;/li&gt;    &lt;li&gt;Dependency Injection &lt;/li&gt;    &lt;li&gt;IoC Containers &lt;/li&gt;    &lt;li&gt;MVC &lt;/li&gt;    &lt;li&gt;N-tier architecture(and a slight hint of domain driven design) &lt;/li&gt;    &lt;li&gt;Fluent Interfaces &lt;/li&gt;    &lt;li&gt;NANT builds &lt;/li&gt;    &lt;li&gt;Code-generation &lt;/li&gt;    &lt;li&gt;Template meta-programming(generics) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These are fairly advanced concepts in software engineering and represent the software engineering zeitgeist. Unfortunately these practices will be lost on the majority of enterprise developers(unless you are working in a dedicated software shop that’s at the bleeding edge). For the typical enterprise developer, this translates into is software that is harder to maintain, extend and for which the sprint velocity is going to be dismal. The inheritors of the codebase have the additional task of understanding the domain and the engineering approach.&lt;/p&gt;  &lt;p&gt;The question then becomes: how do you balance the need to create supple software systems whilst staying true to the software engineering discipline. Can you sacrifice the need for rigour in favour of comprehension and program understanding or vice-versa?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1823512915753944446?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1823512915753944446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1823512915753944446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1823512915753944446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1823512915753944446'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/nih.html' title='NIH…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3875764348739751957</id><published>2009-04-19T10:06:00.001-07:00</published><updated>2009-04-19T10:06:42.325-07:00</updated><title type='text'>From XP Developer to ScrumMaster</title><content type='html'>&lt;p&gt;As luck(or misfortune) would have it, I have been tasked with ensuring that the team delivers the right software on time and to the product owners’ satisfaction. My previous forays in extreme programming(XP) mean that there is zero cost of adoption of this new way of working. It could be argued that scrum and XP are polymorphic. They both inherit from the same agile shrub. &lt;/p&gt;  &lt;p&gt;It is tempting to approach the scrum master role from a developers’ perspective given that I am a developer to the core. But this misses the essence of being a scrum master. I need to balance the demands of the product owner with those of the development team whilst being aware of the latent political interests that subtly influence the project. Some of these interests have a less than positive impact on the project and are impediments that need to be reported if the project is not to grind to a halt.&lt;/p&gt;  &lt;p&gt;Agile is new to the organisation and the idea of product owners, sprint velocity, burn-down, sprints, product backlogs, sprint backlogs is alien in certain quarters. It is not uncommon to be asked to provide an estimate on the spot without consulting the team. My advice is don’t do it and don’t over commit the team.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3875764348739751957?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3875764348739751957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3875764348739751957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3875764348739751957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3875764348739751957'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/from-xp-developer-to-scrummaster.html' title='From XP Developer to ScrumMaster'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1656069887577488345</id><published>2009-04-18T14:57:00.001-07:00</published><updated>2009-04-19T11:03:04.141-07:00</updated><title type='text'>Mobile blogging</title><content type='html'>&lt;p&gt;First entry from Android G1. Mobile blogging is here...&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1656069887577488345?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1656069887577488345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1656069887577488345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1656069887577488345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1656069887577488345'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/04/mobile-blogging.html' title='Mobile blogging'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3548028242438435384</id><published>2009-03-24T03:34:00.000-07:00</published><updated>2009-03-24T04:16:44.804-07:00</updated><title type='text'>HPC Windows Project back on track</title><content type='html'>After a turbulent winter, I have now resumed work on the beowulf cluster project. All my weekends and evenings for the next quarter are already spent. I wonder how I will sell this proposition to the girlfriend. Perhaps a chilvarous pitch might do the trick..."Darling, it's a climate change calculation engine..."&lt;br /&gt;&lt;br /&gt;The next few weeks will see me configure the head node and install the SUN GRID ENGINE tools. Then the slave nodes will be configured and the obligatory benchmarking LINPACK tools will be executed to determine the cluster performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3548028242438435384?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3548028242438435384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3548028242438435384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3548028242438435384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3548028242438435384'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/hpc-windows-project-back-on-track.html' title='HPC Windows Project back on track'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1796044956161081748</id><published>2009-03-24T03:29:00.000-07:00</published><updated>2009-03-24T03:32:57.992-07:00</updated><title type='text'>We have a release candidate</title><content type='html'>After weeks of tireless effort, we have a candidate release for the product I am currently working on. It's WPF all the way through. We have successfully ported a Winform application to WPF. The WPF Toolkit has proved in making this migration painless. We can use controls that we have come to know and love on the Winform UI. Datagrids, DatePickers, DateTimePickers you name it the WPF ToolKit has them. We have had to make changes to the way these controls work and this is all possible because we have the sourcecode available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1796044956161081748?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1796044956161081748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1796044956161081748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1796044956161081748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1796044956161081748'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/we-have-release-candidate.html' title='We have a release candidate'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7860589676104022939</id><published>2009-03-09T10:46:00.000-07:00</published><updated>2009-03-10T14:42:22.545-07:00</updated><title type='text'>Good offshore code</title><content type='html'>Is as abundant as chicken teeth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7860589676104022939?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7860589676104022939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7860589676104022939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7860589676104022939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7860589676104022939'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/good-offshore-code.html' title='Good offshore code'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7546114398274238251</id><published>2009-03-07T04:54:00.001-08:00</published><updated>2009-03-07T04:54:23.873-08:00</updated><title type='text'>MVVM a view gone too far?</title><content type='html'>&lt;p&gt;After spending a week spiking this for a tablet PC application, it&amp;#160; quickly dawned on me that the ViewModel, the data specialised for the view is really an &lt;em&gt;adapter pattern. &lt;/em&gt;The model is adapted to suit the expectations of the WPF UI. Adapting the model for the view means that you can essentially ignore converters.&lt;/p&gt;  &lt;p&gt;//TODO:Add code&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7546114398274238251?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7546114398274238251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7546114398274238251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7546114398274238251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7546114398274238251'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/mvvm-view-gone-too-far.html' title='MVVM a view gone too far?'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2860517069533386551</id><published>2009-03-07T04:45:00.001-08:00</published><updated>2009-03-24T03:34:26.930-07:00</updated><title type='text'>“But it’s auto-generated, so why does it need to be unit tested?”</title><content type='html'>&lt;p&gt;I recently overheard a conversation in which one developer was explaining the legacy code he had inherited to a new starter on the team. The developer described the code generators and the accompanying unit tests for the generated artifacts. Naturally the new developer asked why they needed unit tests if they were &lt;em&gt;automagically&lt;/em&gt; making this stuff. This is a valid question and one which does beg a decent answer. I will try to answer the question based on my experience as a test-infected developer.&lt;/p&gt;  &lt;p&gt;My response is as follows:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Auto-generation of software artifacts does not guarantee correctness. This is a garbage-in-garbage-out view of code generation. Engineers need to be sure that the changes that will inevitably occur in the code generation templates do not introduce defects. By running unit tests against the generated code you are testing that the generators works as they should and that specified inputs produce predictable outputs. The unit tests enforce the &lt;em&gt;implied contract&lt;/em&gt; which stipulates that my code generator should always produce artifacts that do &lt;em&gt;X.&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Unit tests provide a reliable and repeatable way of regression testing the outputs of the generated artifacts. A change to the code templates might introduce subtle bugs. How else would you be able to detect these in the absence of automated unit testing. You are covering your own hide by having a battery of tests. &lt;/li&gt;    &lt;li&gt;Unit tests allow you to develop with courage. You get immediate feedback when defects are introduced into the codebase (this assumes you are continuously running your tests, which you should). &lt;/li&gt;&lt;li&gt;The quality of the unit tests also dictates the testing experience. Several heuristics exist for developing good tests.&lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2860517069533386551?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2860517069533386551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2860517069533386551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2860517069533386551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2860517069533386551'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/but-its-auto-generated-so-why-does-it.html' title='“But it’s auto-generated, so why does it need to be unit tested?”'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-9007373125849367719</id><published>2009-03-06T17:31:00.000-08:00</published><updated>2009-03-06T17:47:24.029-08:00</updated><title type='text'>Working with legacy code</title><content type='html'>I have recently been tasked with migrating an MVC winform application to WPF. Looking at the existing codebase, I cannot reuse any of the controllers because they are very aware of the winforms view. This is fine because the controller handles gestures from the view and should thus know the view for which it controls. So we are faced with migrating the behaviour in our winforms-centric controllers to WPF controllers.&lt;br /&gt;&lt;br /&gt;The model code is well developed as is the accompanying repository. However the need for master/detail views in WPF means that we are going to have to alter the readonly properties in the domain objects. But do we really want to change the legacy code?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-9007373125849367719?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/9007373125849367719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=9007373125849367719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/9007373125849367719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/9007373125849367719'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/03/working-with-legacy-code.html' title='Working with legacy code'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4008261269440489044</id><published>2009-02-21T11:25:00.001-08:00</published><updated>2009-02-21T14:47:51.198-08:00</updated><title type='text'>Who should manage the layout of my modular UI (WPF context)?</title><content type='html'>&lt;p&gt;The easy answer is : “the &lt;span style="font-style: italic;"&gt;LayoutManager&lt;/span&gt;”. Does layout responsibility rest with the view or controller(ref MVC)? Whose business is it to know about the positioning of modular control xxx and whether it should be visible when an element in modular control zzz is clicked.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;How do I make the best use of the MVC triad when I need to precisely manage my modular UI layout.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Do I need a view specific layout controller that is pixel and coordinate aware, perhaps a variation of the MV&lt;em&gt;C&lt;/em&gt;C&lt;em&gt;? &lt;/em&gt;Should the additional &lt;em&gt;C &lt;/em&gt;reside in the xaml code behind or can I weave in the layout rules at runtime? When the scope for cross window navigation is severely restricted what pattern can I turn to?&lt;/p&gt;  &lt;p&gt; My current problem domain brings these questions to the fore.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;GUI layout tends to be orthogonal to the core concerns of application development, yet it is critical to the success and acceptability of the application. To the user, the &lt;span style="font-style: italic; font-weight: bold;"&gt;UI is the application&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;I will be prototyping various approaches to this vexatious issue in an attempt to develop a maintainable approach. At present a finite state approach in which the main actors are the view and some layout policy seems likely.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4008261269440489044?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4008261269440489044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4008261269440489044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4008261269440489044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4008261269440489044'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/who-should-manage-layout-of-my-modular.html' title='Who should manage the layout of my modular UI (WPF context)?'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2806828782872795497</id><published>2009-02-21T11:00:00.001-08:00</published><updated>2009-02-21T11:27:30.021-08:00</updated><title type='text'>When everything is a DependencyProperty, life’s a beach…</title><content type='html'>&lt;p&gt;When faced with a requirement to automatically generate parts of a modular UI based on events raised by interaction with other controls, the question is normally, how do I position the generate controls in such a way that there is no conflict between my design-time view of the UI and it’s runtime view.&lt;/p&gt;  &lt;p&gt;Combining the grid layout and use of DependencyProperty resolves this dilemma&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;VanillaLayoutTemplate()&lt;br /&gt;{&lt;br /&gt;    InitializeComponent();&lt;br /&gt;    PositionGroupControlsInFirstColumn();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;PositionGroupControlsInFirstColumn()&lt;br /&gt;{&lt;br /&gt;    CaptureOutComeGroup.SetValue(&lt;span style="color: #2b91af"&gt;Grid&lt;/span&gt;.ColumnProperty, 0);&lt;br /&gt;    ProductServicesGroup.SetValue(&lt;span style="color: #2b91af"&gt;Grid&lt;/span&gt;.ColumnProperty,0);            &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The &lt;em&gt;CaptureOutComeGroup &lt;/em&gt;and&lt;em&gt; ProductServicesGroup &lt;/em&gt;represent a hidden control that is positioned in the first column. When the page is rendered, the 2 controls are overlapped and hidden; visibility is managed by the user providing various inputs. &lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2806828782872795497?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2806828782872795497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2806828782872795497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2806828782872795497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2806828782872795497'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/when-everything-is-dependencyproperty.html' title='When everything is a DependencyProperty, life’s a beach…'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-589520845205378629</id><published>2009-02-21T10:45:00.001-08:00</published><updated>2009-02-21T10:47:38.565-08:00</updated><title type='text'>WPF Toolkit and the DatePicker Control</title><content type='html'>&lt;p&gt;The journey started out with a hunt for a date control that would form part of the user interface. The core WPF API does not come equipped with this capability so I decided rather than lose precious time trying to build one, I would Google for it.&lt;/p&gt;  &lt;p&gt;A download from CodePlex later, I had the binaries&amp;#160; on the development machine and I was ready to rock. Lo and behold…there was none of the precious documentation that us developers have become fat on, but as I soon discovered integrating the control is pretty simple.&lt;/p&gt;  &lt;p&gt;I added the new assembly reference to VS2008 and this was loaded as shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/SaBLp2Hh_oI/AAAAAAAAA_8/U-gzkQBlnPI/s1600-h/image%5B6%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="103" alt="image" src="http://lh5.ggpht.com/_990MwuRZkU0/SaBLqSAny5I/AAAAAAAABAA/4RhEr6qtUT8/image_thumb%5B2%5D.png?imgmax=800" width="167" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The XAML for the integrated control is&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GroupBox &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;5&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Header&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Call back notes&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;FontSize&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;14&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;1,1,1,308&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Visibility&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Hidden&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;CallBackNotesGroup&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;5&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;218&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Top&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;2,2,2,2&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;textBox1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;TextWrapping&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Wrap&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;MaxWidth&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;300&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;MaxHeight&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;120&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Black&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;&lt;strong&gt;        &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #a31515"&gt;Controls&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;DatePicker&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: blue"&gt;&amp;gt;                    &lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Controls&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;DatePicker&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;3&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;2,2,2,2&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;button1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;FontSize&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;14&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;163&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Left&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Arrange call back&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;GroupBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The rendered UI looks something like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/SaBLrAsYnvI/AAAAAAAABAE/PprmzVs2Tk8/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/SaBLsJRWNsI/AAAAAAAABAI/k6OQq9ZoCqs/image_thumb%5B1%5D.png?imgmax=800" width="429" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The control exhibits automatic polite validation behaviour which is activated when an invalid date string is entered in the text box. That’s one layer of validation that I don’t need to worry about!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-589520845205378629?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/589520845205378629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=589520845205378629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/589520845205378629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/589520845205378629'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/wpf-toolkit-and-datepicker-control.html' title='WPF Toolkit and the DatePicker Control'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_990MwuRZkU0/SaBLqSAny5I/AAAAAAAABAA/4RhEr6qtUT8/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2839988330902073782</id><published>2009-02-15T16:36:00.001-08:00</published><updated>2009-02-15T16:43:27.036-08:00</updated><title type='text'>Generating the lattice from first principles</title><content type='html'>&lt;p&gt;In an attempt to model the binomial lattice, I will have to generate the lattice data structure and decorate it with various properties(probabilities, prices, node Id’s etc), so I thought I would approach the problem by first generating the node Ids for each time-step. So here we go:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;GenerateLatticeNodes()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;numberOfTimeSteps = 20;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;nodes = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;();&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;nodeId = 1;&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;i = 0; i &amp;lt; numberOfTimeSteps; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;numberOfNodes = i + 1;&lt;br /&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;nodesAtTimeStep = &lt;span style="color: blue"&gt;new int&lt;/span&gt;[numberOfNodes]; ;&lt;br /&gt;        &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;j = 0; j &amp;lt; numberOfNodes; j++)&lt;br /&gt;            nodesAtTimeStep[j] = nodeId++;&lt;br /&gt;        nodes.Add(i,nodesAtTimeStep);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: green"&gt;//What no test?&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For the moment this is just a collection of identifiers to which the object richness( the notion of a node having asset price, probability of up/down movement etc) will be added.&lt;br /&gt;  &lt;br /&gt;The node numbering scheme adopted is such that the initial node is 1 and subsequent nodes are numbered incrementally in an up/down fashion.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2839988330902073782?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2839988330902073782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2839988330902073782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2839988330902073782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2839988330902073782'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/generating-lattice-from-first.html' title='Generating the lattice from first principles'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6402751977524816248</id><published>2009-02-09T03:01:00.000-08:00</published><updated>2009-02-09T03:21:43.209-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='money'/><title type='text'>Probability diffusion in the binomial lattice</title><content type='html'>&lt;p&gt;Given that we can express the diffusion of asset prices in the binomial tree as a summation of the form&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_990MwuRZkU0/SY-I5bNdnkI/AAAAAAAAA-4/lsCTN-RfY2Y/s1600-h/StockPriceDiffusion%5B2%5D.gif"&gt;&lt;img title="StockPriceDiffusion" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="22" alt="StockPriceDiffusion" src="http://lh4.ggpht.com/_990MwuRZkU0/SY-I52w9oKI/AAAAAAAAA-8/_zpj9ari8k0/StockPriceDiffusion_thumb.gif?imgmax=800" width="110" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The expected stock price at a given time-step can be expressed in terms of the probability, &lt;em&gt;p&lt;/em&gt;, of an upward movement, u, of the underlying asset. Conversely the probability of a downward movement in the asset price is denoted as &lt;em&gt;1-p, &lt;/em&gt;where d, is the amount by which the stock moves down. Hence the expected asset price at the first time-step can be summarised as:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_990MwuRZkU0/SY-I6IaKWlI/AAAAAAAAA_A/diHb1SUKWyw/s1600-h/_pictures_6e8818db5897541a07a9ed229e960947_1234120512%5B3%5D.gif"&gt;&lt;img title="_pictures_6e8818db5897541a07a9ed229e960947_1234120512" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="98" alt="_pictures_6e8818db5897541a07a9ed229e960947_1234120512" src="http://lh5.ggpht.com/_990MwuRZkU0/SY-I6ppL4fI/AAAAAAAAA_E/OAJFOI8Ahho/_pictures_6e8818db5897541a07a9ed229e960947_1234120512_thumb%5B1%5D.gif?imgmax=800" width="271" border="0" /&gt;&lt;/a&gt;Why the vectors? Well I suppose there is a directional, albeit unidirectional, aspect to the diffusion. We are interested in heading towards the future and ascertaining the expected value of the asset at the expiry date.&lt;/p&gt;  &lt;p&gt;The obvious question then becomes, “how do we generalize the findings above for a binomial tree with &lt;em&gt;n &lt;/em&gt;time-steps?” &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/SZARwQCuUgI/AAAAAAAAA_Y/g8fv_oPQsNI/s1600-h/Probabilities%20general%20equation.latex%5B25%5D.png"&gt;&lt;img title="Probabilities general equation.latex" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="204" alt="Probabilities general equation.latex" src="http://lh3.ggpht.com/_990MwuRZkU0/SZARxr2Ab9I/AAAAAAAAA_c/3UtlJiJNwjQ/Probabilities%20general%20equation.latex_thumb%5B15%5D.png?imgmax=800" width="509" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; The probability diffusion for each time-step appears to follow the summation above. A few tests should be enough to prove whether this is actually the case.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6402751977524816248?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6402751977524816248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6402751977524816248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6402751977524816248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6402751977524816248'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/probability-diffusion-in-binomial.html' title='Probability diffusion in the binomial lattice'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_990MwuRZkU0/SY-I52w9oKI/AAAAAAAAA-8/_zpj9ari8k0/s72-c/StockPriceDiffusion_thumb.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5250529146392318632</id><published>2009-02-06T13:58:00.001-08:00</published><updated>2009-02-06T18:11:22.644-08:00</updated><title type='text'>Modelling the growth of asset prices in a binomial lattice</title><content type='html'>&lt;p&gt;Why would we want to do this? Well one of the key decisions when pricing call options using a binomial lattice is whether it is optimal to exercise the option or let the option lapse. We need to know whether we are in the money or not. The value of the asset price in relation to the strike price is a good indicator. If the asset is cheaper in the spot market we let the option lapse, otherwise we exercise the option, buy the asset at the strike price and sell it on the spot market making ourselves a tidy little profit :).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/SYztxvDSXHI/AAAAAAAAA88/N3_kASNHGy4/s1600-h/image%5B13%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="462" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/SYztyYnlJpI/AAAAAAAAA9A/vyGTttofmVM/image_thumb%5B5%5D.png?imgmax=800" width="586" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Starting at time &lt;em&gt;t=0&lt;/em&gt; and given that the volatility of the asset is &lt;em&gt;&lt;strong&gt;d &lt;/strong&gt;&lt;/em&gt;and &lt;strong&gt;&lt;em&gt;u,&lt;/em&gt; &lt;/strong&gt;the asset prices for a given time-step follow the distribution:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_990MwuRZkU0/SYyyhUZg5FI/AAAAAAAAA8s/5a1roaAylgc/s1600-h/asset.prices.latex%5B12%5D.gif"&gt;&lt;img title="asset.prices.latex" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="222" alt="asset.prices.latex" src="http://lh5.ggpht.com/_990MwuRZkU0/SYyyh87pIYI/AAAAAAAAA8w/pfHDHB8wRqc/asset.prices.latex_thumb%5B10%5D.gif?imgmax=800" width="449" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;pre class="code"&gt;We then proceed to test the assertion above using NUnit &lt;br /&gt;(note the syntactic sugar which makes the testing of collections much more direct)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;Test&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;StockPriceGrowth()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;t = 2;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;u = 1.1;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;d = 0.9;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;initialAssetPrice = 20;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;stockPrices = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;();&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;expectedAssetPrices= &lt;span style="color: blue"&gt;new&lt;/span&gt;[] {24.2,19.8,16.2};&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;i = 0; i &amp;lt;= t; i++)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;stockPrice = &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Round(initialAssetPrice * (&lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Pow(u, t - i) * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Pow(d, i)), 2);&lt;br /&gt;        stockPrices.Add(stockPrice);&lt;br /&gt;    }            &lt;br /&gt;    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.That(stockPrices,&lt;span style="color: #2b91af"&gt;Is&lt;/span&gt;.EquivalentTo(expectedAssetPrices));&lt;br /&gt;}&lt;br /&gt;And hooray we get the greenbar! &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;a href="http://lh6.ggpht.com/_990MwuRZkU0/SYzXVMMNPbI/AAAAAAAAA80/fbxFx6HgG2A/s1600-h/image%5B5%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="195" alt="image" src="http://lh3.ggpht.com/_990MwuRZkU0/SYzXWALuvrI/AAAAAAAAA84/81cImd6N200/image_thumb%5B1%5D.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;The stock price generation behaviour belongs to a utility class responsible for generating the asset prices&lt;br /&gt;at given time-step, so we refactor the test to the following:&lt;br /&gt;[&lt;span style="color: #2b91af"&gt;Test&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;StockPriceGrowth()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;t = 2;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;u = 1.1;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;d = 0.9;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;initialAssetPrice = 20;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;expectedAssetPrices= &lt;span style="color: blue"&gt;new&lt;/span&gt;[] {24.2,19.8,16.2};&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;stockPrices = &lt;span style="color: #2b91af"&gt;BinomialCalculator&lt;/span&gt;.StockPricesForTimeStep(t,u,d,initialAssetPrice);&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.That(stockPrices,&lt;span style="color: #2b91af"&gt;Is&lt;/span&gt;.EquivalentTo(expectedAssetPrices));&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5250529146392318632?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5250529146392318632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5250529146392318632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5250529146392318632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5250529146392318632'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/modelling-growth-of-asset-prices-in.html' title='Modelling the growth of asset prices in a binomial lattice'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_990MwuRZkU0/SYztyYnlJpI/AAAAAAAAA9A/vyGTttofmVM/s72-c/image_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6325737770217333935</id><published>2009-02-05T15:49:00.001-08:00</published><updated>2009-02-05T15:56:00.924-08:00</updated><title type='text'>Generalising the binomial lattice for pricing European options</title><content type='html'>&lt;p&gt;As luck would have it, I am now building a binomial lattice pricing model that employs the concepts of risk neutral valuation, risk free rate and expected option values at a given time step. I am approaching the problem from a computational angle; I am investigating the computational efficiency and complexity of the resulting algorithm as well as the parallelizability of the code. For each node in the lattice I aim to calculate the polynomial representing the probability function. Summing these node polynomials for a given time step and applying backwardation should yield the net present value of the of the option. The scope of this investigation is limited to European call options, but with more work I should be able to extend this to price American options.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6325737770217333935?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6325737770217333935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6325737770217333935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6325737770217333935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6325737770217333935'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/generalising-binomial-lattice-for.html' title='Generalising the binomial lattice for pricing European options'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6217221354711453404</id><published>2009-02-04T11:35:00.001-08:00</published><updated>2009-02-04T11:37:20.976-08:00</updated><title type='text'>Southern Railway broken payment processing workflow</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/SYnuCLmvOuI/AAAAAAAAA8k/V0LfTIQpK_c/s1600-h/04-02-2009%2018-55-54%5B4%5D.png"&gt;&lt;img title="04-02-2009 18-55-54" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="341" alt="04-02-2009 18-55-54" src="http://lh4.ggpht.com/_990MwuRZkU0/SYnuDkzAn5I/AAAAAAAAA8o/-vtgMUYPpTs/04-02-2009%2018-55-54_thumb%5B2%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Just how bad does it get? It seems the failure of the train system is really systemic. How could this happen on a live site that takes payments? It does not fill me with a lot of confidence; I guess the passwords are probably stored in clear text in the database.&lt;/p&gt;  &lt;p&gt;This little episode transpired whilst I was trying to purchase a season ticket(annual train ticket). It happened right at the end of the workflow. The culprit: &lt;strong&gt;&lt;em&gt;a missing include file&lt;/em&gt;&lt;/strong&gt;; does this stuff ever get tested. Just because it works in the dev environment does not guarantee that it will work in the live.&amp;#160; You would have thought that the deployment process, plus configuration management and the army of QA testers would have caught this, but it seems they never made it into the office due to the snowy conditions. Sigh.&lt;/p&gt;  &lt;p&gt;Automated unit and functional tests would most probably have created visibility of this issue.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6217221354711453404?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6217221354711453404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6217221354711453404' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6217221354711453404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6217221354711453404'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/02/southern-railway-broken-payment.html' title='Southern Railway broken payment processing workflow'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_990MwuRZkU0/SYnuDkzAn5I/AAAAAAAAA8o/-vtgMUYPpTs/s72-c/04-02-2009%2018-55-54_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6587554973725739037</id><published>2009-01-11T12:46:00.001-08:00</published><updated>2009-01-11T12:52:29.932-08:00</updated><title type='text'>Integrating NHibernate with WPF</title><content type='html'>&lt;p&gt;A few things to watch out for when you do this integration:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Ensure that the &lt;em&gt;hibernate.cfg.xml &lt;/em&gt;file is present. &lt;/li&gt;    &lt;li&gt;Set the properties for the hibernate configuration file so that it is always copied to the output folder(bin/debug for debugging),&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_990MwuRZkU0/SWpcCj_D9-I/AAAAAAAAA7U/xqZhaAHQnAs/s1600-h/11-01-2009%2020-49-01%5B3%5D.png"&gt;&lt;img title="11-01-2009 20-49-01" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="173" alt="11-01-2009 20-49-01" src="http://lh3.ggpht.com/_990MwuRZkU0/SWpcDevfjLI/AAAAAAAAA7Y/N2ibyWsZEyo/11-01-2009%2020-49-01_thumb%5B1%5D.png?imgmax=800" width="351" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; failure to do will result in the following error: &lt;em&gt;“An exception occurred during configuration of persistence layer.”&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_990MwuRZkU0/SWpak1cnmpI/AAAAAAAAA7M/gbThUBURwR8/s1600-h/11-01-2009%2020-36-18%5B15%5D.png"&gt;&lt;img title="11-01-2009 20-36-18" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="553" alt="11-01-2009 20-36-18" src="http://lh3.ggpht.com/_990MwuRZkU0/SWpaoCoAYeI/AAAAAAAAA7Q/1gPoFTb_9j8/11-01-2009%2020-36-18_thumb%5B13%5D.png?imgmax=800" width="768" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6587554973725739037?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6587554973725739037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6587554973725739037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6587554973725739037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6587554973725739037'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/01/integrating-nhibernate-with-wpf.html' title='Integrating NHibernate with WPF'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_990MwuRZkU0/SWpcDevfjLI/AAAAAAAAA7Y/N2ibyWsZEyo/s72-c/11-01-2009%2020-49-01_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1448765096700827027</id><published>2009-01-11T09:36:00.000-08:00</published><updated>2009-01-11T10:01:33.373-08:00</updated><title type='text'>Converting an XBAP to a WPF application</title><content type='html'>&lt;p&gt; After starting out on the XBAP route and quickly hitting the sandbox limit it was time to actually move to an application paradigm that would support file access as well as database interaction. So I decided I had to convert the XBAP to a plain old WPF application.   &lt;br /&gt;    &lt;br /&gt;I added a new Window1.xaml file and reconfigured the start url in the App.xaml file to point to the newly added file.&lt;/p&gt;  &lt;p&gt;After messing around with&amp;#160; the property sheet for the solution, I proceeded to compile the solution and&amp;#160; instead ended up with the following error message.   &lt;br /&gt;&lt;/p&gt; &lt;a href="http://lh3.ggpht.com/_990MwuRZkU0/SWoz-u2m3mI/AAAAAAAAA7E/_Mwb8fJmMw4/s1600-h/11-01-2009%2017-42-40%5B2%5D.png"&gt;&lt;img title="11-01-2009 17-42-40" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="119" alt="11-01-2009 17-42-40" src="http://lh4.ggpht.com/_990MwuRZkU0/SWoz_PoJg0I/AAAAAAAAA7I/da2Hgb5uByU/11-01-2009%2017-42-40_thumb.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;There was not an option to change the setting until I poked in the *.csproj( the project definition file) file which contained the relevant xml nodes &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;IsWebBootstrapper&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;, &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;HostInBrowser&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; and &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TargetZone&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;. &lt;font color="#000000"&gt;Delete these nodes and F5 the project.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Configuration &lt;/span&gt;&lt;span style="color: red"&gt;Condition&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;'$(Configuration)' == '' &lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Configuration&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Platform &lt;/span&gt;&lt;span style="color: red"&gt;Condition&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;'$(Platform)' == '' &lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;AnyCPU&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Platform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SchemaVersion&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2.0&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SchemaVersion&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProjectGuid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;{DDA5DF2A-BCAF-4B2E-9A86-7E7F5F8292C7}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProjectGuid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;OutputType&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;WinExe&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;OutputType&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;AppDesignerFolder&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Properties&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;AppDesignerFolder&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RootNamespace&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;CharityWorkSpace.Zainco.YCW.CRM&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;RootNamespace&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;CharityWorkSpace.YCW&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TargetFrameworkVersion&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;v3.5&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TargetFrameworkVersion&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;FileAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;512&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;FileAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProjectTypeGuids&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProjectTypeGuids&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;WarningLevel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;4&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;WarningLevel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;EnableSecurityDebugging&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;EnableSecurityDebugging&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StartAction&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;URL&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StartAction&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;HostInBrowser&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;HostInBrowser&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TargetZone&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Internet&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TargetZone&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GenerateManifests&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;GenerateManifests&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SignManifests&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SignManifests&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ManifestKeyFile&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Records Management_TemporaryKey.pfx&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ManifestKeyFile&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ManifestCertificateThumbprint&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;3327D64CAF3D6C7423AD45AC8121C526DB8AB168&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ManifestCertificateThumbprint&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;IsWebBootstrapper&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;IsWebBootstrapper&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1448765096700827027?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1448765096700827027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1448765096700827027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1448765096700827027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1448765096700827027'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/01/converting-xbap-to-wpf-application.html' title='Converting an XBAP to a WPF application'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_990MwuRZkU0/SWoz_PoJg0I/AAAAAAAAA7I/da2Hgb5uByU/s72-c/11-01-2009%2017-42-40_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5223070758116251838</id><published>2009-01-07T05:22:00.001-08:00</published><updated>2009-01-07T09:46:34.593-08:00</updated><title type='text'>StaleStateException</title><content type='html'>&lt;p&gt;NHibernate.StaleStateException: Unexpected row count: 0; expected: 1&lt;/p&gt;  &lt;p&gt;at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement)   &lt;br /&gt;at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)    &lt;br /&gt;at NHibernate.Persister.Collection.AbstractCollectionPersister.Recreate(IPersistentCollection collection, Object id, ISessionImplementor session)    &lt;br /&gt;at NHibernate.Action.CollectionRecreateAction.Execute()    &lt;br /&gt;at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)    &lt;br /&gt;at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)    &lt;br /&gt;at NHibernate.Engine.ActionQueue.ExecuteActions()    &lt;br /&gt;at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)    &lt;br /&gt;at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)    &lt;br /&gt;at NHibernate.Impl.SessionImpl.Flush()    &lt;br /&gt;at NHibernate.Transaction.AdoTransaction.Commit()    &lt;br /&gt;at Zainco.YCW.Tests.Group.AddYCWGroup() in &lt;a href="file%3A%2F%2F794EEEA1-045D-4DE7-9EC3-79B475C61021%2Ff%3AGroup.cs%3Fline%3D70%26column%3D1"&gt;Group.cs: line 70&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This usually means that your database is in an inconsistent state(now say that quickly):&lt;/p&gt;  &lt;p&gt;UPDATE MyTable SET Description=’xxxx’&amp;#160; WHERE Id=123;&lt;/p&gt;  &lt;p&gt;If an updateable record is not found , then the exception above is thrown. Ensure that you have applied the cascade attribute on the relevant associated objects.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5223070758116251838?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5223070758116251838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5223070758116251838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5223070758116251838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5223070758116251838'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/01/stalestateexception.html' title='StaleStateException'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4091129314594459147</id><published>2009-01-02T10:54:00.001-08:00</published><updated>2009-01-02T11:22:38.050-08:00</updated><title type='text'>Joined-Subclass exception</title><content type='html'>&lt;p&gt;&lt;font color="#0000ff"&gt;NHibernate.MappingException: 'extends' attribute is not found.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;at NHibernate.Cfg.XmlHbmBinding.ClassBinder.GetSuperclass(XmlNode subnode)     &lt;br /&gt;at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddJoinedSubclasses(XmlNode parentNode)      &lt;br /&gt;at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;NHibernate.MappingException: Could not compile the mapping document: Zainco.YCW.Components.Mappings.Member.hbm.xml&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)     &lt;br /&gt;at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)      &lt;br /&gt;at NHibernate.Cfg.Configuration.ProcessMappingsQueue()      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)      &lt;br /&gt;at NHibernate.Cfg.Configuration.AddAssembly(String assemblyName)      &lt;br /&gt;at NHibernate.Cfg.Configuration.DoConfigure(IHibernateConfiguration hc)      &lt;br /&gt;at NHibernate.Cfg.Configuration.Configure()      &lt;br /&gt;at Zainco.YCW.Components.Utils.NHibernateHelper.get_Session() in &lt;/font&gt;&lt;a href="file%3A%2F%2F5E030282-1B59-4A6D-B4ED-43FA52F0768C%2Fd%3AUtils%2Ff%3ANHibernateHelper.cs%3Fline%3D13%26column%3D1"&gt;&lt;font color="#0000ff"&gt;NHibernateHelper.cs: line 13&lt;/font&gt;&lt;/a&gt;    &lt;br /&gt;&lt;font color="#0000ff"&gt;at Zainco.YCW.Tests.MemberTest.AddMember() in &lt;/font&gt;&lt;a href="file%3A%2F%2F794EEEA1-045D-4DE7-9EC3-79B475C61021%2Ff%3AMemberTest.cs%3Fline%3D70%26column%3D1"&gt;&lt;font color="#0000ff"&gt;MemberTest.cs: line 70&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you get this exception then you have probably defined your joined-subclass outside the parent class, which is probably not a good idea if you are aiming to have highly cohesive and modular mapping files. The problem is easily resolved by either adding an extends attribute to the joined-subclass element&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;joined-subclass &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;KeyLeaderNationalTeamTasks&lt;/span&gt;&amp;quot;  &lt;span style="color: red"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;KeyLeaderNationalTeamTasks&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;extends&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Task&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;or nesting the joined-subclass in the class definition.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4091129314594459147?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4091129314594459147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4091129314594459147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4091129314594459147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4091129314594459147'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2009/01/joined-subclass-exception.html' title='Joined-Subclass exception'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4782284863721226236</id><published>2008-12-31T04:51:00.001-08:00</published><updated>2008-12-31T04:51:06.677-08:00</updated><title type='text'>It’s the domain stupid!</title><content type='html'>&lt;p&gt;OR mapping ,regardless of the mechanics employed, shifts the weight of enterprise software development from thinking about persistence to actually cogitating the problem space. I am now forced to think long and hard about the best aggregation or composition approaches for each of my domain objects. And this is precisely what my customer is paying me for. As &lt;a href="http://ayende.com/"&gt;Ayende&lt;/a&gt; says, “persistence is a solved problem”.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4782284863721226236?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4782284863721226236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4782284863721226236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4782284863721226236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4782284863721226236'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/its-domain-stupid.html' title='It’s the domain stupid!'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-856619366861737834</id><published>2008-12-30T03:08:00.001-08:00</published><updated>2008-12-30T04:15:52.623-08:00</updated><title type='text'>Mapping Subclasses in NHibernate</title><content type='html'>&lt;h4&gt;ContactTest.TestAddContactNotes : Failed&lt;/h4&gt;  &lt;p&gt;NHibernate.MappingException: No discriminator found for Zainco.YCW.Components.Domain.ContactNote. Discriminator is needed when 'single-table-per-hierarchy' is used and a class has subclasses&lt;/p&gt;  &lt;p&gt;at NHibernate.Mapping.SingleTableSubclass.Validate(IMapping mapping)   &lt;br /&gt;at NHibernate.Cfg.Configuration.Validate()    &lt;br /&gt;at NHibernate.Cfg.Configuration.BuildSessionFactory()    &lt;br /&gt;at Zainco.YCW.Components.Utils.NHibernateHelper.get_Session() in &lt;a href="cref://5E030282-1B59-4A6D-B4ED-43FA52F0768C/d:Utils/f:NHibernateHelper.cs*13*1"&gt;NHibernateHelper.cs:line 13&lt;/a&gt;    &lt;br /&gt;at Zainco.YCW.Tests.ContactTest.TestAddContactNotes() in &lt;a href="cref://794EEEA1-045D-4DE7-9EC3-79B475C61021/f:ContactTest.cs*94*1"&gt;ContactTest.cs:line 94&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This was due to an incorrect mapping strategy. Instead of using the table per hierarchy strategy, I resorted to using the table per subclass mapping strategy. The base table, &lt;em&gt;Note,&lt;/em&gt; contains the elements common to my subclasses and the &lt;em&gt;ContactNote&lt;/em&gt; maintains the association between the contact and the &lt;em&gt;Note. &lt;/em&gt;I have a variety of Notes in the system(CommunityNotes, ParishNotes etc).&lt;/p&gt;  &lt;p&gt;The mapping file for this strategy is:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;class &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Note&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Note&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;id &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Id&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;column&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Id&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;generator &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;native&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;property &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Content&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;property &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;DatePublished&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;joined-subclass &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ContactNote&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ContactNote&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;key  &lt;/span&gt;&lt;span style="color: red"&gt;column&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;NoteId&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;many-to-one &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Contact&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;column&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ContactId&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Contact&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;joined-subclass&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-856619366861737834?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/856619366861737834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=856619366861737834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/856619366861737834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/856619366861737834'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/mapping-subclasses-in-nhibernate.html' title='Mapping Subclasses in NHibernate'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3655679251046776333</id><published>2008-12-20T10:27:00.000-08:00</published><updated>2008-12-20T10:47:41.847-08:00</updated><title type='text'>Refactoring to DetachedNameQuery</title><content type='html'>The consequence of hiding the NHibernate &lt;em&gt;ISession &lt;/em&gt;type from the client code is that I now have to rely on inline SQL which kind of makes me queasy. But this feeling is temporary because I can use a feature of NHibernate called &lt;em&gt;DetachedNameQuery &lt;/em&gt;to achieve the following:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#006600;"&gt;IRepository&lt;/span&gt; repository = &lt;span style="color:#3333ff;"&gt;new&lt;/span&gt; NHibernateRepository();&lt;br /&gt;&lt;span style="color:#006600;"&gt;IDetachedQuery&lt;/span&gt; query = &lt;span style="color:#3333ff;"&gt;new&lt;/span&gt; DetachedNamedQuery("GetMaxTaskId");&lt;br /&gt;&lt;span style="color:#006600;"&gt;ITask&lt;/span&gt; task = repository.Find&amp;lt;Task&gt;(query);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;GetMaxTaskId&lt;/em&gt; is defined in my NHibernate mapping file, Task.hbm.xml.&lt;br /&gt;&lt;br /&gt;The entry takes the following form:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;span style="color:#993300;"&gt;query&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt; ="GetMaxTaskId"&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;![CDATA[&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#666666;"&gt;select max(task.Id) from Task task&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;]]&lt;/span&gt;&gt;&lt;br /&gt;&amp;lt;/&lt;span style="color:#993300;"&gt;query&lt;/span&gt;&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3655679251046776333?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3655679251046776333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3655679251046776333' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3655679251046776333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3655679251046776333'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/refactoring-to-detachednamequery.html' title='Refactoring to DetachedNameQuery'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-336312947722755298</id><published>2008-12-20T09:13:00.000-08:00</published><updated>2008-12-20T09:20:42.658-08:00</updated><title type='text'>This really does feel good, especially when you type like I do</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#006600;"&gt;ITask&lt;/span&gt; task = new &lt;span style="color:#006600;"&gt;Task&lt;/span&gt; { Description = "Coding for fun", DueDate = &lt;span style="color:#006600;"&gt;DateTime&lt;/span&gt;.Now, IsCompleted = &lt;span style="color:#000099;"&gt;false&lt;/span&gt;, Categories = &lt;span style="color:#000099;"&gt;new&lt;/span&gt; &lt;span style="color:#006600;"&gt;HashedSet&lt;/span&gt;() };&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;contrast with the old way of doing things&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;ITask&lt;/span&gt; task = TaskFactory.Instance;&lt;br /&gt;task.Description = "Yak Shaving";&lt;br /&gt;task.IsCompleted = false;&lt;/span&gt;&lt;br /&gt;.&lt;br /&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's the small things like this that make for a more productive coding experience. The intent is more direct and one quickly gets to the destination in a DRY way. Nice!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-336312947722755298?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/336312947722755298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=336312947722755298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/336312947722755298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/336312947722755298'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/this-really-does-feel-good-especially.html' title='This really does feel good, especially when you type like I do'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4358400053635856957</id><published>2008-12-20T08:47:00.000-08:00</published><updated>2009-01-07T14:08:49.708-08:00</updated><title type='text'>NHibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed</title><content type='html'>I have implemented a repository that essentially wraps up and centralises my calls to the NHibernate API. This facade is responsible for creating and disposing the NHibernate session.  &lt;br /&gt;  &lt;br /&gt;Clients do not directly interact with the session.  &lt;br /&gt;  &lt;br /&gt;So I use the IDetachedQuery interface to hold my queries like soz:  &lt;br /&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,102,0)"&gt;IDetachedQuery&lt;/span&gt; query = new DetachedQuery(&amp;quot;...&amp;quot;);  &lt;br /&gt;  &lt;br /&gt;&lt;span style="color: rgb(0,102,0)"&gt;ITask&lt;/span&gt; task = repository.Find &amp;lt;Task&amp;gt;(query);  &lt;br /&gt;  &lt;br /&gt;My task has a collection of categories which I am attempting to clear, but the session with which this collection is associated has already been disposed, so looks like I am going to have to force the collection to initialise before I return from the find method. The other option is to eagerly load the stuff i.e. set lazy loading to false.  &lt;br /&gt;  &lt;br /&gt;As in Hibernate non-lazy loading is the default for loading collections in NHibernate. The solution to this problem was a case of setting the lazy attribute to &lt;em&gt;false&lt;/em&gt; like this:  &lt;br /&gt;  &lt;br /&gt;&amp;lt;set name=&amp;quot;Categories&amp;quot; table=&amp;quot;TaskCategory&amp;quot; lazy=&amp;quot;false&amp;quot; cascade=&amp;quot;all&amp;quot;&amp;gt;  &lt;br /&gt;  &lt;br /&gt;NHibernate can also be forced to initialize the collection by calling &lt;span style="font-style: italic"&gt;NHibernateUtil.Initialize(myObject)&lt;/span&gt; before the session is disposed.    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4358400053635856957?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4358400053635856957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4358400053635856957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4358400053635856957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4358400053635856957'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/nhibernatelazyinitializationexception.html' title='NHibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6738857790857683026</id><published>2008-12-18T17:33:00.001-08:00</published><updated>2008-12-18T17:42:32.200-08:00</updated><title type='text'>Perhaps NHibernate Mapping attributes are poisonous</title><content type='html'>I have spent  the best part of a working day experimenting with using NHibernate atrributes after starting off with .hbm.xml mapping files. &lt;br /&gt;&lt;br /&gt;The result is a domain model that's very NHibernate aware, I cannot reuse the model without there being a whiff of NHibernate. This being the case, I have decided that xml mapping files are probably the way forward. I am aware of other mapping approaches, but perhaps, the verbosity and loosely coupled approach of mapping files has its advantages. &lt;br /&gt;&lt;br /&gt;Yes attributes and mapping approaches use a declarative style, but one can not help feeling that embedding persitence crosscutting concerns in domain model could cause grief further down. Mapping files, you have a new friend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6738857790857683026?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6738857790857683026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6738857790857683026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6738857790857683026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6738857790857683026'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/perhaps-nhibernate-mapping-attributes.html' title='Perhaps NHibernate Mapping attributes are poisonous'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-680380262186909913</id><published>2008-12-09T10:27:00.000-08:00</published><updated>2008-12-09T10:43:33.963-08:00</updated><title type='text'>An NHibernate Helper for working with the NHibernate.Mapping.Attributes API</title><content type='html'>Authoring, maintaining and managing NHibernate mapping files, &lt;span style="font-style:italic;"&gt;hbm.xml&lt;/span&gt;, can quickly turn into a full-time job on large projects. One way of effectively accomplishing this vital, but burdensome task is to use the NHibernate contrib, NHibernate.Mapping.Attributes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will requires configuration information to be placed in an app.config file as documented in the NHibernate documentation. One is then required to have a single well known location from where to obtain an instance of the ISession(think PersistenceManager) type. The code below shows how to configure the serializer and return an ISession:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using NHibernate;&lt;br /&gt;using NHibernate.Cfg;&lt;br /&gt;using NHibernate.Mapping.Attributes;&lt;br /&gt;&lt;br /&gt;namespace Zainco.YCW.Components.Utils&lt;br /&gt;{&lt;br /&gt;    public sealed class NHibernateHelper&lt;br /&gt;    {&lt;br /&gt;        private static ISession _session;&lt;br /&gt;        public static ISession Session&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                if (_session == null)&lt;br /&gt;                    using (MemoryStream stream = new MemoryStream())&lt;br /&gt;                    {&lt;br /&gt;                        HbmSerializer.Default.Validate = true;&lt;br /&gt;                        HbmSerializer.Default.HbmNamespace = "Zainco.YCW.Components.Domain";&lt;br /&gt;                        HbmSerializer.Default.HbmAssembly = "Zainco.YCW.Components";&lt;br /&gt;                        HbmSerializer.Default.Serialize(stream, Assembly.GetExecutingAssembly());&lt;br /&gt;&lt;br /&gt;                        stream.Position = 0;&lt;br /&gt;&lt;br /&gt;                        Configuration cfg = new Configuration();&lt;br /&gt;                        cfg.Configure();&lt;br /&gt;                        cfg.AddInputStream(stream);&lt;br /&gt;                        _session = cfg.Configure().BuildSessionFactory().OpenSession();&lt;br /&gt;                        &lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                return _session;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-680380262186909913?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/680380262186909913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=680380262186909913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/680380262186909913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/680380262186909913'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/nhibernate-helper-for-working-with.html' title='An NHibernate Helper for working with the NHibernate.Mapping.Attributes API'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-1848206114475943333</id><published>2008-12-09T09:28:00.000-08:00</published><updated>2008-12-09T09:44:42.449-08:00</updated><title type='text'>System.Data.SqlClient.SqlException: Invalid object name 'hibernate_unique_key' when using SQL Server 2005</title><content type='html'>This problem occurs when attempting to persist an entity&lt;br /&gt;&lt;br /&gt;the actual code that causes this is:&lt;br /&gt;&lt;br /&gt;session.Save(contact);&lt;br /&gt;&lt;br /&gt;The Id attribute on the contact entity is configured as:&lt;br /&gt;&lt;br /&gt;        [Id(Name = "Id", Type = "int")]&lt;br /&gt;        [Generator(Class = "hilo")]&lt;br /&gt;        public virtual int Id&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;ContactTest.TestAddContact : FailedSystem.Data.SqlClient.SqlException: Invalid object name 'hibernate_unique_key'.&lt;br /&gt;at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)&lt;br /&gt;at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)&lt;br /&gt;at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)&lt;br /&gt;at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)&lt;br /&gt;at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()&lt;br /&gt;at System.Data.SqlClient.SqlDataReader.get_MetaData()&lt;br /&gt;at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)&lt;br /&gt;at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)&lt;br /&gt;at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)&lt;br /&gt;at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)&lt;br /&gt;at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)&lt;br /&gt;at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)&lt;br /&gt;at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()&lt;br /&gt;at NHibernate.Id.TableGenerator.Generate(ISessionImplementor session, Object obj)&lt;br /&gt;at NHibernate.Id.TableHiLoGenerator.Generate(ISessionImplementor session, Object obj)&lt;br /&gt;at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)&lt;br /&gt;at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)&lt;br /&gt;at NHibernate.Impl.SessionImpl.Save(Object obj)&lt;br /&gt;at Tests.ContactTest.TestAddContact() in ContactTest.cs:line 20 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The solution is to use the &lt;span style="font-weight:bold;"&gt;native&lt;/span&gt; option, this picks identity, sequence, hilo depending on the capabilities of the underlying RDBMS.&lt;br /&gt;&lt;br /&gt;        [Id(Name = "Id", Type = "int")]&lt;br /&gt;        [Generator(Class = "native")]&lt;br /&gt;        public virtual int Id&lt;br /&gt;        {&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-1848206114475943333?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/1848206114475943333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=1848206114475943333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1848206114475943333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/1848206114475943333'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/systemdatasqlclientsqlexception-invalid.html' title='System.Data.SqlClient.SqlException: Invalid object name &apos;hibernate_unique_key&apos; when using SQL Server 2005'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-2573216784131087449</id><published>2008-12-04T23:46:00.000-08:00</published><updated>2008-12-05T07:55:40.519-08:00</updated><title type='text'>Permission error when trying to open a new database connection from an XBAP</title><content type='html'>If you get the SecurityException below whilst developing an XBAP application&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;{"Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."} System.Exception {System.Security.SecurityException}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is because the default security mode for an XBAP is partial trust. The XBAP is sandboxed and has restricted permissions to the file system, database etc. The .NET Framework uses code access security to limit what the XBAP can do. This is kind of consistent with the Flash, Java applets paradigm that XBAP tries to emulate.&lt;br /&gt;&lt;br /&gt;It is tempting to assign the application trust via the following mechanism:&lt;br /&gt;&lt;br /&gt;In VS2008, do the following:&lt;br /&gt;Double click the VS projects' &lt;span style="font-style: italic;"&gt;Properties &lt;/span&gt;node containing the XBAP-&amp;gt; Select Properties-&amp;gt;Choose the security tab-&amp;gt; Select the option which says "This is a full trust application"-&amp;gt;&lt;br /&gt;&lt;br /&gt;However this &lt;span style="font-style: italic;"&gt;Full Trust&lt;/span&gt; permissioning has potential drawbacks that require unpalatable workarounds.&lt;br /&gt;&lt;br /&gt;The side effect of the change is that me XBAP can not  now be run from a virtual directory or website.&lt;br /&gt;&lt;br /&gt;This leaves me to wonder. Is what I need an XBAP, SilverLight application,  a standalone XAML application or God forbid an ASP.NET app?&lt;br /&gt;&lt;br /&gt;I still want the rich internet application experience and I still want to have a centralised web-like configuration management model. The last thing I want is to be touching each clients' machine to tweak a setting here and a setting there. Because this approach inevitably ends in tears.&lt;br /&gt;&lt;br /&gt;I also do not want to implement orthogonal constructs that check for permissions and end up littering the codebase with try/catch blocks that test for permissions.&lt;br /&gt;&lt;br /&gt;So in the end after careful consideration of my problem context, SilverLight is the way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-2573216784131087449?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/2573216784131087449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=2573216784131087449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2573216784131087449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/2573216784131087449'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/permission-error-when-trying-to-open.html' title='Permission error when trying to open a new database connection from an XBAP'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8059497623912819878</id><published>2008-12-04T22:22:00.000-08:00</published><updated>2009-01-26T10:55:41.102-08:00</updated><title type='text'>A unit testing framework in Turbo Pascal</title><content type='html'>Why Turbo Pascal? Because it reminds me of the joy that I went through trying to learn/reason about software construction and partly because of the turbo button on my first computer. I had it permanently on as if it that would make the world go faster. Now we have multi-core machines, hyperthreading,  desktop Beowulfs and grids. Hey but I digress.&lt;br /&gt;&lt;br /&gt;The main point of this exercise is to implement an xUnit testing framework using Pascal. This follows on from a segment in Kent Becks' book, &lt;span style="font-style: italic;"&gt;Test Driven Development&lt;/span&gt;, in which Mr. Beck implements an xUnit framework in python.&lt;br /&gt;&lt;br /&gt;TODO add code here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8059497623912819878?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8059497623912819878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8059497623912819878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8059497623912819878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8059497623912819878'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/unit-testing-framework-in-turbo-pascal.html' title='A unit testing framework in Turbo Pascal'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-6983499330173822729</id><published>2008-12-04T15:36:00.000-08:00</published><updated>2008-12-05T02:47:33.219-08:00</updated><title type='text'>Type registry and the Factory Method</title><content type='html'>When implementing the Gofian &lt;em&gt;Factory Method&lt;/em&gt; creational pattern it is normally the case that the client requiring the instance needs to tell the object factory what kind of object it needs to make. The internals of the factory method that decide what object to return usually resembles the following&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);"&gt;public class Creator&lt;br /&gt;{&lt;br /&gt;:&lt;br /&gt;public static IVehicle Create(VehicleType vehicleType)&lt;br /&gt;{&lt;br /&gt;  IVehicle vehicle = new Chisasa();&lt;br /&gt;  if(VehicleType.Sedan)&lt;br /&gt;     vehicle = new Sedan();&lt;br /&gt;  if(VehicleType.FourByFour)&lt;br /&gt;     vehicle = new FourByFour();&lt;br /&gt;&lt;br /&gt;  return vehicle;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;This decision structure is easily refactored to an in-memory type registry which uses the lookup metaphor as demonstrated below:&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);"&gt;private IDictionary&amp;lt;VehicleType,IVehicle&amp;gt; Vehicles&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;  IDictionary&amp;lt;VehicleType,IVehicle&amp;gt; vehicles = new Dictionary&amp;lt;VehicleType,IVehicle&amp;gt;();&lt;br /&gt;  vehicles.Add(Vehicle.Sedan, new Sedan());&lt;br /&gt;  vehicles.Add(Vehicle.Mazembe, new Mazembe());&lt;br /&gt;  vehicles.Add(Vehicle.Chisasa, new Chisasa());&lt;br /&gt;  vehicles.Add(Vehicle.Chimbayambaya, new Chimbayambaya());&lt;br /&gt;  return vehicles;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static IVehicle Find(VehicleType vehicleType)&lt;br /&gt;{&lt;br /&gt; return Vehicles[vehicleType];&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you are observant, you will notice that this changes the semantics of the implementation. We have now moved from creating objects to finding objects in a registry. Sound familiar? This emergent design shows us that the &lt;em&gt;Factory Method&lt;/em&gt; is really a respository pattern in disguise. Refactoring a GOF pattern has teleported us to one of the basic tenets of Domain Driven Design, the &lt;em&gt;Repository Pattern&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Some considerations to take into account would be deciding the best collection to use&lt;br /&gt;to reduce the cost of lookup. It could also be possible to externalise the registry depending on the nature of the problem space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-6983499330173822729?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/6983499330173822729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=6983499330173822729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6983499330173822729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/6983499330173822729'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/12/type-registry-and-factory-method.html' title='Type registry and the Factory Method'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-7773033463908339897</id><published>2008-11-29T05:17:00.000-08:00</published><updated>2008-12-01T04:55:07.629-08:00</updated><title type='text'>The characteristics of a good software service</title><content type='html'>From a software clients' perspective, a good software service will exhibit the following characteristics:&lt;br /&gt;1. Simple to use. You ask it for stuff and it gives you back precisely what you want. If there are any failures, these are reported. The service should fail fast. No slow insidious failures should be allowed.&lt;br /&gt;&lt;br /&gt;2. The chunkiness or chattiness of the API should take into account the useage context. The cost of remote invocation should be factored into the design. In a distributed enviroment it might be worth measuring the cost of providing a chunky API vs a chatty interface.&lt;br /&gt;&lt;br /&gt;3. The service should expose an interface for metadata and other out-of-band information.&lt;br /&gt;&lt;br /&gt;4. The service should be interoperable - dont tie the service to platform specific return types unless the requirement explicitly states so or there is a compelling performance reason to do so. This assumes that you have measured the benefits of doing so.&lt;br /&gt;&lt;br /&gt;From an implementation perspective it is desirable that the service exhibit the following attributes:&lt;br /&gt;1. Statelessness - an invocation of the service at time &lt;em&gt;t + 1&lt;/em&gt; should be independent of the invocation at time &lt;em&gt;t&lt;/em&gt;. The services' invocation history is not important. The "now" is more important than what has gone before.&lt;br /&gt;&lt;br /&gt;2. Operations should be defined interms of concepts in the domain. Parameters and return values should be defined interms of domain objects. Beware of primitive obsession, i.e passing strings, int, floats etc when you should really be returning well encapsulated objects or passing parameter objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-7773033463908339897?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/7773033463908339897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=7773033463908339897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7773033463908339897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/7773033463908339897'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/characteristics-of-good-service.html' title='The characteristics of a good software service'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-477549670379446715</id><published>2008-11-29T04:58:00.000-08:00</published><updated>2008-11-30T12:48:28.956-08:00</updated><title type='text'>Why the Repository Pattern Sir?</title><content type='html'>When applying domain driven design, the repository pattern yields the following benefits:&lt;br /&gt;* Represents all objects of a certain type as a conceptual set&lt;br /&gt;* Provides access to roots of aggregates&lt;br /&gt;* Can return summary information&lt;br /&gt;* Provides mechanism for object add/delete&lt;br /&gt;* Encapsualates DB access technology and strategy&lt;br /&gt;* Answers the question, "How do I get a handle to an object" - done via object traversal, direct query execution to find object&lt;br /&gt;* Clients of the repository interface use query based methods to get objects&lt;br /&gt;* Repository is a first class client to object factories. The repository interface can encapsulate factories.&lt;br /&gt;* Simplifies mock testing&lt;br /&gt;&lt;br /&gt;Interface based repository implementations promote substitutability which is a naturally results in highly configurable and loosely coupled software architectures as in Liskov Substitution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-477549670379446715?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/477549670379446715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=477549670379446715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/477549670379446715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/477549670379446715'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/repository-pattern.html' title='Why the Repository Pattern Sir?'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-8210004206596268856</id><published>2008-11-29T03:03:00.000-08:00</published><updated>2008-11-29T04:44:01.200-08:00</updated><title type='text'>When to use specific WPF layouts</title><content type='html'>&lt;strong&gt;1. Grid&lt;/strong&gt;- Does what it says on the tin. Provides row/column layout. Most versatile. Layout of choice for WPF window. Sizing supported via 3 strategies:&lt;br /&gt;a) Absolute size - allows exact sizing via device-independent units. Inflexible and does not support changing content size, changing container size or localization.&lt;br /&gt;&lt;br /&gt;b) Proportional size - Space divided between a group of rows and columns&lt;br /&gt;&lt;br /&gt;&amp;lt;ColumnDefinition Width="*"&amp;gt;&amp;lt;/ColumnDefinition&amp;gt;&lt;br /&gt;&lt;br /&gt;This syntax is very similar to frames&lt;br /&gt;&lt;br /&gt;c) Automatic size - A versatile sizing mode; Row/Column allocated exact space it needs and no more.&lt;br /&gt;&lt;br /&gt;&amp;lt;ColumnDefinition Width="Auto"&amp;gt;&amp;lt;/ColumnDefinition&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mixing Grid Sizing Strategies&lt;/strong&gt;&lt;br /&gt;When mixing proportional sizing with other sizing modes, the proportionally sized rows or columns get the remaining space.&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&gt;Assigning weights&amp;lt;/strong&amp;gt;&lt;br /&gt;&amp;lt;RowDefinition Height="2*"&amp;gt;&amp;lt;/RowDefinition&amp;gt;&lt;br /&gt;&amp;lt;RowDefinition Height="*"&amp;gt;&amp;lt;/RowDefinition&amp;gt;&lt;br /&gt;&lt;br /&gt;Means make the height of the row above twice the height of the row below&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Canvas&lt;/strong&gt;&lt;br /&gt;Allows the positioning of elements and controls using precise coordinates. This is ideal for a drawing application, but a sub-optimal solution for rich dynamic GUIs. The layout is fairly lightweight because it does not include complex layout for position and sizing controls and elements. It is essentially the WYSIWYG of the WPF layout world.&lt;br /&gt;&lt;br /&gt;Example of a canvas layout:&lt;br /&gt;&amp;lt;Canvas&amp;gt;&lt;br /&gt;  &amp;lt;TextBox Canvas.Left="100" Canvas.Top="50"&amp;gt; Is positioned at (100,50)&amp;lt;/TextBox&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. InkCanvas&lt;/strong&gt; - the main aim of this layout is for stylus input. Think tablet PCs and mouse interactivity. Users can annotate content using strokes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. UniformGrid&lt;/strong&gt; - a highly constrained and inflexible layout system. It does not support predefined columns and rows. The Rows and Columns are defined as attributes on the UniformGrid element. Cells are allocated the same size. Elements are rendered in the grid based on the order in which they are defined.&lt;br /&gt;&lt;br /&gt;&amp;lt;UniformGrid Rows="2" Columns="2"&amp;gt;&lt;br /&gt;  &amp;lt;Button&amp;gt;1&amp;lt;/Button&amp;gt;&lt;br /&gt;  &amp;lt;Button&amp;gt;2&amp;lt;/Button&amp;gt;&lt;br /&gt;  &amp;lt;Button&amp;gt;3&amp;lt;/Button&amp;gt;&lt;br /&gt;  &amp;lt;Button&amp;gt;4&amp;lt;/Button&amp;gt;&lt;br /&gt;&amp;lt;UniformGrid&amp;gt;&lt;br /&gt;&lt;br /&gt;This layout could be useful in a board game for example Nsolo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-8210004206596268856?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/8210004206596268856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=8210004206596268856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8210004206596268856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/8210004206596268856'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/when-to-use-specific-wpf-layout.html' title='When to use specific WPF layouts'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5643506444751425822</id><published>2008-11-26T12:32:00.000-08:00</published><updated>2008-11-26T12:39:41.749-08:00</updated><title type='text'>Grouping RadioButtons using the StackPanel element</title><content type='html'>The problem was how to group a number of radio buttons in a XAML UI. The solution was:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;StackPanel Name="magazineList" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="&amp;gt;&lt;br /&gt;&amp;lt;RadioButton&amp;gt;By email&amp;lt;/RadioButton&amp;gt;&lt;br /&gt;&amp;lt;RadioButton&amp;gt;By mail&amp;lt;/RadioButton&amp;gt;&lt;br /&gt;&amp;lt;RadioButton&amp;gt;No magazine&amp;lt;/RadioButton&amp;gt;&lt;br /&gt;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;An alternative approach would be to use a named group descriptor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5643506444751425822?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5643506444751425822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5643506444751425822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5643506444751425822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5643506444751425822'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/grouping-radiobuttons-using-stackpanel.html' title='Grouping RadioButtons using the StackPanel element'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-325351042884245329</id><published>2008-11-26T11:07:00.000-08:00</published><updated>2008-11-26T11:19:29.637-08:00</updated><title type='text'>The dark art of Netra t1 105, x86 and custom RS232/RJ45 interconnects</title><content type='html'>Connecting the Netra 1s to a desktop x86 machine running window XP is proving to be a hard problem. The connection is via a custom built RS232/RJ45 female cable. This connects to the Netra 1's Serial A port. The sun server does not have any OS installed and no media drive, which leaves the null modem option as the only remote management solution. Constrained budgets mean that no extra accessories can be bought to fix the issue.&lt;br /&gt;&lt;br /&gt;Alternative approaches are:&lt;br /&gt;1. Re-purpose the RJ45/USB Connector to provide the linkage between the two devices.&lt;br /&gt;2. Ask for more cash to buy SUN compatible hardware which is compatible with the problem domain.&lt;br /&gt;3. Scrap the project - easy to do but not a realistic option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-325351042884245329?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/325351042884245329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=325351042884245329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/325351042884245329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/325351042884245329'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/dark-art-of-custom-netra-t1-105-x86-and.html' title='The dark art of Netra t1 105, x86 and custom RS232/RJ45 interconnects'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-4302170256767209970</id><published>2008-11-15T20:53:00.000-08:00</published><updated>2008-11-16T05:13:03.340-08:00</updated><title type='text'>IoC in ASP.NET MVC</title><content type='html'>We used the repository pattern(DomainDrivenDesign) to implement an injectable repository type in the peristence controllers in our ASP.NET MVC application.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;HandleError(View = "AddItemError",ExceptionType=typeof(CreateItemException))]&lt;br /&gt;public class PersistenceController:Controller&lt;br /&gt;{&lt;br /&gt;  private readonly IPersistenceManager _persistenceManager;&lt;br /&gt;&lt;br /&gt;  public PersistenceController(IPersistenceManager persistenceManager)&lt;br /&gt;  {&lt;br /&gt;     _persistenceManager = persistenceManager;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;   public PersistenceController():this(PersistenceFactory.CreateInstance())&lt;br /&gt;   {&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The PersistenceFactory was introduced to decouple the concrete types created from the actual client using the type.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-4302170256767209970?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/4302170256767209970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=4302170256767209970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4302170256767209970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/4302170256767209970'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/ioc-in-aspnet-mvc.html' title='IoC in ASP.NET MVC'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-3325485711469326533</id><published>2008-11-15T20:37:00.000-08:00</published><updated>2008-11-15T20:41:46.127-08:00</updated><title type='text'>Chain of responsibility</title><content type='html'>This chain of resposibility is from a system that handles a variety of reporting requests. The inheriting handlers are Russian dolled(each handler knows its successor).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;namespace Components.Reports.QueryHandlers&lt;br /&gt;{&lt;br /&gt;    public abstract class ReportQueryHandler&lt;br /&gt;    {&lt;br /&gt;        protected ReportQueryHandler _reportHandlerSuccessor;&lt;br /&gt;        protected ReportType _reportRequest;&lt;br /&gt;&lt;br /&gt;        public ReportQueryHandler(ReportType reportType)&lt;br /&gt;        {&lt;br /&gt;            _reportRequest = reportType;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected string LoadQuery(string queryFilePath)&lt;br /&gt;        {&lt;br /&gt;            if (!string.IsNullOrEmpty(queryFilePath))&lt;br /&gt;                return File.ReadAllText(queryFilePath);&lt;br /&gt;            else&lt;br /&gt;                throw new ArgumentNullException(queryFilePath);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void HandleReportRequest()&lt;br /&gt;        {&lt;br /&gt;            if (_reportHandlerSuccessor != null)&lt;br /&gt;                _reportHandlerSuccessor.HandleReportRequest();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-3325485711469326533?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/3325485711469326533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=3325485711469326533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3325485711469326533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/3325485711469326533'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/chain-of-responsibility.html' title='Chain of responsibility'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-145974770876480950</id><published>2008-11-15T20:16:00.001-08:00</published><updated>2008-11-15T20:17:52.606-08:00</updated><title type='text'>Business intelligence in the face of object databases</title><content type='html'>TODO&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-145974770876480950?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/145974770876480950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=145974770876480950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/145974770876480950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/145974770876480950'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/business-intelligence-in-face-of-object.html' title='Business intelligence in the face of object databases'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-5668877466044654678</id><published>2008-11-15T20:05:00.000-08:00</published><updated>2008-11-15T20:52:14.793-08:00</updated><title type='text'>In search of dynamic cohesion via extension methods</title><content type='html'>Extension methods are a new language construct that allow the addition of new method definitions to an existing type.&lt;br /&gt;One particular scenario where they have proved useful is in extending the HtmlHelper type that allows rendering of controls in ASP.NET MVC. This encourages a belated type of cohesion, i.e., all concerns to do with control rendering in the view must reside in the HtmlHelper.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public static string CommandBuilder(this HtmlHelper helper, string controller, string action, string commandName, int id)&lt;br /&gt;{&lt;br /&gt;  return string.Format("&amp;lt;a href='/{0}/{1}/{2}'&amp;gt;{3}&amp;lt;/a&amp;gt;", controller, action, id, commandName);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However one wonders whether the same could not be achieved through normal type inheritance. If there are breaking changes in the implementation from Microsoft, then be prepared to break.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-5668877466044654678?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/5668877466044654678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=5668877466044654678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5668877466044654678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/5668877466044654678'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/in-search-of-dynamic-cohesion-via.html' title='In search of dynamic cohesion via extension methods'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8015724.post-769646017996666393</id><published>2008-11-15T19:53:00.000-08:00</published><updated>2008-11-16T05:09:47.159-08:00</updated><title type='text'>Object Persistence without the impedance mismatch</title><content type='html'>As part of the continued journey in exploring the corners of software development, I decided to implement a new IDb4ObjectsRepository to handle persistence via an OODBMS. After an hour of hacking, I had an ASP.NET MVC application conversing with an object database.&lt;br /&gt;There were no schemas, mapping layers, sql queries or setup scripts to fiddle with. &lt;br /&gt;&lt;br /&gt;The only problem I seemed to encounter was that of binding my object collections to drop down lists that were expecting an id for each bound object. Db4objects does not have great support for generating sequences numbers for objects being persisted. &lt;br /&gt;&lt;br /&gt;There is an internal representation of the object id, but this requires groping into the guts of the api to retrieve it. Perhaps what's required is some interfaces e.g. ISequenceGenerator which can be implemented by entity objects requiring an id. Value objects by their very definition would not need to implement this interface.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private void AddItem&lt;T&gt;(T entityToStore) where T:IEntity&lt;br /&gt;{&lt;br /&gt;  using(IObjectContainer db = Db4oFactory.OpenFile(Db4oService.FilePath))&lt;br /&gt;  {&lt;br /&gt;     db.Set(entityToStore);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The sheer ease with which I was able to integrate Db4Objects left me a bit uneasy. Can object persistence be so easy? Why are object databases not prevalent?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8015724-769646017996666393?l=zainco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zainco.blogspot.com/feeds/769646017996666393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8015724&amp;postID=769646017996666393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/769646017996666393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8015724/posts/default/769646017996666393'/><link rel='alternate' type='text/html' href='http://zainco.blogspot.com/2008/11/object-persistence-without-impedance.html' title='Object Persistence without the impedance mismatch'/><author><name>Joseph A. Nyirenda</name><uri>http://www.blogger.com/profile/15967474994228653750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_990MwuRZkU0/ShrKkxJq7gI/AAAAAAAABC0/bTiozgVn7N4/S220/0e0a4c6.jpg'/></author><thr:total>0</thr:total></entry></feed>
