<?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-2645223572805964973</id><updated>2012-02-07T20:40:33.840-05:00</updated><category term='metaware'/><category term='global IT'/><category term='enterprise it'/><category term='virtualization'/><category term='technology'/><category term='artistic code crafting'/><category term='SPS'/><category term='tools'/><category term='MOSS 2007'/><category term='PaaS'/><category term='workflow'/><category term='enterprise 2.0'/><category term='Hobbies'/><category term='risk management'/><category term='compact framework'/><category term='hypothesis'/><category term='infrastructure agility'/><category term='XAML'/><category term='software development'/><category term='exceptions'/><category term='Book Reviews'/><category term='sudoku'/><category term='SaaS'/><category term='SharePoint Lists'/><category term='ergonomics'/><category term='SPSNH'/><category term='web 2.0'/><category term='Jimmy Sudoku'/><category term='dynamic coding'/><category term='surface'/><category term='VSeWSS'/><category term='windows mobile'/><category term='SSIS'/><category term='lessons learned'/><category term='teaching'/><category term='hardware'/><category term='code generation'/><category term='Singularity'/><category term='business'/><category term='process'/><category term='programming'/><category term='Technological Singularity'/><category term='SharePoint'/><category term='implementation'/><category term='assimilation'/><category term='web services'/><category term='concurrency'/><category term='I'/><category term='ADO.NET'/><category term='SSIS Unit Testing'/><category term='APIO Model'/><category term='economics'/><category term='energy'/><category term='IaaS'/><category term='multi-touch ui'/><category term='software development history'/><category term='SSRS'/><category term='multi-processing'/><category term='it industry'/><category term='software factory'/><category term='fusion'/><category term='metadata'/><category term='WPF'/><category term='GSSPUG'/><category term='InfoPath'/><title type='text'>poliTechnosis</title><subtitle type='html'>Everything I need to know in life, I've learned from developing software...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3928163009328885139</id><published>2011-11-15T20:26:00.008-05:00</published><updated>2011-11-15T21:42:44.748-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hobbies'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons learned'/><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Choen the counterBot</title><content type='html'>&lt;div&gt;&lt;div&gt;I'm pretty excited... both my kids seem interested in computers and what you can do with them.  My daughter, especially, is very interested in learning bits and pieces about programming.  My son is interested, but not so much in the nuts &amp;amp; bolts of programming.   He is interested in numbers and performance, though.   They're both young, though...  he's in 1st grade, and she's in 2nd.&lt;br /&gt;&lt;br /&gt;She's expressed some interest in programming before.  Last time we talked about application design...   she got extremely ambitious and drew about twenty pages of "designs" (hand-drawn mock-ups of screens) for games that she wanted to create.   (Essentially knock-offs of games she's played on favorite websites like PBS Kids and Pixie Hollow.)&lt;br /&gt;&lt;br /&gt;More recently, she was using my computer, and discovered that when she's logged into my computer on her account, she has access to Visual Studio Express.  When she asked what it was, I told her it was tools to write programs, and she just lit up.    Immediately, she wanted to start working on a simple UI that mimics a math program she uses at school.&lt;br /&gt;&lt;br /&gt;I started to realize, however, that she needs to learn more of the basics before we dive into a full fledged user interface.   I started to think about some of the earliest programs I learned to write.&lt;br /&gt;&lt;br /&gt;Back when I was in 4th grade, I got my hands on an Apple II, and one of the first programs I learned to write on it was a program that accepted two numbers (start and finish) and simply scrolled out a count between them.&lt;br /&gt;&lt;br /&gt;Nowadays, we have object oriented programming, and C#, but I wanted to try to keep it simple and understandable for her.   I decided that we would create a "counter-bot" class, and we would create an instance of it named whatever she wanted it to be named (She decided on Choen (pronounced more like Cohen)).&lt;br /&gt;&lt;br /&gt;Today, we got the basics of the counterBot class written, and wrote a short program to create an instance of it, initialize it, and start counting, sending the numbers out to the screen.   A countBot has beginAt, finishAt, countBy properties, and Start, Count, GetCurrentNumber and isFinished commands.&lt;br /&gt;&lt;br /&gt;Here's the code:&lt;br /&gt;counterBot.cs:&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace Choen_the_counterBot&lt;br /&gt;{&lt;br /&gt;    class counterBot&lt;br /&gt;    {&lt;br /&gt;        public int beginAt;&lt;br /&gt;        public int finishAt;&lt;br /&gt;        public int countBy = 1;&lt;br /&gt;        private int currentNumber;&lt;br /&gt;    &lt;br /&gt;        public void Start()&lt;br /&gt;        {&lt;br /&gt;            currentNumber = beginAt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int GetCurrentNumber()&lt;br /&gt;        {&lt;br /&gt;            return currentNumber;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Count()&lt;br /&gt;        {&lt;br /&gt;            currentNumber = currentNumber + countBy;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool isFinished()&lt;br /&gt;        {&lt;br /&gt;            bool result=false;&lt;br /&gt;            if (currentNumber &amp;gt; finishAt)&lt;br /&gt;            {&lt;br /&gt;                result = true;&lt;br /&gt;            }&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and here's the console Main method in program.cs:&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;namespace Choen_the_counterBot&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            counterBot Choen = new counterBot();&lt;br /&gt;            Choen.beginAt = 0;&lt;br /&gt;            Choen.finishAt = 2000000;&lt;br /&gt;&lt;br /&gt;            Choen.Start();&lt;br /&gt;            DateTime startTime = DateTime.Now;&lt;br /&gt;            &lt;br /&gt;            while (!Choen.isFinished())&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(Choen.GetCurrentNumber());&lt;br /&gt;                Choen.Count();&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            Console.WriteLine("Finished counting from " &lt;br /&gt;                + Choen.beginAt.ToString() &lt;br /&gt;                + " to " &lt;br /&gt;                + Choen.finishAt.ToString()&lt;br /&gt;                + " by " &lt;br /&gt;                + Choen.countBy &lt;br /&gt;                + "'s in " &lt;br /&gt;                + (DateTime.Now - startTime)&lt;br /&gt;                       .Seconds.ToString() &lt;br /&gt;                + " seconds!");&lt;br /&gt;      &lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I got a bit fancy and added the timer code to see how long it took.   Together, my son, daughter, and I watched Choen the counterBot count out various scenarios, and got as ambitious as watching it count from zero to two million.   In order to get my son's interest, I added the timer to see how long it took.   We discovered that my computer can count from zero to two million, "out loud" (showing the numbers on the screen) in 52 seconds.   If we hid the console writes, it could do it in less than a second.&lt;br /&gt;&lt;br /&gt;Next time we play with it, we'll write a graphic UI (a windows form) and hook Choen the counter bot up to it.&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/2645223572805964973-3928163009328885139?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3928163009328885139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3928163009328885139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3928163009328885139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3928163009328885139'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2011/11/choen-counterbot.html' title='Choen the counterBot'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5729089875670078741</id><published>2011-03-11T15:22:00.005-05:00</published><updated>2011-03-11T16:06:59.494-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons learned'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic coding'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='infrastructure agility'/><category scheme='http://www.blogger.com/atom/ns#' term='software factory'/><category scheme='http://www.blogger.com/atom/ns#' term='metaware'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Code Generation</title><content type='html'>I've been evangelizing code generation since the work I did at Providus / FRS Global...&lt;br /&gt;&lt;br /&gt;One of my arguements on the topic got &lt;a href="http://edgewatertech.wordpress.com/2011/03/11/paying-too-much-for-custom-application-implementation-code-generation/"&gt;published by Edgewater&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;I love the picture on it... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5729089875670078741?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5729089875670078741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5729089875670078741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5729089875670078741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5729089875670078741'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2011/03/code-generation.html' title='Code Generation'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-7918264553220243663</id><published>2011-03-04T11:43:00.004-05:00</published><updated>2011-03-04T12:00:17.920-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPS'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='GSSPUG'/><category scheme='http://www.blogger.com/atom/ns#' term='SPSNH'/><title type='text'>SharePoint Saturday NH</title><content type='html'>I'm psyched to be a part of the founding and building of &lt;a href="http://www.sharepointsaturday.org/nh/default.aspx"&gt;SharePoint Saturday for New Hampshire&lt;/a&gt;. It's a part of the Granite State SharePoint Users Group (follow twitter @NHSharePointUG ) or check us out on &lt;a href="http://www.linkedin.com/groups?home=&amp;amp;gid=3703101&amp;amp;trk=anet_ug_hm"&gt;Linked-IN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Stay tuned for more info.... lots of exciting stuff happening for the SharePoint community in NH.&lt;br /&gt;&lt;br /&gt;Edit:  May have jumped the gun on this a bit...  the site may not be publicly accessible... yet.   I'll update this post when it's made public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-7918264553220243663?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/7918264553220243663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=7918264553220243663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7918264553220243663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7918264553220243663'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2011/03/sharepoint-saturday-nh.html' title='SharePoint Saturday NH'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3211553938794425736</id><published>2009-04-24T16:52:00.002-04:00</published><updated>2009-04-26T16:43:54.675-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='I'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='IaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='SaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='global IT'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='PaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='infrastructure agility'/><category scheme='http://www.blogger.com/atom/ns#' term='enterprise it'/><title type='text'>Infrastructure Agility via Cloud Technology</title><content type='html'>I'm honored to have just been published on Edgewater's public blog...&lt;br /&gt;&lt;br /&gt;It's bit about managing infrastructure agility. The basic idea is architecting your infrastructure so that you can push off parts to different clouds when you need to, for any of a multitude of reasons. The idea goes a bit beyond virtualization.&lt;br /&gt;&lt;br /&gt;Check it out:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edgewatertech.wordpress.com/2009/04/24/best-practice-cloud-computing/"&gt;http://edgewatertech.wordpress.com/2009/04/24/best-practice-cloud-computing/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-3211553938794425736?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3211553938794425736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3211553938794425736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3211553938794425736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3211553938794425736'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/04/infrastructure-agility-via-cloud.html' title='Infrastructure Agility via Cloud Technology'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-2279126100439550724</id><published>2009-04-24T08:46:00.004-04:00</published><updated>2009-04-24T08:53:08.352-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><title type='text'>Workstation Virtualization</title><content type='html'>I've been having fun (ya, really...  fun!) with MS VPC 2007 SP1 lately.&lt;br /&gt;&lt;br /&gt;I've put some VM's on a portable USB disk.  USB2 isn't the best connection, but it's workable.   It does a few things... adds a spindle to the system config, offloading that overhead from the main disk.  &lt;br /&gt;&lt;br /&gt;An external disk also means the VM is "portable".  I can launch the VM on my laptop or any other host system (like my home system) without any significant difficulty.  Even better, by having the VPC config files on the host, rather than on the external disk, you can tune VM settings (like memory and network connectivity) for optimal conditions on the host system.  &lt;br /&gt;&lt;br /&gt;One other nice time-saver is differencing disks.  You can create a "base" virtual hard disk, and create VHD's that are deltas of the base...  by doing this, you can create a primary configuration, and then create several machines that inherit that basic config.   It came in very handy for a recent product evaluation...  I just created a base VM roughly according to what the client expects to host the system on, and then created VMs based on that for each product I wanted to evaluate.&lt;br /&gt;&lt;br /&gt;Another nice feature is virtual assist hardware.  At first, I didn't know my ThinkPad had it, but it turns out to be a BIOS setting.   Flip that on, do a cold boot, and VM performance is visibly better.   I knew of some of the other features from past experience with MS VPC 2005, but the hardware acceleration is new to me.  (Ironically, my newer home desktop, a 64-bit monster with huge RAM doesn't support the hardware assist...  performance isn't a problem, there, tho.  )&lt;br /&gt;&lt;br /&gt;One more trick:  enable the Undo disk option... It put another layer of protection on your VM, allowing you snap a line on your VM at a point in time that you can back-out to.  The cool part about this is that the Undo disk is created as a temporary file on the host system, (typically on the primary system drive).  This distributes load across the spindles even more, which further improves run-time performance.   The downside:  when it comes time to commit the undo, it can take a while.&lt;br /&gt;&lt;br /&gt;I still love the idea, going forward, of putting client dev environments on a config like this...   Not only does it create a nice level of separation between client system configurations, but when you get your hands on better hardware, migration is not an issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-2279126100439550724?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/2279126100439550724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=2279126100439550724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2279126100439550724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2279126100439550724'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/04/workstation-virtualization.html' title='Workstation Virtualization'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5642337008921462777</id><published>2009-02-18T13:23:00.004-05:00</published><updated>2009-02-18T13:52:50.033-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Lists'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Reading SharePoint Lists into an ADO.Net DataTable, Updated</title><content type='html'>I've been integrating processes with SharePoint lists for some time now. I made a &lt;a href="http://politechnosis.kataire.com/2008/09/reading-sharepoint-lists-into-adonet.html"&gt;post back in September '08&lt;/a&gt; about how to pull a SharePoint list into an ADO.NET DataTable.&lt;br /&gt;&lt;br /&gt;A very kind reader contributed a much appreciated simplified solution.  It actually worked for general cases, but didn't solve a fundamental problem (one of the reasons I posted my version of the code to begin with):   What if you have a column with odd characters in the name, like "EntityA.Property1"?&lt;br /&gt;&lt;br /&gt;Unfortunately, ADO.NET imports columns with certain character encodings as DBNull.  I suspect this might be a bug, but the example below shows a very simple WPF form that uses the basic technique with a slight variation to work around the issue:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Controls;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Data;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Documents;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Input;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Media;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Media.Imaging;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; System.Windows.Shapes;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; data = System.Data;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;using&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; xml = System.Xml;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;namespace&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; WindowsApplication1&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;span style="font-size:85%;color:#808080;"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;span style="font-size:85%;color:#008000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;span style="font-size:85%;color:#808080;"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;span style="font-size:85%;color:#008000;"&gt; Interaction logic for Window1.xaml&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;span style="font-size:85%;color:#808080;"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;span style="font-size:85%;color:#008000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;span style="font-size:85%;color:#808080;"&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;partial&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Window1&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; : System.Windows.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Window&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;     public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Window1()&lt;br /&gt;    {&lt;br /&gt;        InitializeComponent();&lt;br /&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;     public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; OnLoaded(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; sender, &lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;RoutedEventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; args)&lt;br /&gt;     {&lt;br /&gt;          SharePointLists.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Lists&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; listsService = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; WindowsApplication1.SharePointLists.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;Lists&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;();&lt;br /&gt;          listsService.Url = &lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"http://spsite/_vti_bin/lists.asmx"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;br /&gt;          listsService.Proxy = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;br /&gt;          listsService.UseDefaultCredentials = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;br /&gt;          xml.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;XmlNode&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; listData =&lt;br /&gt;               listsService.GetListItems(&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;                    "Test List"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    default&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;),&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    default&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;),&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;                    default&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#008000;"&gt;&lt;span style="font-size:85%;color:#008000;"&gt;               //Takes care of columns with names like "EntityA.Property1", gets rid of "ows_" prefix:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;               listData.InnerXml = listData.InnerXml.Replace(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"_x002e_"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"_"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;).Replace(&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"ows_"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;""&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;               data.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataSet&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; listDataSet = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; data.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataSet&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;();&lt;br /&gt;               xml.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;XmlNodeReader&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; listDataReader = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; xml.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;XmlNodeReader&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(listData);&lt;br /&gt;               listDataSet.ReadXml(listDataReader);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;               CollectionViewSource&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; dataObj = (&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;CollectionViewSource&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)Resources[&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;"Data"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;];&lt;br /&gt;               dataObj.Source = &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; data.&lt;/span&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;&lt;span style="font-size:85%;color:#2b91af;"&gt;DataView&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(listDataSet.Tables[1]);&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Here's the XAML component:&lt;br /&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Window&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;x:Class&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;WindowsApplication1.Window1&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;xmlns:x&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Title&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;WindowsApplication1&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Height&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;300&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Width&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;300&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;Loaded&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;OnLoaded&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Window.Resources&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;CollectionViewSource&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;x:Key&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Data&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Window.Resources&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Grid&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DataContext&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;{StaticResource Data}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;ItemsSource&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;{Binding}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;DisplayMemberPath&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;EntityA_Property1&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;"&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Grid&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;Window&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5642337008921462777?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5642337008921462777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5642337008921462777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5642337008921462777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5642337008921462777'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/02/reading-sharepoint-lists-into-adonet.html' title='Reading SharePoint Lists into an ADO.Net DataTable, Updated'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-1797472074761976315</id><published>2009-02-04T11:37:00.009-05:00</published><updated>2009-02-04T12:11:04.232-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Lists'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>WORKAROUND:  Misconfigured Windows-Integrated Authentication for Web Services</title><content type='html'>In trying to drive a process from a SharePoint list, I ran across a problem...&lt;br /&gt;&lt;br /&gt;I couldn't create a web reference in my C# project due to some really weird problem... In the "Add web reference" wizard, I entered my URL, and was surprised by a pop-up titled "Discovery Credential", asking me for credentials for the site.&lt;br /&gt;&lt;br /&gt;Since I was on the local domain and had "owner" permissions to the site, I thought I would just waltz in and get the WSDL.&lt;br /&gt;&lt;br /&gt;Ok, so it wants creds... I gave it my own.&lt;br /&gt;&lt;br /&gt;Negative...!?!?&lt;br /&gt;&lt;br /&gt;After a few attempts and access denied errors, I hit Cancel, and was rewarded by, of all things, the WSDL display... but I still couldn't add the reference.&lt;br /&gt;&lt;br /&gt;After quite a bit of wrestling, it turns out there was an authentication provider configuration problem. The site was configured to use Kerberos authentication, but the active directory configuration was not set up correctly. (I believe it needed someone to use SetSPN to update the Service Principal Name (SPN) for the service.)&lt;br /&gt;&lt;br /&gt;One way to resolve the problem was to set the authentication provider to NTLM, but in my case, I didn't have, (and wasn't likely to get) that configuration changed in the site (a SharePoint Web Application) I really needed access to.&lt;br /&gt;&lt;br /&gt;In order to make it work, I had to initially create my reference to a similar, accessible site.&lt;br /&gt;&lt;br /&gt;(e.g. &lt;a href="http://host/sites/myaccessiblesite/_vti_bin/lists.asmx"&gt;http://host/sites/myaccessiblesite/_vti_bin/lists.asmx&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;Then, I had to initialize the service as such, in code:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;br /&gt;private void InitWebService()&lt;br /&gt;{&lt;br /&gt;  System.Net.AuthenticationManager.Unregister("Basic");&lt;br /&gt;&lt;br /&gt;  System.Net.AuthenticationManager.Unregister("Kerberos");&lt;br /&gt;&lt;br /&gt;  //System.Net.AuthenticationManager.Unregister("Ntlm");&lt;br /&gt;&lt;br /&gt;  System.Net.AuthenticationManager.Unregister("Negotiate");&lt;br /&gt;&lt;br /&gt;  System.Net.AuthenticationManager.Unregister("Digest");&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;br /&gt;  SmokeTestSite.Lists workingLists = new SmokeTest.SmokeTestSite.Lists();&lt;br /&gt;&lt;br /&gt;  workingLists.Url = "http://host/sites/mybrokensite/_vti_bin/lists.asmx";&lt;br /&gt;&lt;br /&gt;  workingLists.UseDefaultCredentials = true;&lt;br /&gt;&lt;br /&gt;  workingLists.Proxy = null;&lt;br /&gt;&lt;br /&gt;  lists = workingLists;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;What this accomplishes is it unregisters all authentication managers in your application domain. (This can only be done once in the same app domain. Attempts to unregister the same manager more than once while the program's running will throw an exception.)&lt;br /&gt;&lt;br /&gt;So by having all the other authentication managers disabled in the client, the server would negotiate and agree on Ntlm authentication, which succeeds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-1797472074761976315?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/1797472074761976315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=1797472074761976315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/1797472074761976315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/1797472074761976315'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/02/workaround-misconfigured-authentication.html' title='WORKAROUND:  Misconfigured Windows-Integrated Authentication for Web Services'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-980945402070869083</id><published>2009-01-28T10:34:00.003-05:00</published><updated>2009-01-28T10:42:00.553-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons learned'/><category scheme='http://www.blogger.com/atom/ns#' term='VSeWSS'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='software factory'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Anonymous Form Submission to Form Library with InfoPath in MOSS</title><content type='html'>Here's a bit of a trick I ran across while helping to develop some MOSS2007 solutions.&lt;br /&gt;&lt;br /&gt;I needed to configure InfoPath so that it could submit documents to a site that the submitter would not be able to access. In SharePoint, this is not directly possible.&lt;br /&gt;&lt;br /&gt;A common work-around is to set up incoming email for the target list, and submit by email to that. Unfortunately, my client is part-way through a Notes to Exchange migration, so this wasn't practical in the given time frame.&lt;br /&gt;&lt;br /&gt;The solution... create two sites, one that is accessible to the submitter, and the other that is not.  On the accessible site, create a new, "hidden" list that the user &lt;em&gt;can&lt;/em&gt; submit to. Add an event receiver to that list, such that whenever a new item is added, the item is moved to the real intended target using elevated privileges.&lt;br /&gt;&lt;br /&gt;Using VSeWSS extensions, create a List Definition project that has something like this in the ItemEventReciever.cs file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Security.Permissions;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.Security;&lt;br /&gt;using Microsoft.SharePoint.Utilities;&lt;br /&gt;using VSeWSS;&lt;br /&gt;&lt;br /&gt;namespace AutoForwardingFormLibrary&lt;br /&gt;{&lt;br /&gt;    [CLSCompliant(false)]&lt;br /&gt;    [TargetList("38aea319-af78-4489-9059-d124c68bf9fe")]&lt;br /&gt;    [Guid("9d0f139b-d9ed-4b6c-b0ba-2353cb3bad85")]&lt;br /&gt;    public class AutoForwardingFormLibraryItemEventReceiver : SPItemEventReceiver&lt;br /&gt;    {&lt;br /&gt;        private SPListItem addedItem = null;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Initializes a new instance of the Microsoft.SharePoint.SPItemEventReceiver class.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public AutoForwardingFormLibraryItemEventReceiver()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Asynchronous after event that occurs after a new item has been added to its containing object.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="properties"&gt;&lt;br /&gt;        /// A Microsoft.SharePoint.SPItemEventProperties object that represents properties of the event handler.&lt;br /&gt;        /// &lt;/param&gt;&lt;br /&gt;        public override void ItemAdded(SPItemEventProperties properties)&lt;br /&gt;        {&lt;br /&gt;            addedItem = properties.ListItem;&lt;br /&gt;            if (addedItem == null)&lt;br /&gt;            {&lt;br /&gt;                throw new ArgumentNullException("properties.ListItem");&lt;br /&gt;            }&lt;br /&gt;            SPSecurity.CodeToRunElevated moveItem = moveItem_Elevated;&lt;br /&gt;            SPSecurity.RunWithElevatedPrivileges(moveItem_Elevated);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void moveItem_Elevated()&lt;br /&gt;        {&lt;br /&gt;            addedItem.CopyTo(SPUrlUtility.CombineUrl("http://targetserver/sites/jimw/docs/formlibrary", addedItem.Name));&lt;br /&gt;            addedItem.Delete();&lt;br /&gt;        }&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/2645223572805964973-980945402070869083?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/980945402070869083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=980945402070869083' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/980945402070869083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/980945402070869083'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/01/anonymous-form-submission-to-form_28.html' title='Anonymous Form Submission to Form Library with InfoPath in MOSS'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-2830596200052386368</id><published>2009-01-11T00:09:00.007-05:00</published><updated>2009-01-12T06:19:04.601-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Singularity'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='Technological Singularity'/><title type='text'>"Rapture for the Geeks":  Singularitarianism 101</title><content type='html'>My wife and I were at Barnes &amp;amp; Noble last week. While we were there, she walked over to me with a book, with a grin on her face, called "Rapture for the Geeks". She was making a personal joke with it, but I was too immediately intrigued... which made it all the more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;hilarious&lt;/span&gt; to her.&lt;br /&gt;&lt;br /&gt;Being a spiritualist, optimist, scientist, technologist, and a sci-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;fi&lt;/span&gt; fan-boy (I believe the way Albert Einstein did: Everything is a miracle), all my life, I've felt like humanity's on the brink (in geological terms) of something fascinating... Needless to say, I bought it and read it.&lt;br /&gt;&lt;br /&gt;The author, Richard &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Dooling&lt;/span&gt;, has done some fiction, but this was (mostly) non-fiction. It turns out to be an introduction to a concept called the "&lt;a href="http://en.wikipedia.org/wiki/Technological_Singularity"&gt;Technological Singularity&lt;/a&gt;" for para-technologists. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Dooling&lt;/span&gt; doesn't offer any insights of his own, but brings together a lot of interesting view points from a lot of notable "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Singularitarians&lt;/span&gt;", especially &lt;a href="http://en.wikipedia.org/wiki/Ray_Kurzweil"&gt;Ray &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Kurzweil&lt;/span&gt;&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Bill_Joy"&gt;Bill Joy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The thing that I found most interesting about this book was not the ideas &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Dooling&lt;/span&gt; was relaying, but the fact that there appears to be a build-up of buzz around it. Even as the crescendo that is the "Moore's Law" prediction persists, so does the interest crescendo around The Singularity.&lt;br /&gt;&lt;br /&gt;I remember having conversations with a wise, elder grand-uncle when I was a kid that bordered on philosophical regarding the progression of technology... back in the early 80's. I remember wondering what would happen when humanity's technology over-reached its own capacity to manage it. What would we really do, for example, if we eventually automated ourselves out of all of our "work"?&lt;br /&gt;&lt;br /&gt;It's true... technology sure has come a long way in the past 35 years that I've been observing it (my whole life). When I was a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;pre&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;schooler&lt;/span&gt;, my folks had this awesome TI calculator... it had a red LED display, and did all four arithmetic functions. Almost a decade later, my first programmable computer was a Timex-Sinclair 1000 with 2K of RAM (expanded to 16K) and a cassette player for storage. Today, my preschool-age children play with "old" 1-gigahertz Pentium III machines while my own machine (a Christmas gift from my wife) is a commercial-off-the-shelf quad-core 2.3 &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;gigahertz&lt;/span&gt; monster with 8GB RAM and a full &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;Terabyte&lt;/span&gt; of disk space in a RAID 0 array.&lt;br /&gt;&lt;br /&gt;With humanity's ability to abstract and build on its own technology, it's not a question of "if" we will hit some sort of existentially disruptive technology... the only important questions are "when" and "will life on Earth survive it?"&lt;br /&gt;&lt;br /&gt;The really fun part is imagining how The Singularity might manifest itself... &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;artificial&lt;/span&gt; intelligence gaining sentience? Discovering the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;truly&lt;/span&gt; united nature of time/space/matter/energy? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Teleportation&lt;/span&gt;? Limitless energy? Immortality (via perfected nutrition, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;nano&lt;/span&gt;-technology, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;replicable&lt;/span&gt; parts, or even &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;transference&lt;/span&gt; into "robotic" bodies) ? Inter-galactic travel? Perhaps God, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;uber&lt;/span&gt; geek creator of this simulation we call life, will don His Holy "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;VR&lt;/span&gt; gear" to be present to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_19"&gt;witness&lt;/span&gt; the birth of His grandchild(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;ren&lt;/span&gt;). (I wonder which Cloud He might be riding in on... EC2? Blue Cloud? Surely not Azure... :) )&lt;br /&gt;&lt;br /&gt;There's some good humor in the book, but the last few chapters are really hard trudging through. It suffers from more than a couple &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_21"&gt;bouts&lt;/span&gt; with verbal diarrhea... one, for example, is a ten page rant about making sure you save your work as text. He also comes across as a programmatic poseur to someone who really is a programmer.&lt;br /&gt;&lt;br /&gt;If you are already familiar with these ideas, you'll probably be insulted by this book. What kept me reading was the false hope that the author had some synthesis of his own on the subject. That said, if you're not a programmer, and are new to the topic, the first nine chapters are good, and the remaining chapters might be forgivable.&lt;br /&gt;&lt;br /&gt;Of course, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Dooling&lt;/span&gt; does suggest that heightened interest in The Singularity may also just be a symptom of a mid-life &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;crisis&lt;/span&gt;. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-2830596200052386368?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/2830596200052386368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=2830596200052386368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2830596200052386368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2830596200052386368'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2009/01/rapture-for-geeks-singularitarianism.html' title='&quot;Rapture for the Geeks&quot;:  Singularitarianism 101'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-7183857572757064649</id><published>2008-10-14T16:22:00.009-04:00</published><updated>2008-10-14T16:43:39.161-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic coding'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Lists'/><category scheme='http://www.blogger.com/atom/ns#' term='SSRS'/><title type='text'>"ETL"ing Source Code</title><content type='html'>The past couple weeks, I've been between projects, which has gotten me involved in a number of "odd jobs".  An interesting pattern that I'm seeing in them is querying and joining, and updating data from very traditionally "unlikely" sources... especially code.  &lt;br /&gt;&lt;br /&gt;SQL databases are very involved, but I find myself querying system views of the schema itself, rather than its contents.  In fact, I'm doing so much of this, that I'm finding myself building skeleton databases...  no data, just schema, stored procs, and supporting structures.  &lt;br /&gt;&lt;br /&gt;I'm also pulling and updating metadata from the likes of SharePoint sites, SSRS RDL files, SSIS packages...  and most recently, CLR objects that were serialized and persisted to a file.  Rather than outputting in the form of reports, in some cases, I'm outputting in the form of more source code.  &lt;br /&gt;&lt;br /&gt;I've already blogged a bit about pulling SharePoint lists into ADO.NET DataSet's.  I'll post about some of the other fun stuff I've been hacking at soon.  &lt;br /&gt;&lt;br /&gt;I think the interesting part is how relatively easy it's becoming to write code to "ETL" source code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-7183857572757064649?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/7183857572757064649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=7183857572757064649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7183857572757064649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7183857572757064649'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/10/etling-source-code.html' title='&quot;ETL&quot;ing Source Code'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5850711190454160419</id><published>2008-09-30T13:28:00.006-04:00</published><updated>2009-02-18T13:57:55.143-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint Lists'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Reading SharePoint Lists into an ADO.Net DataTable</title><content type='html'>&lt;span style="color:#000000;"&gt;[&lt;strong&gt;Feb 18, 2009&lt;/strong&gt;:  I've posted &lt;/span&gt;&lt;a href="http://politechnosis.kataire.com/2009/02/reading-sharepoint-lists-into-adonet.html"&gt;&lt;span style="color:#000000;"&gt;an &lt;strong&gt;update&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#000000;"&gt; to show the newer technique suggested below by Kirk Evans, also compensating for some column naming issues.]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The other day, I needed to write some code that processed data from a SharePoint list. The list was hosted on a remote MOSS 2007 server.&lt;br /&gt;&lt;br /&gt;Given more time, I'd have gone digging for an ADO.NET adapter, but I found some code that helped. Unfortunately, the code I found didn't quite seem to work for my needs. Out of the box, the code missed several columns for no apparent reason.&lt;br /&gt;&lt;br /&gt;Here's my tweak to the solution:&lt;br /&gt;&lt;br /&gt;(The ListWebService points to a web service like http://SiteHost/SiteParent/Site/_vti_bin/lists.asmx?WSDL )&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;private&lt;/span&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt; data.&lt;span style="color:#2b91af;"&gt;DataTable&lt;/span&gt; GetDataTableFromWSS(&lt;span style="color:blue;"&gt;string&lt;/span&gt; listName)&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;ListWebService.&lt;span style="color:#2b91af;"&gt;Lists&lt;/span&gt; lists = &lt;span style="color:blue;"&gt;new&lt;/span&gt; ListWebService.&lt;span style="color:#2b91af;"&gt;Lists&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;lists.UseDefaultCredentials = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;lists.Proxy = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;//you have to pass the List Name here&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlNode&lt;/span&gt; ListCollectionNode = lists.GetListCollection();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt; List = (&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt;)ListCollectionNode.SelectSingleNode(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;"wss:List[@Title='{0}']"&lt;/span&gt;, listName), NameSpaceMgr);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (List == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;"The list '{0}' could not be found in the site '{1}'"&lt;/span&gt;, listName, lists.Url));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; TechListName = List.GetAttribute(&lt;span style="color:#a31515;"&gt;"Name"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;data.&lt;span style="color:#2b91af;"&gt;DataTable&lt;/span&gt; result = &lt;span style="color:blue;"&gt;new&lt;/span&gt; data.&lt;span style="color:#2b91af;"&gt;DataTable&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"list"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlNode&lt;/span&gt; ListInfoNode = lists.GetList(TechListName);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;System.Text.&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt; fieldRefs = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System.Text.&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;System.Collections.&lt;span style="color:#2b91af;"&gt;Hashtable&lt;/span&gt; DisplayNames = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System.Collections.&lt;span style="color:#2b91af;"&gt;Hashtable&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt; Field &lt;span style="color:blue;"&gt;in&lt;/span&gt; ListInfoNode.SelectNodes(&lt;span style="color:#a31515;"&gt;"wss:Fields/wss:Field"&lt;/span&gt;, NameSpaceMgr))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; FieldName = Field.GetAttribute(&lt;span style="color:#a31515;"&gt;"Name"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; FieldDisplayName = Field.GetAttribute(&lt;span style="color:#a31515;"&gt;"DisplayName"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (result.Columns.Contains(FieldDisplayName))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;FieldDisplayName = FieldDisplayName + &lt;span style="color:#a31515;"&gt;" ("&lt;/span&gt; + FieldName + &lt;span style="color:#a31515;"&gt;")"&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;result.Columns.Add(FieldDisplayName, TypeFromField(Field));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;fieldRefs.AppendFormat(&lt;span style="color:#a31515;"&gt;""&lt;/span&gt;, FieldName);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;DisplayNames.Add(FieldDisplayName, FieldName);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;result.Columns.Add(&lt;span style="color:#a31515;"&gt;"XmlElement"&lt;/span&gt;, &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt; fields = ListInfoNode.OwnerDocument.CreateElement(&lt;span style="color:#a31515;"&gt;"ViewFields"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;fields.InnerXml = fieldRefs.ToString();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlNode&lt;/span&gt; ItemsNode = lists.GetListItems(TechListName, &lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:blue;"&gt;null&lt;/span&gt;, fields, &lt;span style="color:#a31515;"&gt;"10000"&lt;/span&gt;, &lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;         &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color:green;"&gt;// Lookup fields always start with the numeric ID, then ;# and then the string representation.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;// We are normally only interested in the name, so we strip the ID.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;System.Text.RegularExpressions.&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt; CheckLookup = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System.Text.RegularExpressions.&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"^\\d+;#"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt; Item &lt;span style="color:blue;"&gt;in&lt;/span&gt; ItemsNode.SelectNodes(&lt;span style="color:#a31515;"&gt;"rs:data/z:row"&lt;/span&gt;, NameSpaceMgr))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;data.&lt;span style="color:#2b91af;"&gt;DataRow&lt;/span&gt; newRow = result.NewRow();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (data.&lt;span style="color:#2b91af;"&gt;DataColumn&lt;/span&gt; col &lt;span style="color:blue;"&gt;in&lt;/span&gt; result.Columns)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (Item.HasAttribute(&lt;span style="color:#a31515;"&gt;"ows_"&lt;/span&gt; + (&lt;span style="color:blue;"&gt;string&lt;/span&gt;)DisplayNames[col.ColumnName]))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; val = Item.GetAttribute(&lt;span style="color:#a31515;"&gt;"ows_"&lt;/span&gt; + (&lt;span style="color:blue;"&gt;string&lt;/span&gt;)DisplayNames[col.ColumnName]);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;                       &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (CheckLookup.IsMatch((&lt;span style="color:blue;"&gt;string&lt;/span&gt;)val))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                            &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; valString = val &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                            &lt;/span&gt;val = valString.Substring(valString.IndexOf(&lt;span style="color:#a31515;"&gt;"#"&lt;/span&gt;) + 1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// Assigning a string to a field that expects numbers or&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;&lt;span style="color:green;"&gt;// datetime values will implicitly convert them&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;newRow[col] = val;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;newRow[&lt;span style="color:#a31515;"&gt;"XmlElement"&lt;/span&gt;] = Item;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;result.Rows.Add(newRow);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:green;"&gt;// The following Function is used to Get Namespaces&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlNamespaceManager&lt;/span&gt; _nsmgr;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlNamespaceManager&lt;/span&gt; NameSpaceMgr&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (_nsmgr == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlNamespaceManager&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NameTable&lt;/span&gt;());&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr.AddNamespace(&lt;span style="color:#a31515;"&gt;"wss"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"http://schemas.microsoft.com/sharepoint/soap/"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr.AddNamespace(&lt;span style="color:#a31515;"&gt;"s"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr.AddNamespace(&lt;span style="color:#a31515;"&gt;"dt"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr.AddNamespace(&lt;span style="color:#a31515;"&gt;"rs"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"urn:schemas-microsoft-com:rowset"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;_nsmgr.AddNamespace(&lt;span style="color:#a31515;"&gt;"z"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"#RowsetSchema"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; _nsmgr;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; TypeFromField(&lt;span style="color:#2b91af;"&gt;XmlElement&lt;/span&gt; field)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;switch&lt;/span&gt; (field.GetAttribute(&lt;span style="color:#a31515;"&gt;"Type"&lt;/span&gt;))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;case&lt;/span&gt; &lt;span style="color:#a31515;"&gt;"DateTime"&lt;/span&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;case&lt;/span&gt; &lt;span style="color:#a31515;"&gt;"Integer"&lt;/span&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;int&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;case&lt;/span&gt; &lt;span style="color:#a31515;"&gt;"Number"&lt;/span&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;             &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;float&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;default&lt;/span&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 10pt"&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5850711190454160419?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5850711190454160419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5850711190454160419' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5850711190454160419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5850711190454160419'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/reading-sharepoint-lists-into-adonet.html' title='Reading SharePoint Lists into an ADO.Net DataTable'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4834246429197937500</id><published>2008-09-25T18:42:00.002-04:00</published><updated>2008-09-25T18:57:12.611-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lessons learned'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='risk management'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The Great Commandment</title><content type='html'>While I was writing a post the other day, I noticed that I had neglected a topic that I find very important in software development. Risk management.&lt;br /&gt;&lt;br /&gt;There are only a few guarantees in life. One of them is risk. Companies profit by seizing the opportunities that risks afford. Of course, they suffer loss by incidents of unmitigated risks. All our government and social systems are devices of risk management. In business, risk management is (now, and ever shall be) the great commandment.&lt;br /&gt;&lt;br /&gt;Many software engineers forget that risk management is not just for PM’s. In fact, software and its development is fundamentally a tool of business, and, by extension, risk management. The practice of risk management in software really extends in to every expression in every line of source code.&lt;br /&gt;&lt;br /&gt;Don’t believe me? Think of it this way… If it wasn’t a risk, it would be implemented as hardware. I've often heard hardware engineers say that anything that can be done in software can be done in hardware, and it will run faster. Usually, if a solution is some of the following…&lt;br /&gt;· mature,&lt;br /&gt;· ubiquitous,&lt;br /&gt;· standard,&lt;br /&gt;· well-known,&lt;br /&gt;· fundamentally integral to its working environment&lt;br /&gt;&lt;br /&gt;…it is probably low risk, particularly for change. It can likely be cost-effectively cast in stone (or silicone). (And there are plenty of examples of that… It’s what &lt;a href="http://en.wikipedia.org/wiki/ASIC" target="_blank"&gt;ASIC&lt;/a&gt;’s are all about.)&lt;br /&gt;&lt;br /&gt;Software, on the other hand, is not usually so much of any of those things. Typically, it involves solutions which are…&lt;br /&gt;· proprietary,&lt;br /&gt;· highly customized,&lt;br /&gt;· integration points,&lt;br /&gt;· inconsistently deployed,&lt;br /&gt;· relatively complex / error-prone&lt;br /&gt;· immature or still evolving&lt;br /&gt;&lt;br /&gt;These are all risk indicators for change. I don’t care what IT guys say… software is much easier to change than logic gates on silicone.&lt;br /&gt;&lt;br /&gt;I’ve dug in to this in the past, and will dig in more on this in future posts, but when I refer to the “great commandment”, this is what I mean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4834246429197937500?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4834246429197937500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4834246429197937500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4834246429197937500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4834246429197937500'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/great-commandment.html' title='The Great Commandment'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4887558372314756580</id><published>2008-09-25T18:41:00.000-04:00</published><updated>2008-09-25T18:41:18.909-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='APIO Model'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='software factory'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='metaware'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>Application Platform Infrastructure Optimization</title><content type='html'>In doing some research for a client on workflow in SharePoint, I came across &lt;a href="http://msdn.microsoft.com/en-us/library/cc303238.aspx"&gt;this interesting article&lt;/a&gt; about the differences between BizTalk 2006 and the .NET Workflow Foundation (WF).&lt;br /&gt;&lt;br /&gt;The article itself was worth the read for its main point, but I was also interested in Microsoft's Application Platform Infrastructure Optimization ("APIO") model.&lt;br /&gt;&lt;br /&gt;The "dynamic" level of the APIO model describes the kind of system that I believe the .NET platform has been aiming at since 3.0.&lt;br /&gt;&lt;br /&gt;I've been eyeing the tools... between MS's initiatives, my co-workers' project abstracts, and the types of work that's coming down the pike in consulting. From the timing of MS's releases, and the feature sets thereof, I should have known that the webinars they've released on the topic have been around for just over a year.&lt;br /&gt;&lt;br /&gt;This also plays into Microsoft Oslo. I have suspected that Windows Workflow Foundation, or some derivative thereof, is at the heart of the modeling paradigm that Oslo is based on.&lt;br /&gt;&lt;br /&gt;All this stuff feeds into a hypothesis I've mentioned before that I call "metaware", a metadata layer on top of software. I think it's a different shade of good old CASE... because, as we all know... "CASE is dead... Long live CASE!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4887558372314756580?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4887558372314756580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4887558372314756580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4887558372314756580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4887558372314756580'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/06/application-platform-infrastructure.html' title='Application Platform Infrastructure Optimization'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-8303978951369186657</id><published>2008-09-15T21:50:00.003-04:00</published><updated>2008-09-15T21:54:37.638-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hobbies'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='assimilation'/><category scheme='http://www.blogger.com/atom/ns#' term='hypothesis'/><title type='text'>facebook</title><content type='html'>I've been avoiding the whole My Space / Facebook thing for a while now...  but now I'm checking it out.  A little part of me is afraid that a public ill-prepared for the communications onslaught of web 2.0 toys like Facebook will fall prey to it.  It may lead to implants that allow people to have every thought cataloged for later analysis.  Before you know it, we'll all be Assimilated!  (Resistance is Futile!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-8303978951369186657?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/8303978951369186657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=8303978951369186657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/8303978951369186657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/8303978951369186657'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/facebook.html' title='facebook'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4726057918738329417</id><published>2008-09-14T13:57:00.006-04:00</published><updated>2009-02-18T13:26:25.608-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='enterprise it'/><category scheme='http://www.blogger.com/atom/ns#' term='energy'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Champions of Disruption</title><content type='html'>I've been noticing lately that truely interesting things only happen on the "edge". Everything is energy, and everything &lt;em&gt;happens&lt;/em&gt; at the point where energy flows are disrupted.&lt;br /&gt;&lt;br /&gt;If you don't believe me, just ask Mother Nature. Take solar energy. Powerful energy flows from our sun and saturates our solar system... but all the amazing things &lt;em&gt;happen &lt;/em&gt;where that energy flow is disrupted. The Earth disrupts it, and the result, in this case, is merely life as we know it.&lt;br /&gt;&lt;br /&gt;It's so primal that we've abstracted the concept of energy flows, and call it (among other things) currency. When we sell a resource (a form of energy, in a sense), we even call that change "liquidation".&lt;br /&gt;&lt;br /&gt;Sure, potential energy has value, but there are no edges in a region of potential energy. Potential energy is usually static, consistent, and only really exciting for what it could do or become, rather than what it currently is.&lt;br /&gt;&lt;br /&gt;Likewise, it's where disruptions occur that there's business to be done.&lt;br /&gt;&lt;br /&gt;According to this article on&lt;a href="http://www.informationweek.com/news/management/showArticle.jhtml?articleID=210500065"&gt; Information Week&lt;/a&gt;, CIO/CTO's appear to have generally become change-averse order takers. Surveys cited indicate that many shops are not actively engaged in strategy or business process innovation.&lt;br /&gt;&lt;br /&gt;Perhaps they're still feeling whipped by the whole "IT / Business Alignment" malignment. Maybe they're afraid of having business process innovation through technology innovation come off as an attempt to drive the business. Ultimately, it seems many are going into survival mode, setting opportunity for change asside in favor of simply maintaining the business.&lt;br /&gt;&lt;br /&gt;Maybe the real challenge for IT is to help business figure out that innovation is change, and change is where the action is.&lt;br /&gt;&lt;br /&gt;In any case, it seems there's a lot of potential energy building up out there.&lt;br /&gt;&lt;br /&gt;The disruptions must come. Will you be a witness, a victim, or a champion of them?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4726057918738329417?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4726057918738329417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4726057918738329417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4726057918738329417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4726057918738329417'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/champions-of-disruption.html' title='Champions of Disruption'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-6806383087701218535</id><published>2008-09-13T14:12:00.017-04:00</published><updated>2008-09-14T13:52:44.049-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lessons learned'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='enterprise it'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Retail IT in the Enterprise</title><content type='html'>Lately, the projects I've been on have had me taking on roles outside my comfort zone. (I'm not talking about downtown-Boston... with the "Boston Express" out of Nashua, I'm ok with that.)&lt;br /&gt;&lt;br /&gt;I've always been most comfortable, myself, in cross-discipline engineering roles, especially in smaller teams where everyone's got good cross-discipline experience. The communications overhead is low. The integration friction is low. Everyone knows how it needs to be done, and people are busy building rather than negotiating aggressively.&lt;br /&gt;&lt;br /&gt;These types of tight, focused teams have always had business focused folks who took on the role of principal consultant. In this type of situation, the principal consultant provides an insulation boundary between the technical team and the customer.&lt;br /&gt;&lt;br /&gt;This insulation has made me comfortable in that "zone": I'm a technologist. I eat, sleep, dream software development. I take the ability to communicate complex technical concepts with my peers effectively and concisely, very seriously.&lt;br /&gt;&lt;br /&gt;So like I said, lately the projects I've been on have yanked me pretty hard out of that zone. I've been called on to communicate directly with my customers. I've been handling item-level projects, and it's a different world. There is no insulation. I'm filling all my technical roles, plus doing light BA and even PM duty.&lt;br /&gt;&lt;br /&gt;Somewhat recently, I emailed a solution description to a CFO. The response: "Send this again in user-level English."&lt;br /&gt;&lt;br /&gt;It killed me.&lt;br /&gt;&lt;br /&gt;I've gotten so used to having others "protect" me from this sort of non-technical blunder. In contemporary projects, the insulating consulting roles are simply not present.&lt;br /&gt;&lt;br /&gt;Makes me wonder about the most important lessons I learned during my school days... In high school days, maybe it was retail courtesy, and retail salesmanship in a technical atmosphere ("Radio Shack 101"). In college days, the key lessons might have been how to courteously negotiate customer experience levels, (from "help desk 101").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-6806383087701218535?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/6806383087701218535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=6806383087701218535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6806383087701218535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6806383087701218535'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/retail-it-in-enterprise.html' title='Retail IT in the Enterprise'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3636013626669747240</id><published>2008-09-10T19:58:00.006-04:00</published><updated>2008-09-10T21:36:00.320-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hobbies'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='compact framework'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Compact and Full .NET Frameworks</title><content type='html'>One of the things I've been intrigued by for a while now is the fact that code compiled for the .NET Compact Framework (all versions) executes very nicely on the full .NET Framework.&lt;br /&gt;&lt;br /&gt;For example, my personal hobby project, "Jimmy Sudoku", is written in C# for the .NET Compact Framework 2.0. There are actually two install kits. The first is a .CAB file for Windows Mobile devices. The second is an .MSI for Windows 9x, XP, and Vista. The desktop install kit even serves two purposes. First, it installs the program on the desktop. Second, it leverages ActiveSync to push the .CAB up to the Windows Mobile device.&lt;br /&gt;&lt;br /&gt;It's a .NET Compact Framework app especially for Windows Mobile devices, but many 'Jimmy' fans don't have a Windows Mobile device to run it on.&lt;br /&gt;&lt;br /&gt;The coolest part is the ease in which all of the components inter-operate. The .EXE and .DLL's that are delivered to the mobile device are the very same as the ones that are delivered to the desktop. Like Silverlight to WPF, the Compact Framework is a compatible subset of the full framework, so interoperability is a given.&lt;br /&gt;&lt;br /&gt;Even better, you can reference CF assemblies in Full framework assemblies. One immediate offshoot of this in my hobby project... the web service I built to service "Game of the Day" requests actually references the CF assembly that implements the game state model and game generator code. The assembly that generates games on Windows Mobile PDA's &amp;amp; cell phones is the very same assembly that generates games in the ASP.NET web service.&lt;br /&gt;&lt;br /&gt;Admittedly, there are some bothersome differences between the CF and the Full .NET Framework. The CF does not support WPF. The CF has no facilities for printing. Also, while the CF does supports some of the common Windows Forms dialogs, it does not support File Save and File Open dialogs on Windows Mobile Standard Edition (Smart Phone / non-touchscreen) devices.&lt;br /&gt;&lt;br /&gt;These differences can be overlooked to some extent, though, for the fact that one compiled assembly can execute on so many very different machine types. Further, with interoperability, one can extend a CF-based core code with full-framework support. For example, I'm currently playing with desktop print functionality for my hobby project.&lt;br /&gt;&lt;br /&gt;Something that I'd really love to see, some day, is a good excuse to develop a Windows Forms app for a client that had shared components between the desktop and a mobile.&lt;br /&gt;&lt;br /&gt;I can imagine that this model would be superb for a huge variety of applications, allowing a fully featured UI for the desktop version, and an excellent, 100% compatible, very low risk (almost "free") portable version.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've often thought this would work great for apps that interface hardware, like:&lt;br /&gt;field equipment,&lt;br /&gt;mobile equipment,&lt;br /&gt;vehicles of all sorts,&lt;br /&gt;&lt;br /&gt;...simply plug in your PDA (via USB or Bluetooth), and it becomes a smart management device for the equipment, using the very same code that also runs on the desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-3636013626669747240?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3636013626669747240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3636013626669747240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3636013626669747240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3636013626669747240'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/compact-and-full-net-frameworks.html' title='Compact and Full .NET Frameworks'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-1037892667250790099</id><published>2008-09-04T21:15:00.003-04:00</published><updated>2008-09-04T21:51:07.844-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Semi-IT / Semi-Agile</title><content type='html'>&lt;p&gt;While working on-site for a client, I noticed something interesting.  On the walls of some of my client's "users" offices, along with other more classic credentials, are certifications from Microsoft...  SQL Server 2005 query language certifications.   &lt;br /&gt;&lt;br /&gt;I've heard a lot about the lines between IT and business blurring.  We talk a fair amount about it back at HQ.&lt;br /&gt;&lt;br /&gt;Interestingly, this case is a clear mid-tier layer between classic IT (app development, data management, advanced reporting) and business in the form of ad hoc SQL querying and cube analysis.   In many ways, it's simply a "power-user" layer. &lt;br /&gt;&lt;br /&gt;The most interesting part about it is the certification, itself.  The credentials that used to qualify an IT role are now being used to qualify non-IT roles.&lt;/p&gt;&lt;p&gt;Another trend I'm seeing is development ceremony expectations varying depending on the risk of the project.  Projects that are higher risk are expected to proceed more like a waterfall ceremony.  Lower risk projects proceed with more neo-"agility".  &lt;/p&gt;&lt;p&gt;The project I was on was apparently considered "medium" risk.  The way I saw this play out was that all of the documentation of a classic waterfall methodology was expected, but the implementation was expected to develop along with the documentation.  &lt;/p&gt;&lt;p&gt;In many ways, it was prototyping into production.   Interestingly, this project required this approach:  the business users simply did not have time to approach it in a full waterfall fashion.  Had we been forced into a full-fledged classic waterfall methodology, we might still be waiting to begin implementation, rather than finishing UAT.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-1037892667250790099?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/1037892667250790099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=1037892667250790099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/1037892667250790099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/1037892667250790099'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/semi-it-semi-agile.html' title='Semi-IT / Semi-Agile'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4753439084605240099</id><published>2008-09-04T21:08:00.001-04:00</published><updated>2008-09-04T21:14:44.122-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='energy'/><title type='text'>Power and Control: Fusion Report 13 June 008</title><content type='html'>&lt;a href="http://powerandcontrol.blogspot.com/2008/06/fusion-update-13-june-008.html"&gt;Power and Control: Fusion Report 13 June 008&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks for the report, M. Simon. My post about &lt;a href="http://politechnosis.kataire.com/2008/09/energy-productization.html"&gt;Energy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Productization&lt;/span&gt;&lt;/a&gt; was actually a bit of a response to an article I read that covered both the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;WB&lt;/span&gt;7 and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ITER&lt;/span&gt;. Your report hits the points much more concisely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4753439084605240099?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4753439084605240099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4753439084605240099' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4753439084605240099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4753439084605240099'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/power-and-control-fusion-report-13-june.html' title='Power and Control: Fusion Report 13 June 008'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5907585077409004884</id><published>2008-09-02T21:29:00.005-04:00</published><updated>2008-09-02T21:42:58.672-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='fusion'/><category scheme='http://www.blogger.com/atom/ns#' term='energy'/><title type='text'>Energy Productization</title><content type='html'>I think the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;ITER&lt;/span&gt; project, a grand-scale fusion project, is interesting.  I'm troubled with it for a few reasons, though.  I can't help but think that there's only a few reasons that we need it, and most of them have to do with power... of a controlling nature.&lt;br /&gt;&lt;br /&gt;There's already a great big huge fusion reactor throwing more energy at us than we can collect, let alone use...  every single day...  the sun.&lt;br /&gt;&lt;br /&gt;Efforts to create fusion reactors here on earth are great for these reasons:&lt;br /&gt;1)  Energy for space exploration&lt;br /&gt;2)  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Productization&lt;/span&gt; of energy&lt;br /&gt;3)  Weapons innovation&lt;br /&gt;&lt;br /&gt;Once we learn how fusion's done, we can build space craft from it that could potentially get us somewhere in the galaxy.   That's all well and good, but will it happen before we poison our existing biosphere?&lt;br /&gt;&lt;br /&gt;Once we have fusion reactors, energy moguls can sell it.  Oh, great!  Instead of energy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;productization&lt;/span&gt; through oil, we get energy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;productization&lt;/span&gt; through fusion...  because we can't all have one of these great big huge reactors in our basements.  At least it's renewable.  If the moguls are benevolent, it might even be cheap.&lt;br /&gt;&lt;br /&gt;Finally, once we have fusion reactors like this, we'll learn new ways to blow ourselves out of our collective misery...  so I suppose the first two points are mute once this comes along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5907585077409004884?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5907585077409004884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5907585077409004884' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5907585077409004884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5907585077409004884'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/energy-productization.html' title='Energy Productization'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3585320017960938798</id><published>2008-09-01T10:06:00.013-04:00</published><updated>2008-09-01T15:29:43.319-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='global IT'/><title type='text'>Economic Detox</title><content type='html'>While contemporary headlines bode poorly for the U.S. economy, I see them as signs of hope... &lt;br /&gt;&lt;br /&gt;I keep hearing high-pitched alarms about the weakening U.S. dollar, inflation, energy prices, the housing market bubble burst.  We all see the ugly face of the these conditions.&lt;br /&gt;&lt;br /&gt;Global trade has been a bitter (but necessary) pill for the U.S.  Perhaps the Clinton-detonated U.S. economic &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;nuclear&lt;/span&gt; winter (of global trade, NAFTA, etc.) is finally starting to give way to a new economic springtime in the States.&lt;br /&gt;&lt;br /&gt;In the late 90's US market, there were a lot of excesses in the technology sector.  Then the bubble burst.  When the dust settled, we (the US IT industry) found ourselves disenfranchised by our sponsors...  corporate America beat us with our own job hopping.   U.S. Engineers hopped off to the coolest new startup, and rode their high salaries into the dirt, while enduring companies went lean, mean, and foreign.  We had become so expensive, we were sucking our own project ROI's completely out of sight.   By hooking foreign talent pools, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ROI's&lt;/span&gt; were visible again.&lt;br /&gt;&lt;br /&gt;Nearly a decade later, look what's happening around the world...  Many foreign IT job markets are falling into the same salary inflation trap that the U.S. market fell into...  They are going through the same inflation we experienced.  Their prices are rising. &lt;br /&gt;&lt;br /&gt;Combine their salary inflation with our salary stagnation and a weakening dollar, and what do you get? &lt;br /&gt;&lt;br /&gt;A leaner, meaner &lt;em&gt;domestic&lt;/em&gt; competitor. &lt;br /&gt;&lt;br /&gt;In a sense, it's like that in many sectors of the U.S. economy.  &lt;br /&gt;&lt;br /&gt;So let the U.S. dollar weaken...  It means that America can go back to being product producers (rather than mindless consumers) in the global market!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-3585320017960938798?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3585320017960938798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3585320017960938798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3585320017960938798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3585320017960938798'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/09/economic-detox.html' title='Economic Detox'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-2918833535379628363</id><published>2008-08-30T08:02:00.008-04:00</published><updated>2008-08-30T11:15:11.431-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic code crafting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='risk management'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>If It Looks Like Crap...</title><content type='html'>It never ceases to amaze me what a difference "presentation" makes.&lt;br /&gt;&lt;br /&gt;Pizza Hut is airing a commercial around here about their "Tuscani" menu.  In the commercial, they show people doing the old "Surprise!  Your coffee is Folgers Crystals!" trick in a fancy restaurant, except they're serving Pizza Hut food in an "Olive Garden"-style venue.&lt;br /&gt;&lt;br /&gt;It clearly shows my point, and that the point applies to anything...  books, food, appliances, vehicles, and software, just to name the first few things that pop to mind.  You can have the greatest product in the world... it exceeds expectations in every functional way...  but any adjective that is instantly applied to the visual presentation (including the environment it's presented in) will be applied to the content.  &lt;br /&gt;&lt;br /&gt;If it looks like crap, that's what people will think of it.&lt;br /&gt;&lt;br /&gt;(Of course, there are two sides to the coin...  What really kills me are the times when a really polished application really IS &lt;em&gt;crap&lt;/em&gt;...  it's UI is very appealing, but not thought out.  It crashes at every click.  But it looks &lt;em&gt;BEAUTIFUL.&lt;/em&gt;   And so people &lt;em&gt;love &lt;/em&gt;it, at least enough to be sucked into buying it.)&lt;br /&gt;&lt;br /&gt;Good engineers don't go for the adage "It's better to look good than to be good."  We know far better than that.  You can't judge the power of a car by its steering wheel.  Granite countertops look great, but they're typically hard to keep sanitary.&lt;br /&gt;&lt;br /&gt;When it comes to application user interfaces, engineers tend to make it function great...  it gives you the ability to control every nuance of the solution without allowing invalid input...  but if it looks kludgy, cheap, complex, or gives hard-to-resolve error messages, you get those adjectives applied to the whole system.&lt;br /&gt;&lt;br /&gt;So what I'm talking about, really, is a risk... and it's a significant risk to any project.  For that reason, appearance litterally becomes a business risk.&lt;br /&gt;&lt;br /&gt;For any non-trivial application, a significant risk is end-user rejection.  The application can do exactly what it's designed to do, but if it is not presented well in the UI, the user will typically tend to reject the application sumarily.&lt;br /&gt;&lt;br /&gt;That's one thing that I was always happy about with the ISIS project.  (I've blogged about our use of XAML and WPF tools in it, before.)  The project was solid, AND it presented well.  Part of it was that the users loved the interface.  Using Windows Presentation Foundation, it was easy to add just enough chrome to impress the customers without adding undo complexity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-2918833535379628363?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/2918833535379628363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=2918833535379628363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2918833535379628363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2918833535379628363'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/08/if-it-looks-like-crap.html' title='If It Looks Like Crap...'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-2626730727466168891</id><published>2008-08-25T17:17:00.003-04:00</published><updated>2008-08-26T13:43:54.263-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='Jimmy Sudoku'/><title type='text'>I blew it...</title><content type='html'>While working on the site, I accidentally deleted a core portion of the Jimmy Sudoku 2.5 puzzle generator web service.  (Don't ask me how...  it was apparently so bone-headed that it took me a while to realize I'd done it.)&lt;br /&gt;&lt;br /&gt;I've exhausted all my backup options... the backups were either too new (and therefore producing the wrong content format), or so old that the backup itself was corrupt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The good news is 2.5 supported local game generation if the service was on the fritz.  I guess that means its covered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, if you send me proof of purchase of any rev prior to 3.0, I'll send the fresh bits along.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Send it to me in email to jimmysoftware (at) kataire.com, and I'll reply with a copy. (Your order number &amp;amp; date will probably suffice...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-2626730727466168891?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/2626730727466168891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=2626730727466168891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2626730727466168891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2626730727466168891'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/08/i-blew-it.html' title='I blew it...'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-9156279666097186054</id><published>2008-08-17T19:21:00.002-04:00</published><updated>2008-08-17T19:26:45.204-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hobbies'/><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='compact framework'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='Jimmy Sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Compromise &amp; Capitulation</title><content type='html'>There's three different flavors of Windows Mobile in the 6.x line. Standard, Classic, and Professional.&lt;br /&gt;&lt;br /&gt;Standard = Smart Phone, no touchscreen&lt;br /&gt;Classic = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;PDA&lt;/span&gt; w/touchscreen&lt;br /&gt;Professional = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;PDA&lt;/span&gt; / Phone with Touchscreen&lt;br /&gt;&lt;br /&gt;One of the other interesting little gotchas is that the .Net Compact Framework 2.0 compiles the same for all three editions. Unfortunately, once in a while, you get a "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;NotSupportedException&lt;/span&gt;" out of the Standard edition.&lt;br /&gt;&lt;br /&gt;A few days ago, in order to get my sudoku program published, I decided to simply avoid a problem I had with the Standard edition's lack of a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SaveFileDialog&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;OpenFileDialog&lt;/span&gt;. My avoidance manifested in a "not supported" message of my own, if the user tried to save / load a file in that environment.&lt;br /&gt;&lt;br /&gt;Today, I capitulated... I implemented an alternative file save/load functionality which kicks in automatically when the program gets a "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;NotSupportedException&lt;/span&gt;" on the common dialogs.&lt;br /&gt;&lt;br /&gt;It's in 3.0.3, which I've re-published on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;PocketGear&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-9156279666097186054?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/9156279666097186054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=9156279666097186054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/9156279666097186054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/9156279666097186054'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/08/compromise-capitulation.html' title='Compromise &amp; Capitulation'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3015277579159962719</id><published>2008-08-15T23:14:00.006-04:00</published><updated>2008-08-17T19:26:20.594-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hobbies'/><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='compact framework'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Jimmy Sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>Jimmy SuDoku 3.0 Released</title><content type='html'>Those of you who have worked with me on a project in the past few years probably know of my hobby project. It's an implementation of SuDoku. It's made for Windows Mobile devices (cell phones, etc.), but it also runs on Windows XP (et al).&lt;br /&gt;&lt;br /&gt;The old version, 2.5, had been published on &lt;a href="http://classic.pocketgear.com/software_detail.asp?id=20764"&gt;PocketGear&lt;/a&gt;. This last update was published in January, 2007, just before I started with Edgewater.&lt;br /&gt;&lt;br /&gt;I've been hacking at it here &amp;amp; there since then, but the project suffered from lots of maladies... most significantly lack of time.&lt;br /&gt;&lt;br /&gt;So after more than a year and a half, I'm happy to &lt;em&gt;finally &lt;/em&gt;announce &lt;strong&gt;Jimmy SuDoku 3.0&lt;/strong&gt;!&lt;br /&gt;&lt;br /&gt;3.0 has a whole new game state model, based on CLR classes rather than an XML DOM. This means the puzzle generator's fast enough on hand-held devices that it doesn't need a web service to do the work for it. Another side-effect of this change is a smaller run-time memory footprint, though I'm not sure by exactly how much.&lt;br /&gt;&lt;br /&gt;I also figured out how to leverage the hardware controls on WM6.0 &amp;amp; 6.1 devices so that non-touchscreen devices can play, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-3015277579159962719?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3015277579159962719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3015277579159962719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3015277579159962719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3015277579159962719'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/08/jimmy-sudoku-30-released.html' title='Jimmy SuDoku 3.0 Released'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-6715325055870221466</id><published>2008-07-21T09:07:00.003-04:00</published><updated>2008-07-21T09:14:49.649-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS Bug / Workaround</title><content type='html'>I ran across a "feature" (bug) in SSIS today that I figured I'd record in case I ran across it again...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E14. An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E14 Description: "Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".". An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E14 Description: "The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.". An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E14 Description: "Reading from DTS buffer timed out.".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;According to this &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=146250&amp;amp;SiteID=1"&gt;MSDN forum thread&lt;/a&gt;, it's a bona-fide SSIS bug (I'm running SQL Server SP2 with the latest known patches as of this date.)&lt;br /&gt;&lt;br /&gt;So the problem is in the SQL Server Destination. Changing it out for an OLEDB Destination seems to do the trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-6715325055870221466?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/6715325055870221466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=6715325055870221466' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6715325055870221466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6715325055870221466'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/07/ssis-bug-workaround.html' title='SSIS Bug / Workaround'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4310700452327732997</id><published>2008-07-15T23:05:00.001-04:00</published><updated>2008-07-15T23:07:16.831-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic code crafting'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='hypothesis'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>WALL•E and Enterprise Data Landfills</title><content type='html'>&lt;div class="ExternalClass2D341939606D4383897AAA1D62856DEB"&gt;"Life is nothing but imperfection and the computer likes perfection, so we spent probably 90% of our time putting in all of the imperfections, whether it's in the design of something or just the unconscious stuff. "&lt;br /&gt;-Andrew Stanton, director of Disney/Pixar's WALL-E, in &lt;a href="http://mag.awn.com/index.php?ltype=pageone&amp;amp;article_no=3682&amp;amp;page=1"&gt;an interview on the topic of graphic detailing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm enough of a sci-fi geek that I had to take my kids to see WALL*E the day it opened.  I found it so entertaining that, while on vacation, I started browsing around the internet... digging for addititonal tidbits about the backstory. &lt;br /&gt;&lt;br /&gt;I came across the quote, above, initially on Wikipedia's &lt;a href="http://en.wikipedia.org/wiki/WALL-E"&gt;Wall-E page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The simple truth carries across all applications of contemporary computer technology.  Technology tools are designed for the "general" cases, and yet, more and more often, we're running into the imperfect, inconsistent, outlying, and exceptional cases.&lt;br /&gt;&lt;br /&gt;To follow the thought along, perhaps 90% of what we do as software developers is about trying to get a grip on the complexities of...  everything we get to touch on.  I guess the remaining 10% would be akin to the root classes...  the "Object" class, and the first few subordinates, for example.&lt;br /&gt;&lt;br /&gt;Andrew Stanton's quote reminds me of the 90-10 rule of software engineering...   90% of the code is implemented in 10% of the time.   (conversely, the remaining 10% of the code is implemented in the remaining 90% of time).  I tend to think of this one as a myth, but it's fun thought.&lt;br /&gt;&lt;br /&gt;It's dealing with the rough fringes of our data that's among the industry's current challenges, but it's not just corporate data landfills. &lt;br /&gt;&lt;br /&gt;I recently heard a report that suggested that technology will get to the point that commercially available vehicles with an auto-pilot will be available within the next 20 or so years.  What's really the difference, to a computer, between financial data, and, say, navigational sensor data? &lt;br /&gt;&lt;br /&gt;So to flip that idea on its head, again, and you could have more intelligent artificial agents spelunking through data warehouses...  WALL-DW ?  (Data Warehouse edition)&lt;br /&gt;&lt;br /&gt;Then again, I wonder if the 80-20% rule isn't what gets us into our binds to begin with.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4310700452327732997?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4310700452327732997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4310700452327732997' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4310700452327732997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4310700452327732997'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/07/walle-and-enterprise-data-landfills.html' title='WALL•E and Enterprise Data Landfills'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-340761236816875321</id><published>2008-07-14T16:47:00.001-04:00</published><updated>2008-07-14T16:49:29.161-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='software development history'/><title type='text'>Real Software Heroes</title><content type='html'>While scanning the channels looking for an interesting show to watch, I came across a show on the Science channel...  "&lt;a href="http://www.imdb.com/title/tt1203167/combined"&gt;Moon Machines&lt;/a&gt;".  I couldn't have been luckier than to see the chapter "Navigation".  &lt;br /&gt; &lt;br /&gt;I'd heard bits about the technology that went into the Apollo missions, and how there were some of the first "modern" IC-based computers on board, but I never really thought about the implications of what they were doing.  Having these computers aboard meant they had software.  There wasn't exactly COTS systems for navigating to the moon.&lt;br /&gt; &lt;br /&gt;The episode focused quite a bit on the experience of the software development team, including some at the personal level.  There were quotes like "Honey, I'm going to be in charge of developing something called 'software'."...  (and the response:  "Please don't tell the neighbors.")&lt;br /&gt; &lt;br /&gt;I've felt pressure on projects before...  stuff I was working on that represented millions of dollars in its success, and presumably millions lost in its failure.  I've even worked on software projects where runtime production logic errors could send people to jail.  I've never written software that human life directly depended on.&lt;br /&gt; &lt;br /&gt;My hat is off to the folks who took up this monumental challenge for the first time in software history, and made it work.  To me, that's every championship sports victory... ever...  combined.  &lt;br /&gt; &lt;br /&gt;All I can say is...  wow.&lt;br /&gt; &lt;br /&gt;They knew what a monumental victory it was, too...  40+/- years later, and the engineers they interviewed were still moved by the awe of their own accomplishment, and the personal sacrifices they made to pull it off.  &lt;br /&gt; &lt;br /&gt;As well they should be.  Fantastic!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-340761236816875321?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/340761236816875321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=340761236816875321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/340761236816875321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/340761236816875321'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/07/real-software-heroes.html' title='Real Software Heroes'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5911897891942036512</id><published>2008-06-26T06:20:00.007-04:00</published><updated>2008-07-13T00:34:31.943-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='risk management'/><category scheme='http://www.blogger.com/atom/ns#' term='SSIS Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>SSIS:  Unit Testing</title><content type='html'>&lt;div&gt;I've spent the past couple days putting together unit tests for SSIS packages. It's not as easy to do as it is to write unit &amp;amp; integration tests for, say, typical C# projects.&lt;br /&gt;&lt;br /&gt;SSIS Data flows can be really complex. Worse, you really can't execute portions of a single data flow separately and get meaninful results.&lt;br /&gt;&lt;br /&gt;Further, one of the key features of SSIS is the fact that the built-in data flow toolbox items can be equated to framework functionality. There's not so much value in unit testing the framework.&lt;br /&gt;&lt;br /&gt;Excuses come easy, but really, unit testing in SSIS is not impossible...&lt;br /&gt;&lt;br /&gt;So meaningful unit testing of SSIS packages really comes down to testing of Executables in a control flow, and particularly executables with a high degree of programability. The two most significant control flow executable types are Script Task executables and Data Flow executables.&lt;br /&gt;&lt;br /&gt;Ultimately, the solution to SSIS unit testing becomes package execution automation.&lt;br /&gt;&lt;br /&gt;There are a certain number of things you have to do before you can start writing C# to test your scripts and data flows, though. I'll go through my experience with it, so far.&lt;br /&gt;&lt;br /&gt;In order to automate SSIS package execution for unit testing, you must have Visual Studio 2005 (or greater) with the language of your choice installed (I chose C#).&lt;br /&gt;&lt;br /&gt;Interestingly, while you can develop and debug SSIS in the Business Intelligence Development System (BIDS, a subset of Visual Studio), you cannot execute SSIS packages from C# without SQL Server 2005 Developer or Enterprise edition installed ("go Microsoft!").&lt;br /&gt;&lt;br /&gt;Another important caveat... you CAN have your unit test project in the same solution as your SSIS project. Due to over-excessive design time validation of SSIS packages, you can't effectively execute the SSIS packages from your unit test code if you have the SSIS project loaded at the same time. I've found that the only way I can safely run my unit tests is to "Unload Project" on the SSIS project before attempting to execute the unit test host app. Even then, Visual Studio occassionally holds locks on files that force me to close and re-open Visual Studio in order to release them.&lt;br /&gt;&lt;br /&gt;Anyway, I chose to use a console application as the host app. There's some info out there on the 'net about how to configure a .config file borrowing from dtexec.exe.config, the SSIS command line utility, but I didn't see anything special in there that I had to include.&lt;br /&gt;&lt;br /&gt;The only reference you need to add to your project is a ref to Microsoft.SqlServer.ManagedDTS. The core namespace you'll need is&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;using Microsoft.SqlServer.Dts.Runtime;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In my first case, most of my unit testing is variations on a single input file. The package validates the input and produces three outputs: a table that contains source records which have passed validation, a flat output file that contains source records that failed validation, and a target table that contains transformed results.&lt;br /&gt;&lt;br /&gt;What I ended up doing was creating a very small framework that allowed me to declare a test and some metadata about it. The metadata associates a group of resources that include a test input, and the three baseline outputs by a common URN. Once I have my input and baselines established, I can circumvent downloading the "real" source file, inject my test source into the process, and compare the results with my baselines.&lt;br /&gt;&lt;br /&gt;Here's an example Unit test of a Validation executable within my SSIS package:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;[TestInfo(Name = "Unit: Validate Source, duplicated line in source", TestURN = "Dupes")]&lt;br /&gt;public void ValidationUnitDupeLineTest()&lt;br /&gt;{&lt;br /&gt;    using (Package thePackage = _dtsApp.LoadPackage(packageFilePath, this))&lt;br /&gt;    {&lt;br /&gt;        thePackage.DelayValidation = true;&lt;br /&gt;        DisableAllExecutables(thePackage);&lt;br /&gt;        EnableValidationExecutable(thePackage);&lt;br /&gt;        InjectBaselineSource(GetBaselineResource("Stage_1_Source_" + TestURN), thePackage.Variables["SourceFilePath"]);&lt;br /&gt;        thePackage.Execute(null, null, this, null, null);&lt;br /&gt;        string errorFilePath = thePackage.Variables["ErrorLogFilePath"].Value as string;&lt;br /&gt;        //throw new AbortTestingException();&lt;br /&gt;        AssertPackageExecutionResult(thePackage, DTSExecResult.Failure);&lt;br /&gt;        AssertBaselineAdjustSource(TestURN);&lt;br /&gt;        AssertBaselineFile(GetBaselineResourceString("Baseline_Stage1_" + TestURN), errorFilePath);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here's the code that does some of the SSIS Package manipulation referenced above:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#region Utilities&lt;br /&gt;protected virtual void DisableAllExecutables(Package thePackage)&lt;br /&gt;{&lt;br /&gt;    Sequence aContainer = thePackage.Executables["Adjustments, Stage 1"] as Sequence;&lt;br /&gt;    (aContainer.Executables["Download Source From SharePoint"] as TaskHost).Disable = true;&lt;br /&gt;    (aContainer.Executables["Prep Target Tables"] as TaskHost).Disable = true;&lt;br /&gt;    (aContainer.Executables["Validate Source Data"] as TaskHost).Disable = true;&lt;br /&gt;    (aContainer.Executables["Process Source Data"] as TaskHost).Disable = true;&lt;br /&gt;    (aContainer.Executables["Source Validation Failure Sequence"] as Sequence).Disable = true;&lt;br /&gt;    (aContainer.Executables["Execute Report Subscription"] as TaskHost).Disable = true;&lt;br /&gt;    (thePackage.Executables["Package Success Sequence"] as Sequence).Disable = true;&lt;br /&gt;    (thePackage.Executables["Package Failure Sequence"] as Sequence).Disable = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected virtual void DisableDownloadExecutable(Package thePackage)&lt;br /&gt;{&lt;br /&gt;    Sequence aContainer = thePackage.Executables["Adjustments, Stage 1"] as Sequence;&lt;br /&gt;    TaskHost dLScriptTask = aContainer.Executables["Download Source From SharePoint"] as TaskHost;&lt;br /&gt;    dLScriptTask.Disable = true;&lt;br /&gt;} &lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;protected virtual void EnableValidationExecutable(Package thePackage)&lt;br /&gt;{&lt;br /&gt;     Sequence aContainer = thePackage.Executables["Adjustments, Stage 1"] as Sequence;&lt;br /&gt;    TaskHost validationFlow = aContainer.Executables["Validate Source Data"] as TaskHost;&lt;br /&gt;    validationFlow.Disable = false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected virtual void EnableValidationExecutable(Package thePackage)&lt;br /&gt;{&lt;br /&gt;    Sequence aContainer = thePackage.Executables["Adjustments, Stage 1"] as Sequence;&lt;br /&gt;    TaskHost validationFlow = aContainer.Executables["Validate Source Data"] as TaskHost;&lt;br /&gt;    validationFlow.Disable = false;&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Another really handy thing to be aware of...&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new;"&gt;IDTSEvents&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I highly recommend you implement this interface and pass it into your packages. Of course, in each event handler in the interface, implement code to send reasonable information to an output stream. Notice the call to thePackage.Execute, way up in the first code snippet... the class that contains that method implements that interface, so I can manipulate (when necessary) how to handle certain events.&lt;br /&gt;&lt;br /&gt;Interestingly, I haven't needed to do anything fancy with that so far, but I can imagine that functionality being very important in future unit tests that I write.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_VpFOixCYDag/SHmECi0os1I/AAAAAAAAABI/RYtBqNWqbsI/s1600-h/SSIS%2520Testing%2520-%2520grouped%2520resources%2520by%2520URN.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5222350422154982226" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_VpFOixCYDag/SHmECi0os1I/AAAAAAAAABI/RYtBqNWqbsI/s320/SSIS%2520Testing%2520-%2520grouped%2520resources%2520by%2520URN.png" border="0" /&gt;&lt;/a&gt;Here's a visual on all the resources... the image shows SSMS over VS, with both database tables and project resources with common URNs to relate them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I won't get into the details of the framework functionality, but I found it useful to be able to do things like set a flag to rebuild baseline resources from current outputs, and such.&lt;br /&gt;&lt;br /&gt;I modeled some of my framework (very loosely) functionality on the Visual Studio Team System Edition for Testers, which we used on the TWM ISIS project.&lt;br /&gt;&lt;br /&gt;Another interesting lesson learned: I can see that the folks who built SSIS were not avid unit testers themselves. SSIS Executables have a "Validate()" method. I encountered lots of problems when I tried to use it. Hangs, intermittent errors, all that stuff that testing should have ironed out. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5911897891942036512?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5911897891942036512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5911897891942036512' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5911897891942036512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5911897891942036512'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/06/ssis-unit-testing.html' title='SSIS:  Unit Testing'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VpFOixCYDag/SHmECi0os1I/AAAAAAAAABI/RYtBqNWqbsI/s72-c/SSIS%2520Testing%2520-%2520grouped%2520resources%2520by%2520URN.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5932330689304767709</id><published>2008-06-18T16:57:00.002-04:00</published><updated>2008-06-18T17:02:20.972-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='enterprise 2.0'/><title type='text'>Null Schema</title><content type='html'>I've been contemplating the whole "unstructured" thing for a while now, and I've developed some new hypotheses about it.  The discussion's been around the fact that Web 2.0 / Enterprise 2.0 generates a lot of "unstructured" data.&lt;br /&gt;&lt;br /&gt;I'm not sure "unstructured" is really the most technically fitting word, though.  It's the word that works if you're a technical person talking to a non-technical person.  &lt;br /&gt;&lt;br /&gt;I think the information we're seeing in these settings is typically better structured than what we've seen in the past.  The structures are being defined by the provider, however, sometimes on an ad-hoc basis, and can change without notice. &lt;br /&gt;&lt;br /&gt;If you're in the geek domain, I think "undefined" fits better.  Maybe "unknowable structure".   It's &lt;em&gt;Null Schema&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;I think we've all seen tons of this...  it's a trend towards increasing structure with less defined schema.  It seems to fit with the "agile" trend.  &lt;br /&gt;&lt;br /&gt;So the other aspect of this Web 2.0 thing is that the data doesn't have to just be of an unknowable format.  It can also be communicated through a number of communications channels, at the provider's discretion.  People define conventions to ease this.  Interestingly, the convened-upon channels end up providing context for the content.  In turn, it adds to its structure...   more null schema.&lt;br /&gt;&lt;br /&gt;It flies in the face of our tightly defined, versioned SOA end-point contracts.  XSOA?  :)   &lt;br /&gt;&lt;br /&gt;It's been said that SOA lives in a different problem space, but that may only be a matter of convention, moving forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5932330689304767709?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5932330689304767709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5932330689304767709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5932330689304767709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5932330689304767709'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/06/null-schema.html' title='Null Schema'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-564257855974024196</id><published>2008-06-06T17:00:00.001-04:00</published><updated>2008-06-06T17:08:33.682-04:00</updated><title type='text'>My Windows Mobile PCS Phone</title><content type='html'>I just gotta say...  this thing's fantastic.  &lt;br /&gt; &lt;br /&gt;It's my own personal mobile phone (not company issued), but I really do get some hefty mileage out of it.&lt;br /&gt; &lt;br /&gt;It's a Sprint Mogul 6800.  Verizon has a similar unit (vx6800, I think).  It's one of many Windows Mobile 6 devices out there... touch screen, with a stylus and a slide out keyboard.  It was already a little dated when I bought it, but that just meant the price wasn't so high.&lt;br /&gt; &lt;br /&gt;I'm just psyched because I bought this one back in September 2007, and I keep finding new uses for it.  &lt;br /&gt; &lt;br /&gt;My new assignment is in Boston.  One of the rough edges of the assignment, for me, is the long commute...  (1 hour minimum (if traffic's really good)).  So after doing the math, I discovered that I can pick up the Boston Express bus ride from a neighboring town. &lt;br /&gt; &lt;br /&gt;I'm on the return trip at this moment, using my phone for internet access, and it's really solid, EV-DO.A service.  Connectivity is a USB port away.&lt;br /&gt; &lt;br /&gt;While I'm doing that, I'm ALSO listening to 2Gb worth of music that I downloaded via subscription service from Napster using Windows Media Player Mobile.&lt;br /&gt; &lt;br /&gt;The built in GPS was not software-enabled when I bought the phone, but a software upgrade released in January solved that.  The GPS works great with the Google Maps for Pocket PC app I downloaded for free.  This morning, it got me from South Station to NHP just like it got me from NYC's Port Authority bus terminal to the AT&amp;T store on Madison Ave a few weeks ago to see MS Surface.&lt;br /&gt; &lt;br /&gt;So I also toy with the .NET Compact Framework, and used it some time ago to write my own Windows Mobile implementation of sudoku.  (I've been seriously considering refactoring to mess with LINQ in the .NET CF 3.5)  &lt;br /&gt; &lt;br /&gt;The built in camera's nice... I use it all the time when I've forgotten my "real" camera.  &lt;br /&gt; &lt;br /&gt;Wi-Fi is occasionally very handy...  it's great when I need network access while talking on the phone.  &lt;br /&gt; &lt;br /&gt;So is bluetooth...  I appreciate being able to talk on the bluetooth headset while taking notes or looking stuff up online... or just appreciate talking hands-free.&lt;br /&gt; &lt;br /&gt;I sync the thing with Outlook, and rely on it too heavily for meeting reminders.  That comes in handy at NHP, too, where network access is... limited.  (I can even get RSS updates from the Tech Mill.)   It's also integrated with Active Directory, so when I need a teammate's contact info, I can find it online as long as I have connectivity (pretty much always).&lt;br /&gt; &lt;br /&gt;I've used the voice recorder a few times.  It's been handy when I've needed it.&lt;br /&gt; &lt;br /&gt;There's a whole list of "separate" items I don't carry because I have this thing...  I don't wear a watch.  I don't have an iPod.  I don't carry a GPS handheld, or keep one in my car. I don't often carry around my camera.  I seldom use paper to take notes, so I don't often need a pen.  This one thing covers all that stuff, and more.&lt;br /&gt; &lt;br /&gt;Did I mention that it's a phone?  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-564257855974024196?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/564257855974024196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=564257855974024196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/564257855974024196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/564257855974024196'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/06/my-windows-mobile-pcs-phone.html' title='My Windows Mobile PCS Phone'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4074403055503236163</id><published>2008-05-20T16:40:00.003-04:00</published><updated>2008-05-20T16:54:14.790-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Enterprise Reprogramming</title><content type='html'>I found an interview of a Satyam Senior VP listed on LinkedIn relatively interesting (link below).&lt;br /&gt; &lt;br /&gt;This senior VP talks about how Satyam and the IT industry is responding to new challenges.&lt;br /&gt; &lt;br /&gt;One thing that stands out to me is the statement that they are moving from services to solutions. They make the implication that they are rebuilding or reprogramming businesses at the workflow / process level.  They appear to be successfully applying technology build-out as a commodity service while implementing their solutions...   Sounds like they're treating the enterprise as a sort of programmable platform, like SOA / BPM on a grand scale.&lt;br /&gt; &lt;br /&gt;From the article:&lt;br /&gt;"A solutions provider transforms business. The difference in business will happen when we change those business processes as well. That is where we are bringing in business transformation solutions — process optimisation, process reengineering, etc. "&lt;br /&gt; &lt;br /&gt;My intuition doesn't quite square with Satyam's vision.&lt;br /&gt;&lt;br /&gt;Lots of things have been pointing towards more innovation in the top layers of applications, built on a very stable technology base.  To me, it still feels like there's an unspoken motivation for that:  business leadership wants IT folks to make ruggedized app dev tools and hand them over to power users (and/or process owners).  Business leaders want IT to get the C# off their business processes.   &lt;br /&gt;&lt;br /&gt;All of that is sorta where I started cooking up the hypothesis of metaware from.&lt;br /&gt; &lt;br /&gt;I'm curious to know how Satyam's vision is really working.  I guess we'll know in a few years.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sify.com/finance/fullstory.php?id=14676435"&gt;‘Moving towards IP-led revenues’&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4074403055503236163?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4074403055503236163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4074403055503236163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4074403055503236163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4074403055503236163'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/05/enterprise-reprogramming.html' title='Enterprise Reprogramming'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3382026976925182283</id><published>2008-05-18T07:52:00.015-04:00</published><updated>2008-05-20T09:21:45.205-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic code crafting'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>Functional Expression</title><content type='html'>So one more thing crossed my mind about implementing code with respect to art &amp;amp; science, and I had to express it...&lt;br /&gt;&lt;br /&gt;I looked up the &lt;a href="http://dictionary.reference.com/browse/art"&gt;term "Art" in the dictionary&lt;/a&gt;. The first definition is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the quality, production, expression, or realm, according to aesthetic principles, of what is beautiful, appealing, or of more than ordinary significance. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For me, regarding coding, it's a matter of remembering a few points:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;implementation is expression&lt;/li&gt;&lt;li&gt;significance is subjective&lt;/li&gt;&lt;li&gt;beauty is in the eye of the beholder&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So code can be expressed, fundamentally, in a bunch of ways:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Electronically,&lt;/li&gt;&lt;li&gt;Numerically, &lt;/li&gt;&lt;li&gt;mnemonically, &lt;/li&gt;&lt;li&gt;symbolically, &lt;/li&gt;&lt;li&gt;graphically, &lt;/li&gt;&lt;li&gt;gesturally, &lt;/li&gt;&lt;li&gt;audibly, &lt;/li&gt;&lt;li&gt;visually,&lt;/li&gt;&lt;li&gt;etc... ?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Simple, clever, elegant, seemingly natural expressions of all kinds are typically beautiful to a programmer, when they function correctly.&lt;/p&gt;&lt;p&gt;Of course, to me, the most beautiful implementations are implementations that elegantly express its business in a way that's very clear to anyone familiar with the problem domain at that abstraction level, and to the target platform(s). &lt;/p&gt;&lt;br /&gt;&lt;p&gt;See also:&lt;br&gt;&lt;a href="http://politechnosis.kataire.com/2008/05/programming-art-science.html"&gt;politechnosis: Art &amp;amp; Science&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/2645223572805964973-3382026976925182283?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3382026976925182283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3382026976925182283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3382026976925182283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3382026976925182283'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/05/functional-expression-art-science-part.html' title='Functional Expression'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-146653523558469725</id><published>2008-05-17T10:00:00.010-04:00</published><updated>2008-05-20T09:20:31.900-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic code crafting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='risk management'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>Artless Programming</title><content type='html'>So maybe I am strange... I actually have printed snips of source code and UML diagrams and hung them on my office wall because I found them inspirational.&lt;br /&gt;&lt;br /&gt;Reminds me of a quote from The Matrix movies...&lt;br /&gt;Cypher [to Neo]: "I don't even see the code. All I see is blonde, brunette, red-head." :)&lt;br /&gt;&lt;br /&gt;It's not quite like that, but you get the point. There's gotta be a back-story behind the witty writing. I suspect it has something to do with a programmer appreciating particularly elegant solutions.&lt;br /&gt;&lt;br /&gt;One of the hard parts about knowing that programming is an artful craft is being forced to write artless code. It happens all the time. Risks get in the way... a risk of going over budget, blowing the schedule, adding complexity, breaking something else.&lt;br /&gt;&lt;br /&gt;It all builds up. The reality is, as much as we software implementers really want application development to be an art, our business sponsors really want it to be a defined process.&lt;br /&gt;&lt;br /&gt;The good news for programmers is that every application is a custom application.&lt;br /&gt;&lt;br /&gt;It really sucks when you're surgically injecting a single new business rule into an existing, ancient system.&lt;br /&gt;&lt;br /&gt;This is the case with one of my current clients. At every corner, there's a constraint limiting me. One false move, and whole subsystems could fail... I have such limited visibility into those subsystems, I won't know until after I deploy to their QA systems and let them discover it. If I ask for more visibility, we risk scope creep. The risks pile up, force my hand, and I end up pushed into a very tightly confined implementation. The end result is awkward, at best. It's arguably even more unmaintainable.&lt;br /&gt;&lt;br /&gt;These are the types of projects that remind me to appreciate those snips of inspirational code.&lt;br /&gt;&lt;br /&gt;Don't get me wrong. I'm happy there's a fitting solution within scope at all. I'm very happy that the client's happy... the project's under budget and ahead of schedule.&lt;br /&gt;&lt;br /&gt;The "fun" in this case, has been facing the Class 5 rapids, and finding that one navigable path to a solution.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://politechnosis.kataire.com/2008/05/programming-art-science.html"&gt;politechnosis: Art &amp;amp; Science&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-146653523558469725?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/146653523558469725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=146653523558469725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/146653523558469725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/146653523558469725'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/05/artless-programming.html' title='Artless Programming'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-2160125869543993830</id><published>2008-05-10T12:19:00.021-04:00</published><updated>2008-05-19T08:56:05.800-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic code crafting'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='software factory'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><title type='text'>Art &amp; Science</title><content type='html'>Fire &amp;amp; Ice... Day &amp;amp; Night...&lt;br /&gt;&lt;br /&gt;This question, Art vs. Science, has come up a million times in software development circles. Reading Paul Johnson's (Paul's Pontifications) blog post, in conjunction with a discussion in the Tech Mill at Edgewater, (thanks, Jason!) I have come to see that art and science are not as opposite as I once viewed them to be.&lt;br /&gt;&lt;br /&gt;What hit me was that Paul makes the statement that there's no process to implementing software. I still disagree. There are many processes.&lt;br /&gt;&lt;br /&gt;The number of processes that an implementer can choose from to write his/her code is often vast, and depends on the problem set. A problem set includes many things, including requirements, tools, target platform, development platform, existing code, and even the implementer's mood and frame of mind. That is what makes implementing code, like painting, or creating a recipe, an art.&lt;br /&gt;&lt;br /&gt;Within a common implementation problem set, there can be a large number of processes which can be applied to derive valid solutions. In fact, there are so many, that some distinct processes may actually render the very same code. So, to be more clear, it's not that there's no process... it's that there's no single valid process.&lt;br /&gt;&lt;br /&gt;Knowing that there's no one single valid process doesn't mean that we can't pick a needle from the haystack... if the process produces a solution within the problem set, it's good.&lt;br /&gt;&lt;br /&gt;Now consider what happens when you start to narrow a problem set. There's lots of things you can do. Frameworks, platforms, clear-specific requirements, best practices, coding standards, well structured architectures... these things are all factors that limit the problem set. By narrowing a problem set, you narrow the number of valid processes. By narrowing the number of valid processes that a developer can choose from, lots of interesting things start to happen. You achieve more predictable results, and are more likely to achieve repeatable schedules... and you reduce overall project risk.&lt;br /&gt;&lt;br /&gt;This is what's so interesting about contemporary trends in software development, such as Ruby on Rails... use of these tools narrows problem sets that developers face. This means the implementer can spend less time figuring out where the blanks are, and more time filling them.&lt;br /&gt;&lt;br /&gt;Now let's take this further. What happens when you reduce the problem set dramatically...? Take a single, relatively well known problem, on a very specific platform, using a very small set of unambiguous expressions. You get a very tightly defined process. By doing this, you wring the art out of creating something, to the point where it becomes machinable. The process becomes realized as a factory.&lt;br /&gt;&lt;br /&gt;So to answer the question... Art or Science?&lt;br /&gt;&lt;br /&gt;It's a trick question... art and science are not exclusive opposites. Art is about freedom to choose your creative process. Science is about knowing what processes are available, and the pros and cons of each. So programming, like all creative activities, is usually art (except in single-processed cases), and usually science (except in cases of serendipity and true miracles).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://paulspontifications.blogspot.com/2008/05/under-appreciated-fact-we-dont-know-how.html"&gt;Paul's Pontifications: An Under-Appreciated Fact: We Don't Know How We Program&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-2160125869543993830?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/2160125869543993830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=2160125869543993830' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2160125869543993830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/2160125869543993830'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/05/programming-art-science.html' title='Art &amp; Science'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4937049013185137972</id><published>2008-05-08T11:57:00.006-04:00</published><updated>2008-05-08T15:16:37.720-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='surface'/><category scheme='http://www.blogger.com/atom/ns#' term='multi-touch ui'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Hands on Surface</title><content type='html'>&lt;div&gt;There's a developing UI paradigm growing, and some of it has been released in the wild.&lt;br /&gt;&lt;br /&gt;Multi-point touch screen systems are starting to take shape out of the ether, and it really feels like it's going to usher in a new era of computing. We've talked about a few of them here in the Tech Mill. It's "Minority Report" without the goofy VR glove.&lt;br /&gt;&lt;br /&gt;Microsoft's offering in this arena is Surface (formerly "Milan").( &lt;a href="http://www.microsoft.com/surface"&gt;http://www.microsoft.com/surface&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;From available marketing materials, Surface is much like the other offerings that are under development, with a few interesting differences. Rather than being an interactive "wall", it's a "table". In addition to interacting to a broad range of touch-based gestures, Surface also interacts with objects. Some of it's marketed use-cases involve direct interaction with smartphone, media, and storage devices.&lt;br /&gt;&lt;br /&gt;This week, I'm on a training assignment in New Jersey, but within a bus ride to one of very few instances of Surface "in the wild".&lt;br /&gt;&lt;br /&gt;I made it a secondary objective to hit one of the AT&amp;amp;T stores in mid-town Manhattan.&lt;br /&gt;&lt;br /&gt;I had a lot of high expectations for it, so actually getting to play a bit with it struck me as a touch anti-climactic. The UI was great, but it was clear they cut costs on hardware a bit: responsiveness wasn't quite as smooth as the web demos. It did impress me with the physics modeling of the touch gestures... dragging "cards" around the table with one finger mimicked the behavior of a physical card, pivoting around the un-centered touch point as a real one would.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_VpFOixCYDag/SCMjb5imNpI/AAAAAAAAAAg/GMQ9NglWwGY/s1600-h/IMAGE_064.jpg" align="right"&gt;&lt;img id="BLOGGER_PHOTO_ID_5198037357125056146" style="FLOAT: right; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_VpFOixCYDag/SCMjb5imNpI/AAAAAAAAAAg/GMQ9NglWwGY/s320/IMAGE_064.jpg" border="0" /&gt;&lt;/a&gt;I was also a bit concerned that the security devices attached to the cell phones they had around the table were some sort of transponder to hide "vapor-ware" special effects. My own phone (an HTC Mogul by Sprint) was ignored when I placed it on the table.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All in all, I was happy to finally get to play with it. Between technology advances and price drops, this UI paradigm will start to make it into the power business user's desk.&lt;br /&gt;&lt;br /&gt;I mean, can you imagine, for example, cube analysis.... data mining... report drilling... and then with a few gestures, you transform the results into charts and graphs... then throw those into a folder on your mobile storage / pda device...&lt;br /&gt;&lt;br /&gt;I'm still loving the idea of interactivity between physical and virtual (and/or remote) logical constructs...&lt;br /&gt;&lt;br /&gt;Imagine bringing up the file server and your laptop on a "Surface" UI, and litterally loading it with data and installing software with the wave of your hand....&lt;br /&gt;&lt;br /&gt;or...&lt;br /&gt;&lt;br /&gt;Having a portable "PDA" device with "big" storage... in fact, big enough to contain a virtual PC image... In stand-alone mode, the PDA runs the VPC in a "smart display" UI. When you set it on a Surface, the whole VPC sinks into it. You get access to all the Surface functional resources including horsepower, connectivity, additional storage, and the multi-touch UI while the PDA is in contact. When you're done, the VPC transfers back to the PDA, and you can take it to the next Surface UI in your room at the hotel, or the board room (which has one giant "Surface" as the board room table.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_VpFOixCYDag/SCMjv5imNqI/AAAAAAAAAAo/7zbIfdCLDJE/s1600-h/IMAGE_060.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5198037700722439842" style="FLOAT: right; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_VpFOixCYDag/SCMjv5imNqI/AAAAAAAAAAo/7zbIfdCLDJE/s320/IMAGE_060.jpg" border="0" /&gt;&lt;/a&gt;The preview is over at AT&amp;amp;T today. According to Wikipedia, Microsoft expects they can get these down to consumer price ranges by 2010 (two years!). &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4937049013185137972?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4937049013185137972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4937049013185137972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4937049013185137972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4937049013185137972'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/05/hands-on-surface.html' title='Hands on Surface'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_VpFOixCYDag/SCMjb5imNpI/AAAAAAAAAAg/GMQ9NglWwGY/s72-c/IMAGE_064.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-3727270634930189321</id><published>2008-05-04T23:40:00.002-04:00</published><updated>2008-05-05T22:13:41.481-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multi-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='risk management'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Multiprocessing:  How 'bout that Free Lunch?</title><content type='html'>I remember reading an article, a few years back...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gotw.ca/publications/concurrency-ddj.htm"&gt;The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Its tagline: "The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency."&lt;br /&gt;&lt;br /&gt;Mr. Sutter's article suggests that because CPUs are now forced to improve performance through multi-core architectures, applications will need to typically employ multi-threading to gain performance improvements on newer hardware. He made a great argument. I remember getting excited enough to bring up the idea to my team at the time.&lt;br /&gt;&lt;br /&gt;There are a number of reasons why the tag line and most of its supporting arguments appeared to fail, and in retrospect, could have been predicted.&lt;br /&gt;&lt;br /&gt;So in today's age of multi-core processing, where application performance gains necessarily come from improved hardware throughput, why does it still feel like we're getting a free lunch?&lt;br /&gt;&lt;br /&gt;To some extent, Herb was right. I mean, really, a lot of applications, by themselves, are not getting as much out of their host hardware as they could.&lt;br /&gt;&lt;br /&gt;Before and since this article, I've written multi-threaded application code for several purposes. Each time, the threading was in UI code. The most common reason for it: to monitor extra-process activities without blocking the UI message pump. Yes, that's right... In my experience, the most common reason for multi-threading is, essentially, to allow the UI message pump to keep pumping while waiting for… something else.&lt;br /&gt;&lt;br /&gt;But many applications really have experienced significant performance improvements in multi-processor / multi-core systems, and no additional application code was written, changed, or even re-compiled to make that happen.&lt;br /&gt;&lt;br /&gt;How?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Reduced inter-process contention for processor time&lt;/li&gt;&lt;li&gt;Client-server architectures (even when co-hosted, due to the above)&lt;/li&gt;&lt;li&gt;Multi-threaded software frameworks&lt;/li&gt;&lt;li&gt;Improved supporting hardware frameworks&lt;/li&gt;&lt;/ul&gt;Today's computers are typically doing more, all the time. The OS itself has a lot of overhead, especially Windows-based systems. New Vista systems rely heavily on multi-processing to get performance for the glitzy new GUI features.&lt;br /&gt;&lt;br /&gt;The key is multi-processing, though, rather than multi-threading. Given that CPU time is a resource that must be shared, having more CPUs means less scheduling collision, less single-CPU context switching.&lt;br /&gt;&lt;br /&gt;Many architectures are already inherent multi-processors. A client-server or n-tier system is generally already running on a minimum of two separate processes. In a typical web architecture, with an enterprise-grade DBMS, not only do you have built-in “free” multi-processing, but you also have at least some built-in, “free” multi-threading.&lt;br /&gt;&lt;br /&gt;Something else that developers don’t seem to have noticed much is that some frameworks are inherently multi-threaded. For example the Microsoft Windows Presentation Foundation, a general GUI framework, does a lot of its rendering on separate threads. By simply building a GUI in WPF, your client application can start to take advantage of the additional CPUs, and the program author might not even be aware of it. Learning a framework like WPF isn’t exactly free, but typically, you’re not using that framework for the multi-threading features. Multi-threading, in that case, is a nice “cheap” benefit.&lt;br /&gt;&lt;br /&gt;When it comes down to it, though, the biggest bottlenecks in hardware are not the processor, anyway. The front-side bus is the front-line to the CPU, and it typically can’t keep a single CPU’s working set fresh. Give it a team of CPUs to feed, and things get pretty hopeless pretty quick. (HyperTransport and QuickPath will change this, but only to the extent of pushing the bottle necks a little further away from the processors.)&lt;br /&gt;&lt;br /&gt;So to re-cap, to date, the reason we haven’t seen a sea change in application software development is because we’re already leveraging multiple processors in many ways other than multi-threading. Further, multi-threading options have been largely abstracted away from application developers via mechanisms like application hosting, database management, and frameworks.&lt;br /&gt;&lt;br /&gt;With things like HyperTransport (AMD’s baby) and QuickPath (Intel’s), will application developers really have to start worrying about intra-process concurrency?&lt;br /&gt;&lt;br /&gt;I throw this one back to the Great Commandment… risk management. The best way to manage the risk of intra-process concurrency (threading) is to simply avoid it as much as possible. Continuing to use the above mentioned techniques, we let the 800-lb gorillas do the heavy lifting. We avoid struggling with race conditions and deadlocks.&lt;br /&gt;&lt;br /&gt;When concurrent processing must be done, interestingly, the best way to branch off a thread is to treat it as if it were a separate process. Even the .NET Framework 2.0 has some nice threading mechanisms that make this easy. If there are low communications needs, consider actually forking a new process, rather than multi-threading.&lt;br /&gt;&lt;br /&gt;In conclusion, the lunch may not always be free, but a good engineer should look for it, anyway. Concurrency is, and will always be an issue, but multi-core processors were not the event that sparked that evolution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-3727270634930189321?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/3727270634930189321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=3727270634930189321' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3727270634930189321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/3727270634930189321'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/04/multiprocessing-how-bout-that-free.html' title='Multiprocessing:  How &apos;bout that Free Lunch?'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5637499480075908664</id><published>2008-04-10T15:01:00.003-04:00</published><updated>2008-04-10T15:04:03.672-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><title type='text'>Converging Metadata on XAML</title><content type='html'>In a recent project, we used Excel spreadsheets to capture the data dictionaries for our functional requirements.  The project actually had 22 data dictionary sections, each with about a hundred data points described in them.  Each data point had on the order of twenty properties that the client needed to know about.  It included not only how to present the data entry field, but how to bind it at runtime to business objects, how to transform the user input before presenting the data to various back-end systems, validation, and a few other rules.&lt;br /&gt;&lt;br /&gt;Excel spreadsheets can be saved off as XML, a fact which we leveraged.  Our analysts filled in the Excel spreadsheets, identifying all the data points and the typical properties of each.  After that, we engineers filled in bindings and a few other more technical details.  Later, we transformed our Excel-document data dictionaries into a custom XML format (a Domain Specific Language or DSL) using XSLT.  Finally, we compiled those extracts into our client application as a resource (one for each dictionary) containing all the client metadata for that dictionary.   &lt;br /&gt;&lt;br /&gt;Divorcing ourselves from the broken notion that XAML is WPF, and with just a little more time (on the order of days), we could have codified our DSL into a set of .NET classes.  By doing this, we could have converged our data dictionary metadata on XAML.  In effect, this would have turned metadata directly into runtime business objects.  These business objects would have served as the content for our WPF-based LOB data entry forms.  In turn, this would have greatly simplified a number of complexities, especially around the problem of indirect data binding.  The end result would have been a more maintainable code base, and even faster running code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5637499480075908664?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5637499480075908664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5637499480075908664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5637499480075908664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5637499480075908664'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/04/converging-metadata-on-xaml.html' title='Converging Metadata on XAML'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-7957780600811522733</id><published>2008-04-06T17:42:00.015-04:00</published><updated>2008-04-11T15:31:03.745-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='it industry'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='metaware'/><title type='text'>Metaware</title><content type='html'>There's been a fair amount of buzz in the IT world about IT-Business alignment lately. The complaints seem to be that IT seems to produce solutions that are simply too expensive. Solutions seem to range from "Agile" methodologies to dissolving the contemporary IT group into the rest of the enterprise. &lt;br /&gt;&lt;br /&gt;I think there's another piece that the industry is failing to fully explore.&lt;br /&gt;&lt;br /&gt;I think what I've observed is that the most expensive part of application development is actually the communications overhead. It seems to me that the number one reason for bad apps, delays, and outright project failures, is firmly grounded in communications issues. Getting it "right" is always expensive. (Getting it wrong is dramatically worse.) In the current IT industry, getting it right typically means teaching analysts, technical writers, developers, QA, and help desk significant aspects of the problem domain, along with all the underlying technologies they need to know. &lt;br /&gt;&lt;br /&gt;In the early days of "application development", software based applications were most often developed by savvy business users with tools like Lotus 1-2-3. The really savvy types dug in on dBase. We all know why this didn't work, and the ultimate response was client-server technology. Unfortunately, the client-server application development methodologies also entrenched this broad knowledge sharing requirement.&lt;br /&gt;&lt;br /&gt;So how do you smooth out this wrinkle? I believe Business Analytics, SOA/BPM, Semantic web, portals/portlets... they're providing hints.&lt;br /&gt;&lt;br /&gt;There have been a few times in my career where I was asked to provide rather nebulous functionality to customers. Specificially, I can think of two early client-server projects where the users wanted to be able to query a database in uncertain terms of their problem domain. In both of these cases, I built application UI's that allowed the user to express query details in easy, domain-specific terms. User expressions were translated dynamically by software into SQL. All of the technical jargon was hidden away from the user. I was even able to allow users to save favorite queries, and share them with co-workers. They enabled the users to look at all their information in ways that no one, not even I, had considered before hand. The apps worked without giving up the advances of client-server technology, and without forcing the user into technical learning curves. These projects were both delivered on time and budget. As importantly, they were considered great successes. &lt;br /&gt;&lt;br /&gt;In more recent times, certain trends that have caught my attention: the popularity of BI (especially cube analysis), and portal/portlets. Of all the other tools/technologies out there, these tools are actively demanded by business end-users. At the same time, classic software application development seems to be in relatively reduced demand. &lt;br /&gt;&lt;br /&gt;Pulling it all together, it seems like the IT departments have tied business innovation into the rigors of client-server software application development. By doing this, all the communications overhead that goes with doing it right are implied.&lt;br /&gt;&lt;br /&gt;It seems like we need a new abstraction on top of software... a layer that splits technology out of the problem domain, allowing business users to develop their own applications. &lt;br /&gt;&lt;br /&gt;I've hijacked the word "metaware" as a way of thinking about the edge between business users as process actors (wetware) and software. Of course, it's derived from metadata application concepts.  At first, it seems hard to grasp, but the more I use it, the more it seems to make sense to me. &lt;br /&gt;&lt;br /&gt;Here is how I approach the term...&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_VpFOixCYDag/R_lOhFOZStI/AAAAAAAAAAM/2m9rgPvsn-U/s1600-h/metaware+region.PNG"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_VpFOixCYDag/R_lOhFOZStI/AAAAAAAAAAM/2m9rgPvsn-U/s320/metaware+region.PNG" border="0" alt="Application Space. This diagram shows the surface of IT to User domains across technology and business process space. This surface covers hardware, software, metaware, and wetware, including where these 'wares touch." id="BLOGGER_PHOTO_ID_5186262776139041490" /&gt;&lt;/a&gt;&lt;br /&gt;As I've mentioned in the past, I think of people's roles in business systems as "&lt;strong&gt;wetware&lt;/strong&gt;". Wikipedia has &lt;a href="http://en.wikipedia.org/wiki/Wetware"&gt;an entry for wetware&lt;/a&gt; that describes its use in various domains. Wetware is great at problem solving.&lt;br /&gt;&lt;br /&gt;Why don't we implement all solutions using wetware? &lt;br /&gt;&lt;br /&gt;It's not fast, reliable, or consistent enough for modern business needs. Frankly, wetware doesn't scale well.&lt;br /&gt;&lt;br /&gt;Hardware, of course, is easy to grasp... it's the physical machine. It tends to be responsible for physical storage and high-speed signal transmission, as well as providing the calculation iron, and general processing brains for the software. It's lightening fast, and extremely reliable. Hardware is perfect in the physical world... if you intend to produce physical products, you need hardware. Hardware applications extends all the way out to wetware, typically in the form of human interfaces. (The term HID tends to neglect output such as displays. I think that's an oversight... just because monitors don't connect to USB ports doesn't mean they're not human interface devices.)&lt;br /&gt;&lt;br /&gt;Why do we not use hardware to implement all solutions? &lt;br /&gt;&lt;br /&gt;Because hardware is very expensive to manipulate, and takes lots of specialized tools and engineering know how to implement relatively small details. Turnaround time on changes makes it impractical in risk-management aspects for general purpose / business application development.&lt;br /&gt;&lt;br /&gt;Software in the contemporary sense is also easy to grasp. It is most often thought to provide a layer on top of a general purpose hardware platform to integrate hardware and create applications with semantics in a particular domain. Software is also used to smooth out differences between hardware components and even other software components. It even smooths over differences in wetware by making localization, configuration, and personalization easier. Software is the concept that enabled the modern computing era.&lt;br /&gt;&lt;br /&gt;When is software the wrong choice for an application? &lt;br /&gt;&lt;br /&gt;Application software becomes a problem when it doesn't respect separation of concerns between integration points. The most critical "integration point" abstraction that gets flubbed is between business process and the underlying technology. Typically, general purpose application development tools are still too technical for user domain developers, and so quite a bit of communications overhead is required even for small changes. This communications overhead is becomes expensive, and complicated by generally difficult deployment issues. While significant efforts have been made to reduce the communications overhead, these tend to attempt to eliminate artifacts that are necessary for the continued maintenance and development of the system.&lt;br /&gt;&lt;br /&gt;Enter metaware. Metaware is similar in nature to software. It runs entirely on a software-supported client-server platform. Most software engineers would think of it as process owners' expressions interpreted dynamically by software. It's the culmination of SOA/BPM... for example BPMN (Notation) that is then rendered as a business application by an enterprise software system.&lt;br /&gt;&lt;br /&gt;While some might dismiss the idea of metaware as buzz, it suggests important changes to the way IT departments might write software.  Respecting the metaware layer will affect the way I design software in the future.  Further, respecting metaware concepts suggests important changes in the relationship between IT and the rest of the enterprise. &lt;br /&gt;&lt;br /&gt;Ultimately it cuts costs in application development by restoring separation of concerns... IT focuses on building and managing technology to enable business users to express their artifacts in a technologically safe framework. Business users can then get back to innovating without IT in their hair.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-7957780600811522733?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/7957780600811522733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=7957780600811522733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7957780600811522733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/7957780600811522733'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/04/metaware.html' title='Metaware'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_VpFOixCYDag/R_lOhFOZStI/AAAAAAAAAAM/2m9rgPvsn-U/s72-c/metaware+region.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-5719341167149442781</id><published>2008-03-24T15:32:00.001-04:00</published><updated>2008-03-24T15:34:58.724-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>The Mature Software Industry, Corporate Specialization, p2</title><content type='html'>In driving down I-293 around the city of Manchester one night this weekend, I noticed some of the old factories across the river were lit up so you could see the machinery they contained.  Those machines have probably been producing goods reliably for decades. &lt;br /&gt;&lt;br /&gt;In my last post, ("&lt;a href="http://politechnosis.kataire.com/2008/03/corporate-specialization.html"&gt;Corporate Specialization&lt;/a&gt;") I used an analogy of power plants to describe how software engineering groups might someday fit into the corporate landscape.&lt;br /&gt;&lt;br /&gt;I found myself thinking that a more precise analogy would be to liken software application development to... hardware application development.  &lt;br /&gt;&lt;br /&gt;When it comes down to it, hardware, software... the end user doesn't care.  They're all just tools to get their real jobs done.&lt;br /&gt;&lt;br /&gt;I remember seeing this when I was a kid.  I recall observing that when the Atari 2600 has a cartridge inserted, and it's powered on, the hardware and software components were functionally indistinguishable.  The complete system might as well be a dedicated-purpose hardware machine.  It became an appliance.&lt;br /&gt;&lt;br /&gt;Modern platforms don't really change that appliance effect to the end-user.&lt;br /&gt;&lt;br /&gt;So, aside from operators, I'm sure these classic B&amp;amp;M manufacturers have technical people to maintain and manage their equipment.  I'd be surprised to find out that they keep a full team of mechanical engineers on the staff, though.  It seems to make sense that a mature software development industry will start to look much more like that over time.&lt;br /&gt;&lt;br /&gt;Further, take a look at computer hardware.  It's undergone some maturing over the past few decades too.  There really aren't many companies that actually bake their own. I remember tinkering a bit with chips &amp;amp; solder.  Then, I started building PC's from components.  While my current desktop at home is still one of my own "Franken PC's", I think it's been over a year since I even cracked the case on it.  I suspect that when I finally break down &amp;amp; replace the thing, it will be 100% Dell (or maybe Sony) [and Microsoft].&lt;br /&gt;&lt;br /&gt;With respect to software engineering, never mind all that FUD we're hearing about IT getting sucked into business units.   That's good for "operators" and "maintenance" types, who become analytics and process management in the new world order.  I suspect the heavy lifting software engineering will eventually be done mostly by companies that specialize in it.&lt;br /&gt;&lt;br /&gt;With that, it might be more educational to look at the histories-to-date of the industrial-mechanical and electrical engineering groups to see the future of the software engineering group.&lt;br /&gt;&lt;br /&gt;I think this might be where MS &amp;amp; Google are really battling it out, long term.  As the software industry continues to mature, the companies with the most proven, stable software components will end up with the market advantage when it comes to building "business factories" out of them for their clients.  ...or maybe it will just be about the most matured development and engineering processes... or maybe both... ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-5719341167149442781?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/5719341167149442781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=5719341167149442781' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5719341167149442781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/5719341167149442781'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/03/mature-software-industry-corporate.html' title='The Mature Software Industry, Corporate Specialization, p2'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-6493395846020620041</id><published>2008-03-24T15:27:00.002-04:00</published><updated>2008-03-24T15:40:14.888-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Corporate Specialization</title><content type='html'>There's an old adage: "Anything you can buy, you can produce yourself for less."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In our business, we're well aware that there are a few fundamentally flawed assumptions with that sentiment. Despite the barriers to entry and many other recurring costs, somehow the idea seems pervasive in the business world.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I started my career in a consulting shop that insisted it was a product company. Then I moved, through market forces, into products based companies. I stayed on board with some of them long enough to help shut out the lights and unplug the servers when the sales didn’t hit the marks. The other big problem I’ve seen with product shops was that it’s engineering group typically went through its own “release cycles”… once the product was released, my team was cut to the bone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've never been in a classic IT shop, per se, but I’ve definitely been on tangent IT-support projects within “product” oriented companies. In IT groups, I’ve often thought that companies might see IT projects as frills and overhead. At some level, I think the pervasive IT-alignment is a counter measure to that idea. Still, it seems IT projects are typically viewed as liability, rather than asset. When it comes time for the company to refocus on its core competencies, (which is inevitable in the ups &amp;amp; downs of business) IT projects are prime targets for cutbacks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since the “.COM bust”, in these types of companies, an engineer on the staff for just three years is often seen as a “long-timer”… but no one feels bad about that, since a lot of these companies fold in that time frame, as well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After experiencing the product based companys' ups &amp;amp; downs, and seeing many colleagues who had already been through the IT shops, I’m convinced… the outsourced project / consulting route is really the wave of the future, even more than it has been in the past. It’s only a matter of time before business admits this necessity as well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It makes sense... I wouldn’t figure on every company to own &amp;amp; operate their own power plant.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Why should they typically want their own software engineering group if they don't have to?&lt;br /&gt;&lt;br /&gt;[Edit:  See also Part 2 &lt;a href="http://politechnosis.kataire.com/2008/03/mature-software-industry-corporate.html"&gt;Here&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-6493395846020620041?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/6493395846020620041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=6493395846020620041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6493395846020620041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/6493395846020620041'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/03/corporate-specialization.html' title='Corporate Specialization'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-4793761615421429639</id><published>2008-03-15T14:05:00.003-04:00</published><updated>2008-03-15T14:24:28.246-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ergonomics'/><title type='text'>The Wetware Bus</title><content type='html'>A colleague pointed me to this post about &lt;a href="http://blogs.wsj.com/biztech/2008/03/10/bigger-computer-monitors-more-productivity/"&gt;display size improving productivity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It brings up a favorite topic of mine... With my current laptop (@1024x768), it's a bit of a pet-peeve.&lt;br /&gt;&lt;br /&gt;It totally makes sense that tuning bandwidth to wetware improves productivity. Display real-estate is the front-side bus to &lt;a href="http://en.wikipedia.org/wiki/Wetware"&gt;wetware&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's why I also like the &lt;a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard"&gt;Dvorak &lt;/a&gt;keyboard layout... Personally, I never achieved the level of proficiency with twenty +/- years of QWERTY (with formal training) that I have with the Dvorak layout over the past three years. Dvorak's a hard curve to get past, but I committed to it in the interest of tuning bandwidth (and maybe hoping to reduce RSI).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-4793761615421429639?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/4793761615421429639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=4793761615421429639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4793761615421429639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/4793761615421429639'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/03/wetware-bus.html' title='The Wetware Bus'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2645223572805964973.post-559478182374484226</id><published>2008-02-21T21:24:00.002-05:00</published><updated>2008-03-15T10:41:05.194-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>All Exceptions Are Handled</title><content type='html'>A recent colleague of mine was fond of pointing out that “all software is tested.” This truism is a simplification, of course, but the basic premise is this: the bugs will be exposed. The only question is “by whom?”&lt;br /&gt;&lt;br /&gt;I submit for your consideration another truism, perhaps a corollary to the former: “all exceptions are handled.” Yes, ALL exceptions… and I’m not just talking about a top-level catch-all exception handler.&lt;br /&gt;&lt;br /&gt;That requires further explanation. In order to fully back that up, let's talk about what a typical exception handling mechanism really is.&lt;br /&gt;&lt;br /&gt;According to Bjarne Stroustrup in his classic (“The C++ Programming Language”), “the purpose of the exception-handling mechanism is to provide a means for one part of a program to inform another part of a program that an ‘exceptional circumstance’ has been detected.”&lt;br /&gt;&lt;br /&gt;Unfortunately, Stroustrup’s book was published a decade ago, and the consensus on the subject among software engineers has hardly been less vague since.&lt;br /&gt;&lt;br /&gt;Really, the typical exception-handling mechanism enables a delegator to effectively reconcile an expression of non-compliance in its delegated tasks.&lt;br /&gt;&lt;br /&gt;So exception-handling mechanisms usually have several parts. To begin with we have a task or process. Then, there’s a task supervisor. The supervisor is the method that contains the typical try-block. This try-block generally wraps or makes calls to the task. There’s the exception object, which is really the information that describes an occurrence of non-compliance… the excuse, if you will. An instance of an exception object is not the actual exception itself, but merely the expression of the actual exception. Finally, there’s the handler, which is the reconciliation plan that is hosted by the supervisor.&lt;br /&gt;&lt;br /&gt;In many languages, supervisor code can have zero or more reconciliation plans, each for a particular class of exception. A handler can also throw or re-throw, meaning a succession of supervisors could potentially be informed of an insurrection.&lt;br /&gt;&lt;br /&gt;So it can be said that there are actually zero or more reconciliation plans or handlers… within the program. How do “zero handlers” square with the bit about all exceptions being handled?&lt;br /&gt;&lt;br /&gt;We developers easily forget that software is always a sub-process of another task. Software doesn’t run for its own entertainment. Software is social. It collaborates, and blurs the boundaries between processes. Software processes that are not subordinate to other software processes are subordinate to… (I’ll borrow a term) wetware. When software experiences a circumstance that it cannot reconcile, the software will invariably express non-compliance in some fashion to a supervisor. In many cases, the supervisor is appropriately software. In many other cases, the supervisor is wetware.&lt;br /&gt;&lt;br /&gt;Regardless… whether the program goes up in a fireball of messages, locks hard, blinks ineffectively, or simply disappears unexpectedly; these acts of insubordination are expressed to wetware. Wetware always has the final reconciliation opportunity. A user can take any and all information he or she has on the subject of the exception to handle that non-compliance.&lt;br /&gt;&lt;br /&gt;The user could do a number of things: They could report it to their superior. They could ask someone else to investigate. They could try again. Even if they choose to do nothing, they are making that “informed” decision… and there. That’s what I mean when I say “all exceptions are handled.”&lt;br /&gt;&lt;br /&gt;Now don’t worry. I’m certainly not about to advocate unprotected code.&lt;br /&gt;&lt;br /&gt;Unfortunately, we developers aren’t trusting types. We go out of our way to protect against exceptions everywhere. We write code in every procedure that secretively skips over processing something if there’s a broken dependency. We write exception handlers that quietly log the details or completely swallow exceptions.&lt;br /&gt;&lt;br /&gt;There are occasions when “do nothing” is a reasonable reconciliation. Much of the time, however, we engineers are engaging in illicit cover-up tactics. Handling decisions get co-opted from real process authorities and made at levels where the best interests of the stakeholders are not considered. Often cover-ups add redundant checks that make code harder to understand, maintain, and fix. It actually becomes complexity that exceeds that of proper exception handling.&lt;br /&gt;Where does this get us? You gotta be fair to your stakeholders.&lt;br /&gt;&lt;br /&gt;Keeping all stakeholders in mind is critical to building an exception throwing and handling strategy, so let’s dig in on that a bit. The first stakeholder most everyone thinks of in just about any project, is the project sponsor. The business requirements most often need to support the needs of the project sponsor. The end user comes next, and things like client usability come to mind. Sometimes end users fall into categories. If your program is middleware, you might have back-end and front-end systems to communicate exceptions with. In some cases, you not only have to consider the supervisory needs of the end user, but also, potentially, a set of discrete back-end system administrators, each with unique needs.&lt;br /&gt;&lt;br /&gt;Remember, however, that during project development, you, the developer, are the first wetware supervisor and stakeholder of your program’s activities. You’re human; you’re going introduce errors in the code. How do you want to find out about them?&lt;br /&gt;&lt;br /&gt;Here’s a tip: the further away from the original author that a bug is discovered, the more expensive it is to fix.&lt;br /&gt;&lt;br /&gt;You want mistakes to grab you and force you to fix them now. You do not want them to get past you, falsely pass integration tests, and come across to QA, or end users, as a logic flaw in seemingly unrelated code.&lt;br /&gt;&lt;br /&gt;Again, in the typical cover-up strategy, dependency-checking code becomes clutter and adds complexity. You may find yourself spending almost as much time debugging dependency checks in cases like this, as actually fixing functional code. Part of a well-designed exception strategy is writing clean code that keeps dependency checking to a minimum.&lt;br /&gt;&lt;br /&gt;One way to make that possible is to set up encapsulation boundaries. This is also a good practice for other reasons, including managing security. Top level processes delegate all their activities so they can supervise them. Validate resources and lock them as close to the start of your process as possible, and throw when it fails. Validate data and its schema when and where it enters the process, and throw when it fails. Validate authentication &amp;amp; authorization as soon as you can, and throw when it fails. Once you have your dependencies sanity-checked, clean processing code can begin processing.&lt;br /&gt;&lt;br /&gt;Don’t forget that the UI is an edge. Not only should input be validated, but due to important needs of the user, reconciliation code that respects the user should be set in place.&lt;br /&gt;&lt;br /&gt;Thrown exceptions, of course, need to be of well-known domain exception types that can be easily identified in the problem domain, and well handled. Don’t go throwing framework exceptions. It will be too easy to confuse a framework exception for an application exception. Some frameworks offer an “ApplicationException” designed for the purpose. I might consider inheriting from ApplicationException. Throwing an “ApplicationException” is probably not unique or descriptive enough within the problem domain to make the code understandable.&lt;br /&gt;&lt;br /&gt;By taking an encapsulation boundary approach, lower level tasks cleanly assume their dependencies are valid. If a lower level task fails due to a failed assumption, you’ll know instantly that it’s a bug. You’ll know the bug is either right there on the failure point, or it’s on the edge where the dependency or resource was acquired.&lt;br /&gt;&lt;br /&gt;Another important consideration in an exception-handling strategy: code reusability. It often makes sense to decouple a supervisor from its process. In this way, it becomes possible to apply consistent supervision over many different processes. Another interesting possibility that becomes possible in this manner is the idea of code execution with design-time or even run-time configurable supervision. Each different “supervisor” construct could respond to the informational needs of a different set of stakeholders. Finally, handling can be decoupled from supervision. This provides another way to make stakeholder needs configurable.&lt;br /&gt;&lt;br /&gt;Ok, so I'm getting carried away a bit there... but you get what I'm saying.&lt;br /&gt;&lt;br /&gt;By designing encapsulation boundaries, and by decoupling the various parts of exception handling, you can support effective supervision and reconciliation through each phase of the project life cycle via configuration. In this way, you can honor all the stakeholders during their tenure with the application, and write better software.&lt;br /&gt;&lt;br /&gt;[3/12/08 Edit: I originally liked the term "trust boundaries", because it focused on being able to trust dependencies, and also brought security as a dependency to mind, but "encapsulation boundary" is much more precise. Thanks, Kris!]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2645223572805964973-559478182374484226?l=politechnosis.kataire.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://politechnosis.kataire.com/feeds/559478182374484226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2645223572805964973&amp;postID=559478182374484226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/559478182374484226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2645223572805964973/posts/default/559478182374484226'/><link rel='alternate' type='text/html' href='http://politechnosis.kataire.com/2008/02/all-exceptions-are-handled.html' title='All Exceptions Are Handled'/><author><name>Jim Wilcox</name><uri>http://www.blogger.com/profile/15164457453392782370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp2.blogger.com/_VpFOixCYDag/SB_EHS8smoI/AAAAAAAAAAY/os7Z429Rcmc/S220/IMAGE_047.jpg'/></author><thr:total>0</thr:total></entry></feed>
