<?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-17672034</id><updated>2011-11-28T14:41:42.899+13:00</updated><category term='Innovation'/><category term='Commentary'/><category term='Analytics'/><category term='Development'/><category term='Unusual'/><category term='Powershell'/><category term='SAF'/><category term='Database'/><category term='Travel'/><category term='Sharepoint'/><category term='System Center Operations Manager'/><category term='Data Mining'/><category term='Kayaking'/><category term='Food'/><category term='F#'/><category term='Management'/><category term='architecture'/><category term='Science'/><title type='text'>Bohdan Szymanik</title><subtitle type='html'>Postings on topics that will hopefully be of use to someone...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default?start-index=101&amp;max-results=100'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17672034.post-5770398677621273908</id><published>2011-10-20T08:50:00.000+13:00</published><updated>2011-10-20T08:50:12.967+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><title type='text'>IronPython and Numpy/Scipy</title><content type='html'>&lt;div&gt;Should I ever forget this in the future...&lt;br /&gt;&lt;br /&gt;If you're trying to install numpy/scipy on ironpython and like me you're behind a corporate firewall, and like me you can't get proxying to work, and like me you can't figure ironpkg out, then don't give up. Download the eggs locally and use ironegg eg: ironegg nose-1.0.0-1.zip&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5770398677621273908?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5770398677621273908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5770398677621273908&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5770398677621273908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5770398677621273908'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/10/ironpython-and-numpyscipy.html' title='IronPython and Numpy/Scipy'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8617494237131482594</id><published>2011-05-23T12:22:00.001+12:00</published><updated>2011-05-23T12:22:45.759+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Launching the Black Pearl!</title><content type='html'>&lt;p&gt;It’s not quite finished – I need to give a final rub down and coat of epoxy, and put the deck lines on, but with great weather this weekend I just had to launch it.&lt;/p&gt;  &lt;p&gt;Couple of building notes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I used thick minicell foam for the bulkheads. Expensive stuff in NZ but I got a slab of it while on a work trip to the US. I figure it makes for light bulkheads that will allow the body of the boat to flex.&lt;/li&gt;    &lt;li&gt;The foot pegs are plastic – screwed into tee nuts embedded in a strip on each side. Not sure how adjustable these are going to be – with the small cockpit I can’t seem to reach in to change the settings!&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1346" border="0" alt="IMG_1346" src="http://lh5.ggpht.com/_cWvIIiKNA4g/TdmoyY9S9aI/AAAAAAAAAOU/FtsubPqyP4o/IMG_1346%5B5%5D.jpg?imgmax=800" width="324" height="484" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I used Maroske’s internal tube fittings but the longest of these just wouldn’t let me extract the PVC tube… no problem, just slice em in half! They’re very easy to re-glue.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1345" border="0" alt="IMG_1345" src="http://lh4.ggpht.com/_cWvIIiKNA4g/TdmozcAhkdI/AAAAAAAAAOY/Xq1HpcKtcDw/IMG_1345%5B5%5D.jpg?imgmax=800" width="644" height="431" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I doubled the high density fibreglass over 2/3rds of the length for the hull and deck interiors with an extra overlapping strip just behind the cockpit. Feels very robust while getting into/out of the cockpit.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;What’s was it like to use?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Much lighter build than the Night Heron – on the NH I used 200g cloth doubled over most of the interior. The smaller surface area of the BP plus the lighter building materials (mostly Paulownia strips) means it’s about 14kgs. This makes it much easier to carry and a bit more responsive to my body movement on the water.&lt;/li&gt;    &lt;li&gt;Very tippy! But secondary stability seems good – I just need to get used to the experience. Very different from anything I’ve been in so far and I’ll take my time to practice rolls before I get into rougher water.&lt;/li&gt;    &lt;li&gt;Very responsive to my movements and to the water.&lt;/li&gt;    &lt;li&gt;Lots of fun –which is what I wanted.&lt;/li&gt;    &lt;li&gt;I was slightly concerned about the ocean cockpit but in practice it’s easy for me to get into and out of so no problem there.&lt;/li&gt;    &lt;li&gt;Legs are quite straight. Again was a bit worried I’d be too uncomfortable, but actually for me – it’s fine.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So frankly, I’m utterly delighted!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/Tdmo0KpuxDI/AAAAAAAAAOc/PtUnwePqiDA/s1600-h/IMG_1364%5B6%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1364" border="0" alt="IMG_1364" src="http://lh3.ggpht.com/_cWvIIiKNA4g/Tdmo1Isto-I/AAAAAAAAAOg/uJZyWmCnlMg/IMG_1364_thumb%5B7%5D.jpg?imgmax=800" width="644" height="412" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8617494237131482594?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8617494237131482594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8617494237131482594&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8617494237131482594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8617494237131482594'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/05/launching-black-pearl.html' title='Launching the Black Pearl!'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/TdmoyY9S9aI/AAAAAAAAAOU/FtsubPqyP4o/s72-c/IMG_1346%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-253237469715625157</id><published>2011-04-22T20:15:00.001+12:00</published><updated>2011-10-20T08:51:04.236+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Cockpit coaming step 1: Wood strips</title><content type='html'>&lt;p&gt;I’m building the cockpit coaming by first building a wood strip riser. I'll fibreglass it into place then put foam around the outside and use that as a form to create the coaming lip – at least that’s the plan.&lt;/p&gt;  &lt;p&gt;First step is building the riser. To do this I followed &lt;a href="http://www.guillemot-kayaks.com/guillemot/blog/nick/overview_making_cockpit_coaming"&gt;Nick Schade’s instructional video&lt;/a&gt; and it’s seemed a pretty quick and easy exercise.&lt;/p&gt;  &lt;p&gt;So far, the riser is in place, a fillet is on and when it dries I’ll wet sand and follow up with 2 layers of fibreglass.&lt;/p&gt;  &lt;p&gt;It’s an ocean cockpit so fairly short and only 38cm interior width.&lt;/p&gt;  &lt;p&gt;Current pic (plastic to protect the interior): &lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1327" border="0" alt="IMG_1327" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TbE5K4rubLI/AAAAAAAAAOQ/dU4HOB2B4LY/IMG_1327%5B6%5D.jpg?imgmax=800" width="581" height="484" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-253237469715625157?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/253237469715625157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=253237469715625157&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/253237469715625157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/253237469715625157'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/04/cockpit-coaming-step-1-wood-strips.html' title='Cockpit coaming step 1: Wood strips'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TbE5K4rubLI/AAAAAAAAAOQ/dU4HOB2B4LY/s72-c/IMG_1327%5B6%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4116107800633803323</id><published>2011-04-16T18:24:00.001+12:00</published><updated>2011-10-20T08:51:04.241+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Black Pearl Update–Deck Fibreglassed</title><content type='html'>&lt;p&gt;The deck’s been glued, sanded and fibreglassed – at least on the outside.&lt;/p&gt;  &lt;p&gt;Mostly Paulownia but 3 strips on each side of Cedar as I was running a bit low of the lighter wood. I’ve decided to leave the deck natural colour so that I can forever see how it was built. The cockpit’s been cut out but I’m leaving the hatches till after the fibreglass sets up. It seemed a little flimsy to be cutting too many holes in the deck.&lt;/p&gt;  &lt;p&gt;Not many staple holes, it was easy to glue most strips in place without staples.&lt;/p&gt;  &lt;p&gt;I kept the surface to an even height and used the odd bit of chopped up credit card under a couple of thinner strips.&lt;/p&gt;  &lt;p&gt;Quick pic: of the cockpit:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_1324" border="0" alt="IMG_1324" src="http://lh3.ggpht.com/_cWvIIiKNA4g/Tak2ISYg7bI/AAAAAAAAAOM/-9ErtcWBzIE/IMG_1324%5B4%5D.jpg?imgmax=800" width="244" height="154" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4116107800633803323?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4116107800633803323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4116107800633803323&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4116107800633803323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4116107800633803323'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/04/black-pearl-updatedeck-fibreglassed.html' title='Black Pearl Update–Deck Fibreglassed'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/Tak2ISYg7bI/AAAAAAAAAOM/-9ErtcWBzIE/s72-c/IMG_1324%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4893271616292765580</id><published>2011-03-15T17:51:00.001+13:00</published><updated>2011-03-15T17:51:27.034+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Wood Density</title><content type='html'>&lt;p&gt;My fascination with the weight of the kayak I’m building is growing with my surprise at just how light in weight the hull is. I thought I’d do a quick check on a couple of samples of Paulownia and Cedar.&lt;/p&gt;  &lt;p&gt;For the wood I’ve bought it works out that Cedar is about 0.40g/cm&lt;sup&gt;3&lt;/sup&gt; (about 17 lbs/ft&lt;sup&gt;3&lt;/sup&gt;), and the Paulownia is about 0.27g/cm&lt;sup&gt;3&lt;/sup&gt; (about 25lbs/ft&lt;sup&gt;3&lt;/sup&gt;). So the Paulownia is 2/3rds the density of the Cedar!&lt;/p&gt;  &lt;p&gt;Now that has me thinking – I’m mostly building the deck in Cedar – the extra wood weight plus the coming/deck deckplates etc – hmmm, will it be tippy without me in it? I reckon from looking at it that the deck is about 2/3rds the size of the hull so it might will be balanced at about the same weight top half and bottom half!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4893271616292765580?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4893271616292765580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4893271616292765580&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4893271616292765580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4893271616292765580'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/03/wood-density.html' title='Wood Density'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3963301613080125579</id><published>2011-03-14T14:55:00.001+13:00</published><updated>2011-03-30T21:40:32.400+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Black Pearl Hull Completed</title><content type='html'>&lt;p&gt;Some quick notes on this.&lt;/p&gt;  &lt;p&gt;Firstly, must remember to take care during strip gluing to get the glue all the way through – I didn’t and I found that after fibreglassing the outside and removing the forms… the bottom of the hull started to bend out in a couple of places. Remedy… add epoxy on the inside and glue the strips up properly and weigh down with a few clay bricks (sitting on plastic of course).&lt;/p&gt;  &lt;p&gt;Secondly, I tried to reinforce the interior chines with a triangular strip of wood height about 5mm and base about 10mm. What a waste of time! Quick calculation after the fact shows that using wood came in at about 100 grams, but I’ve just checked the density of thickened epoxy – I’m getting about 10 to 20% lighter than straight epoxy – and if I’d just used a thickened epoxy bead it would’ve weighed about 200g. The extra 100g would have been worth not having to cut triangular strips!&lt;/p&gt;  &lt;p&gt;And finally, I hate fibreglassing the interior – much more difficult than the outside. Fortunately, relatively easy to fix up any ugly bits a day or two later – in my case 3 patches that needed sanding back and redoing along the chines.&lt;/p&gt;  &lt;p&gt;Also, I’ve added up the costs and just out of interest it’s looking like about $NZD1100 total for this one – that’s plans, fibreglass, epoxy, tints/dyes/stains/deck ports and loads of sandpaper. If I’d made some smarter choices along the way I certainly could’ve brought the cost down below $1000.&lt;/p&gt;  &lt;p&gt;I’ll do a more thorough break down at the end.&lt;/p&gt;  &lt;p&gt;And the weight! Before I forget, the hull with one layer of 175g high density fibreglass on the inside, one on the outside and an extra strip on the keel, it totals about 5kgs on my scales. Incredible really! The Paulownia wood is very light and the high density fibreglass certainly takes much less epoxy than the 200g normal fibreglass I used on the last kayak.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3963301613080125579?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3963301613080125579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3963301613080125579&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3963301613080125579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3963301613080125579'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/03/black-pearl-hull-completed.html' title='Black Pearl Hull Completed'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6371182817554896164</id><published>2011-02-21T23:16:00.001+13:00</published><updated>2011-02-21T23:16:39.958+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>Multiple Monitoring Performance Data Collections</title><content type='html'>&lt;p&gt;Ah yes – that code from the last couple of posts has a bug… &lt;/p&gt;  &lt;p&gt;The retrieval of data from SCOM has proven very useful in the last few days but it seems most commonly I’m getting multiple monitoring performance data collections - so the code I wrote in the last couple of posts on how to retrieve that data using F# and Sho needs a little adjusting to concatenate the collections into one sequence – yield! works great in F# eg&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;font size="1"&gt;let perfData (start:DateTime) (finish:DateTime) : seq&amp;lt;DateTime * &lt;span class="kwrd"&gt;float&lt;/span&gt;&amp;gt; = &lt;br /&gt;    seq {&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; mpdsItem &lt;span class="kwrd"&gt;in&lt;/span&gt; mpds &lt;span class="kwrd"&gt;do&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt;! (mpdsItem.GetValues(start, finish)&lt;br /&gt;                    |&amp;gt; Seq.map (fun(mpdv) -&amp;gt; (mpdv.TimeAdded, mpdv.SampleValue))&lt;br /&gt;                    |&amp;gt; Seq.filter ( fun(d,v) -&amp;gt; v.HasValue)&lt;br /&gt;                    |&amp;gt; Seq.map ( fun(d,v) -&amp;gt; (d,box v) )&lt;br /&gt;                    |&amp;gt; Seq.map ( fun(d,v) -&amp;gt; (d, unbox v) )&lt;br /&gt;            )&lt;br /&gt;        }&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Not sure about python but it must be similar.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6371182817554896164?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6371182817554896164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6371182817554896164&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6371182817554896164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6371182817554896164'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/multiple-monitoring-performance-data.html' title='Multiple Monitoring Performance Data Collections'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2360322657253927233</id><published>2011-02-14T18:45:00.001+13:00</published><updated>2011-02-14T18:45:58.520+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>SCOM data into F#</title><content type='html'>&lt;p&gt;Having just &lt;a href="http://bohdanszymanik.blogspot.com/2011/02/scom-and-microsoft-shoa-better.html" target="_blank"&gt;discovered how to get SCOM data from Microsoft Sho&lt;/a&gt; - a dynamic language analysis environment - I thought I’d try from F#. Pretty much the same but you need to think about what to do with the graphing, and you need to handle the Nullable&amp;lt;float&amp;gt; values coming back from SCOM.&lt;/p&gt;  &lt;p&gt;I used &lt;a href="http://code.msdn.microsoft.com/fschart" target="_blank"&gt;fschart&lt;/a&gt; to do the plotting and a sequence filter and boxing/unboxing to handle the Nullable data.&lt;/p&gt;  &lt;p&gt;The histogram function wouldn’t be hard to make but while stumbling across fschart I also stumbled across &lt;a href="http://cs.hubfs.net/forums/permalink/15951/15934/ShowThread.aspx#15934" target="_blank"&gt;this&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So my contribution was do this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;#r &lt;span class="str"&gt;@&amp;quot;System.Windows.Forms.DataVisualization.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;#r &lt;span class="str"&gt;@&amp;quot;C:\extras\FSChart10\FSChart\bin\debug\FSChart.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;open FSChart&lt;br /&gt;&lt;br /&gt;open System.IO&lt;br /&gt;open System.Drawing&lt;br /&gt;open System.Windows.Forms&lt;br /&gt;open System.Windows.Forms.DataVisualization.Charting&lt;br /&gt;&lt;br /&gt;#r &lt;span class="str"&gt;&amp;quot;c:\Program Files\System Center Operations Manager 2007\SDK Binaries\Microsoft.EnterpriseManagement.OperationsManager.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;open Microsoft.EnterpriseManagement.Monitoring&lt;br /&gt;&lt;br /&gt;let mg = Microsoft.EnterpriseManagement.ManagementGroup(&lt;span class="str"&gt;&amp;quot;someManagementServer&amp;quot;&lt;/span&gt;)&lt;br /&gt;let mpdc = MonitoringPerformanceDataCriteria(&lt;span class="str"&gt;&amp;quot;ObjectName = 'ASP.NET' and CounterName like 'Request Execution%' and MonitoringObjectPath like 'someMonitoringObjectPathFilter%'&amp;quot;&lt;/span&gt;)&lt;br /&gt;let mpds = mg.GetMonitoringPerformanceData(mpdc)&lt;br /&gt;&lt;br /&gt;open System&lt;br /&gt;&lt;br /&gt;let (perfData:seq&amp;lt;DateTime * &lt;span class="kwrd"&gt;float&lt;/span&gt;&amp;gt;) = &lt;br /&gt;    mpds.[0].GetValues(DateTime.Today.AddDays(-1.), DateTime.Today)&lt;br /&gt;    |&amp;gt; Seq.map (fun(mpdv) -&amp;gt; (mpdv.TimeAdded, mpdv.SampleValue))&lt;br /&gt;    |&amp;gt; Seq.filter ( fun(d,v) -&amp;gt; v.HasValue)&lt;br /&gt;    |&amp;gt; Seq.map ( fun(d,v) -&amp;gt; (d,box v) )&lt;br /&gt;    |&amp;gt; Seq.map ( fun(d,v) -&amp;gt; (d, unbox v) )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;hist 0.0 200. 50 (perfData |&amp;gt; Seq.map (fun (d,v) -&amp;gt; v) )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;The result looks like this.&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TVjBlbyJBWI/AAAAAAAAAN8/vAUR26JhXFI/image%5B3%5D.png?imgmax=800" width="244" height="240" /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;So the question is… what was the more efficient approach? Well when I did the sho/python code I actually had some c# code open in the background to help me through the classes - without that it would have been really hard. The F# approach made me scratch my head a few times wondering how to deal with charting and nullables but all the way through (much like the c#) I had the advantage of the richer type information to help me figure out what to do. &lt;/font&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2360322657253927233?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2360322657253927233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2360322657253927233&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2360322657253927233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2360322657253927233'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/scom-data-into-f.html' title='SCOM data into F#'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TVjBlbyJBWI/AAAAAAAAAN8/vAUR26JhXFI/s72-c/image%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2609496968800331096</id><published>2011-02-14T09:29:00.001+13:00</published><updated>2011-02-14T18:46:59.284+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>SCOM and Microsoft Sho–A better histogram example…</title><content type='html'>&lt;p&gt;The last blog post had a naff histogram as a few exceptionally long queries squashed the remainder of the data in the first bin, also I wasn’t checking for None so here’s a better, filtered example.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;ShoLoadAssembly(&lt;span class="str"&gt;&amp;quot;c:\Program Files\System Center Operations Manager 2007\SDK Binaries\Microsoft.EnterpriseManagement.OperationsManager.dll&amp;quot;&lt;/span&gt;)&lt;br /&gt;ShoLoadAssembly(&lt;span class="str"&gt;&amp;quot;c:\Program Files\System Center Operations Manager 2007\SDK Binaries\Microsoft.EnterpriseManagement.OperationsManager.dll&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;from Microsoft.EnterpriseManagement.Monitoring import *&lt;br /&gt;from System import *&lt;br /&gt;&lt;br /&gt;mg = Microsoft.EnterpriseManagement.ManagementGroup(&lt;span class="str"&gt;&amp;quot;someManagementServer&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;mpdc = MonitoringPerformanceDataCriteria(&lt;span class="str"&gt;&amp;quot;ObjectName = 'ASP.NET' and CounterName like 'Request Execution%' and MonitoringObjectPath like 'someMonitoringPathFilter%'&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;mpds = mg.GetMonitoringPerformanceData(mpdc)&lt;br /&gt;mpds.Count&lt;br /&gt;&lt;br /&gt;hist([mpdv.SampleValue &lt;span class="kwrd"&gt;for&lt;/span&gt; mpdv &lt;span class="kwrd"&gt;in&lt;/span&gt; mpds[0].GetValues(DateTime.Today.AddDays(-1), DateTime.Today) &lt;span class="kwrd"&gt;if&lt;/span&gt; ((mpdv.SampleValue &amp;lt; 200) and (mpdv.SampleValue &lt;span class="kwrd"&gt;is&lt;/span&gt; not None))])&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_cWvIIiKNA4g/TVg_Mcp8SyI/AAAAAAAAAN4/Ic0dw66dKrY/image%5B3%5D.png?imgmax=800" width="244" height="187" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2609496968800331096?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2609496968800331096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2609496968800331096&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2609496968800331096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2609496968800331096'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/scom-and-microsoft-shoa-better.html' title='SCOM and Microsoft Sho–A better histogram example…'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/TVg_Mcp8SyI/AAAAAAAAAN4/Ic0dw66dKrY/s72-c/image%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4376304541699739370</id><published>2011-02-11T22:59:00.001+13:00</published><updated>2011-02-14T18:46:59.285+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>Retrieving Performance Data from System Center Operations Manager</title><content type='html'>&lt;p&gt;System Center Operations Manager’s agent model means it can collect performance metrics from across a diverse technology environment. You use Rules to define the data collection and typically you use the Console to view the data in graphical format.&lt;/p&gt;  &lt;p&gt;But, the Console by itself doesn’t allow any numerical analysis. If you want to do that you need to get the data out. You can copy to the clipboard within the Console Action menu but that’s very manual. A better approach is obviously programmatic access and this is&amp;#160; where things get interesting.&lt;/p&gt;  &lt;p&gt;For some reason there’s little information on the net on how you get data out of SCOM. What is there usuall refers to querying the SCOM database directly. This doesn’t seem right to me. I’d far prefer an API that stood a chance of staying intact in future versions. So here’s what I’ve done.&lt;/p&gt;  &lt;p&gt;Firstly, use the Powershell integration to SCOM to get the data. (This is easiest if you setup the &lt;a href="http://bohdanszymanik.blogspot.com/2009/11/connecting-to-scom-from-powershell-ise.html" target="_blank"&gt;Powershell ISE to connect to SCOM&lt;/a&gt;.) You can then use the get-performancecounter and get-performancecountervalue cmdlets to retrieve data, for example:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;$starttime = [datetime]::today.adddays(-20)&lt;br /&gt;$endtime = [datetime]::today.adddays(1)&lt;br /&gt;&lt;br /&gt;get-performancecounter |&lt;br /&gt;    ? {$_.ObjectName -eq &lt;span class="str"&gt;'Web Service'&lt;/span&gt; -and&lt;br /&gt;       $_.CounterName -eq &lt;span class="str"&gt;'Connection Attempts/sec'&lt;/span&gt; -and&lt;br /&gt;       $_.InstanceName -eq &lt;span class="str"&gt;'_Total'&lt;/span&gt; -and&lt;br /&gt;       $_.MonitoringObjectPath -like &lt;span class="str"&gt;'usuallyAServerNameFilter*'&lt;/span&gt; } |&lt;br /&gt;    get-performancecountervalue -starttime $starttime -endtime $endtime | &lt;br /&gt;    select SampleValue, TimeSampled | &lt;br /&gt;    export-csv &lt;span class="str"&gt;&amp;quot;c:\temp\ConnectionAttemptsPerSec.csv&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;You can also use the .Net framework and languages to get the data – the documentation isn’t great but this example works (I’ve reduced the font size to try and make it fit in this blog template):&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font size="1"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Gather performance data&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.ObjectModel;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement.Common;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement.Configuration;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.EnterpriseManagement.Monitoring;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MySamples&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            ManagementGroup mg = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManagementGroup(&lt;span class="str"&gt;&amp;quot;someManagementServer&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            MonitoringPerformanceDataCriteria mpdc = &lt;br /&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; MonitoringPerformanceDataCriteria(&lt;/font&gt;&lt;font size="1"&gt;&lt;span class="str"&gt;@&amp;quot;ObjectName = 'ASP.NET' and CounterName like 'Request Execution%' and MonitoringObjectPath like 'usuallyAServerNameFilter%'&amp;quot;&lt;/span&gt;);&lt;br /&gt;            ReadOnlyCollection&amp;lt;MonitoringPerformanceData&amp;gt; mpds = &lt;br /&gt;                mg.GetMonitoringPerformanceData(mpdc);&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (mpds.Count &amp;gt; 0) {&lt;br /&gt;                ReadOnlyCollection&amp;lt;MonitoringPerformanceDataValue&amp;gt; mpdvs = mpds[0].GetValues(DateTime.Today.AddDays(-1), DateTime.Today);&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (MonitoringPerformanceDataValue mpdv &lt;span class="kwrd"&gt;in&lt;/span&gt; mpdvs) {&lt;br /&gt;                    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;TimeSampled = &amp;quot;&lt;/span&gt; + mpdv.TimeSampled + &lt;br /&gt;                        &lt;span class="str"&gt;&amp;quot;,  SampleValue = &amp;quot;&lt;/span&gt; + mpdv.SampleValue);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;Now I typically take the data out to F# and/or Excel and graph/model it to help figure my way through a problem. However, Microsoft have just released a nicely packaged analysis tool in Microsoft Sho – basically IronPython wrapped up with some plotting/graphing/math libraries – much like many of the other Python packages out there.&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;I thought this would be a fun way to interactively deal with performance data collection and analysis so I tried the following as an experiment (put in appropriate management server/monitoring object filters for you – I just used ASP.NET request execution times from a test environment as in the programs above).  The hist command takes a list, or I guess anything it can enumerate over and get numbers from, and returns a histogram dialog and plot.&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;ShoLoadAssembly(&lt;span class="str"&gt;&amp;quot;c:\Program Files\System Center Operations Manager 2007\SDK Binaries\Microsoft.EnterpriseManagement.OperationsManager.dll&amp;quot;&lt;/span&gt;)&lt;br /&gt;ShoLoadAssembly(&lt;span class="str"&gt;&amp;quot;c:\Program Files\System Center Operations Manager 2007\SDK Binaries\Microsoft.EnterpriseManagement.OperationsManager.dll&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;import Microsoft.EnterpriseManagement&lt;br /&gt;import Microsoft.EnterpriseManagement.Configuration&lt;br /&gt;from Microsoft.EnterpriseManagement.Monitoring import *&lt;br /&gt;from System import *&lt;br /&gt;&lt;br /&gt;mg = Microsoft.EnterpriseManagement.ManagementGroup(&lt;span class="str"&gt;&amp;quot;aManagementServer&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;mpdc = MonitoringPerformanceDataCriteria(&lt;span class="str"&gt;&amp;quot;ObjectName = 'ASP.NET' and CounterName like 'Request Execution%' and MonitoringObjectPath like 'someMonitoringObjectFilter%'&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;mpds = mg.GetMonitoringPerformanceData(mpdc)&lt;br /&gt;mpds.Count&lt;br /&gt;&lt;br /&gt;hist([mpdv.SampleValue &lt;span class="kwrd"&gt;for&lt;/span&gt; mpdv &lt;span class="kwrd"&gt;in&lt;/span&gt; mpds[0].GetValues(DateTime.Today.AddDays(-1), DateTime.Today)]&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;And here’s the output:&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/TVUIedaVGLI/AAAAAAAAANs/8FhbciEHoVQ/s1600-h/image2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TVUIe_SenNI/AAAAAAAAANw/hTD5o7Q_NXQ/image_thumb.png?imgmax=800" width="244" height="183" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Georgia"&gt;Cool huh!?&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4376304541699739370?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4376304541699739370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4376304541699739370&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4376304541699739370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4376304541699739370'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/retrieving-performance-data-from-system_11.html' title='Retrieving Performance Data from System Center Operations Manager'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TVUIe_SenNI/AAAAAAAAANw/hTD5o7Q_NXQ/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-38292738977745933</id><published>2011-02-09T22:29:00.001+13:00</published><updated>2011-02-09T22:29:36.651+13:00</updated><title type='text'>Engineering tricks with WolframAlpha</title><content type='html'>&lt;p&gt;I’ve found Google great for simple problems like this:&lt;/p&gt;  &lt;p&gt;20 pounds per cubic foot in kilograms per cubic meter= 320.36926 kilograms per cubic meter&lt;/p&gt;  &lt;p&gt;But wolframalpha also lets you combine unit conversions with calculations:&lt;/p&gt;  &lt;p&gt;(2 * 175 grams) per square meter * (2*3 meters squared) + ((20 pounds per cubic foot in kilograms per cubic meter) * 3 square meters * 5 millimeters)&lt;/p&gt;  &lt;p&gt;Or just click on this link: &lt;a href="http://www.wolframalpha.com/input/?i=(2+*+175+grams)+per+square+meter+*+(2*3+meters+squared)+%2B+((20+pounds+per+cubic+foot+in+kilograms+per+cubic+meter)+*+3+square+meters+*+5+millimeters)"&gt;http://www.wolframalpha.com/input/?i=(2+*+175+grams)+per+square+meter+*+(2*3+meters+squared)+%2B+((20+pounds+per+cubic+foot+in+kilograms+per+cubic+meter)+*+3+square+meters+*+5+millimeters)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;What’s the above tell me? It’s the theoretical weight of the kayak I’m currently building – about 7kg. In reality when hand laying fibreglass you get a much higher weight of epoxy rather than the one to one ratio that’s possible under vacuum application and which I’m using above.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-38292738977745933?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/38292738977745933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=38292738977745933&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/38292738977745933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/38292738977745933'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/engineering-tricks-with-wolframalpha.html' title='Engineering tricks with WolframAlpha'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2797275191543423305</id><published>2011-02-09T22:16:00.001+13:00</published><updated>2011-02-09T22:16:24.448+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Hull fibreglassing</title><content type='html'>&lt;p&gt;It’s taken awhile to get here, but the hull is now fibreglassed.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;After struggling with the Resene colorwood stain affecting epoxy seal coats I found that a wash with isopropyl alcohol made for a nice clean bonding surface.&lt;/li&gt;    &lt;li&gt;I rediscovered how to apply epoxy, everyone seems to have their own method but for me it’s plastic cards (old atm cards/loyalty cards etc are ideal) and short foam (usually yellow) rollers.&lt;/li&gt;    &lt;li&gt;A hot air gun does absolute wonders at getting rid of air bubbles/foam.&lt;/li&gt;    &lt;li&gt;I used high density 170g/sq m fibreglass that’s often used for model making. That equates to 5 ounce high density fibreglass which should be pretty strong (easy way to do the conversion… just use google – type “175 grams per square meter in ounces per square yard” in the search box).&lt;/li&gt;    &lt;li&gt;Wet sanding within 48 hours is more effectively at smoothing the epoxy finish than waiting for it to set really hard.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/TVJbZcL8BDI/AAAAAAAAANc/CSPoB74eejw/s1600-h/second%20hull%20fill%20coat%5B2%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="second hull fill coat" border="0" alt="second hull fill coat" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TVJbZ6Ax8lI/AAAAAAAAANg/X32LVuFPjUY/second%20hull%20fill%20coat_thumb.jpg?imgmax=800" width="93" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2797275191543423305?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2797275191543423305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2797275191543423305&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2797275191543423305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2797275191543423305'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/hull-fibreglassing.html' title='Hull fibreglassing'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TVJbZ6Ax8lI/AAAAAAAAANg/X32LVuFPjUY/s72-c/second%20hull%20fill%20coat_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6023592192562367189</id><published>2011-02-03T08:32:00.001+13:00</published><updated>2011-02-09T22:36:37.373+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Hull ready to be fibreglassed</title><content type='html'>&lt;p&gt;Finally completed staining/fairing/sanding the hull. Long process with lots of waiting for epoxy to dry. Here’s a photo of how the hull looks wetted down. The staining in combination with a kind of matching fairing compound does look patchy but I’ll roll on a very thin layer of epoxy to seal the wood before the fibreglass goes on and that will darken it down and make it look a lot more consistent. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/TUmxZmRtarI/AAAAAAAAANQ/7-UwcC3WnCM/s1600-h/WP_000022%5B4%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WP_000022" border="0" alt="WP_000022" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TUmxagabmZI/AAAAAAAAANU/QCipttLLr6k/WP_000022_thumb%5B5%5D.jpg?imgmax=800" width="244" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6023592192562367189?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6023592192562367189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6023592192562367189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6023592192562367189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6023592192562367189'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/02/hull-ready-to-be-fibreglassed.html' title='Hull ready to be fibreglassed'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TUmxagabmZI/AAAAAAAAANU/QCipttLLr6k/s72-c/WP_000022_thumb%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5129422236763585697</id><published>2011-01-26T22:32:00.001+13:00</published><updated>2011-01-26T22:32:52.762+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Stems added and fairing the hull</title><content type='html'>&lt;p&gt;Slow progress on the Black Pearl (yet to give it my own name yet) kayak. I’ve added stems (just the white paulownia so not so tough but shows up nicely against the stained hull), and I’ve been applying a fairing compound made of epoxy, lightweight filler, wood dust etc.&lt;/p&gt;  &lt;p&gt;Just waiting 7 days now for it to thoroughly set before I sand back.&lt;/p&gt;  &lt;p&gt;Here’s a pic:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/TT_qQJvdm2I/AAAAAAAAANE/hd2XXooeREY/s1600-h/20%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20" border="0" alt="20" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TT_qQotVAUI/AAAAAAAAANI/QYycxeYW-6s/20_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Biggest lesson from all this… get the strips flat before staining! Basically the better the stripping the easier the rest will be.&lt;/p&gt;  &lt;p&gt;Staining has been interesting… painful but interesting. The Resene Colorwood stain does work but you definitely need only a light rag application and maybe a wash with water after it’s set up. For the fairing I’ve managed to replicate the color using epoxy colours (black, blue and red – I watched them making it at Resene so I knew the constituent colours and proportions – it was on a their computer screen &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh6.ggpht.com/_cWvIIiKNA4g/TT_qQ6cfqgI/AAAAAAAAANM/41nG8qWfrkA/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;).&lt;/p&gt;  &lt;p&gt;Hard to get a good photo while it sits in the garage but this boat looks real sleek.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5129422236763585697?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5129422236763585697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5129422236763585697&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5129422236763585697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5129422236763585697'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2011/01/stems-added-and-fairing-hull.html' title='Stems added and fairing the hull'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TT_qQotVAUI/AAAAAAAAANI/QYycxeYW-6s/s72-c/20_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2923729980531316380</id><published>2010-12-27T22:26:00.001+13:00</published><updated>2011-02-09T22:36:37.374+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Hull Stripping and Attempted Staining</title><content type='html'>&lt;p&gt;Stripping was relatively easy and very quick. The wood reminded me of making balsa wood models when I was a kid:)&lt;/p&gt;  &lt;p&gt;Main points were:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure strips are even thickness – if I do this again I’ll invest in a planner thicknesser.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/TRhb3HKnRYI/AAAAAAAAAM0/jjXqpLvslB0/s1600-h/WP_000011%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WP_000011" border="0" alt="WP_000011" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TRhb3iYcAeI/AAAAAAAAAM4/lbPX2RvMJ8E/WP_000011_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I mostly just stapled strips only occasionally using a bead of glue – this had one advantage – towards the end as I looked at the forms and the shape of the hull I realised I had one form on&amp;#160; slightly wrong angle – not sure how this happened as I was sure I had it right at the beginning. Nevermind, I unscrewed it and re-adjusted just a tiny bit and suddenly it looked great. &lt;/li&gt;    &lt;li&gt;I thought I’d stain the strips before using epoxy to glue them all thogether – unfortunately, Resene interior stain turns out to not be as epoxy compatible as the Resene staff thought it would be. It beaded a bit but wasn’t irrecoverable – I might even put more stain on after I rub it all back in preparation for fibreglassing – but if I do I’ll wash with acetone and use a much thinner application of stain. Check the image below…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/TRhb4Cu-AHI/AAAAAAAAAM8/GI6yCz9bDDg/s1600-h/WP_000024%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WP_000024" border="0" alt="WP_000024" src="http://lh5.ggpht.com/_cWvIIiKNA4g/TRhb4VWPFEI/AAAAAAAAANA/wT-fZppyiRI/WP_000024_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hull looks great but I can’t get a good photo showing it the way I see it in real life. Perhaps for the next posting…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2923729980531316380?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2923729980531316380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2923729980531316380&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2923729980531316380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2923729980531316380'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/12/hull-stripping-and-attempted-staining.html' title='Hull Stripping and Attempted Staining'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/TRhb3iYcAeI/AAAAAAAAAM4/lbPX2RvMJ8E/s72-c/WP_000011_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3105979649750878744</id><published>2010-12-08T13:08:00.001+13:00</published><updated>2011-02-09T22:37:17.406+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Spatial Notes–Getting Started</title><content type='html'>&lt;p&gt;Thought this would be harder than it turned out to be.&lt;/p&gt;  &lt;p&gt;Objective: chart some metrics across geographic regions (in my case looking at customer metrics over New Zealand).&lt;/p&gt;  &lt;p&gt;To get started I took advantage of SQL Server Spatial. Initially appearances are a&amp;#160; bit daunting until you try it… and it’s fairly easy.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Finding the GIS data      &lt;ul&gt;       &lt;li&gt;for NZ&amp;#160; Statistics NZ publish digital boundaries – versioned by publication year (2007, 2001, 1996 etc: &lt;a href="http://www.stats.govt.nz/browse_for_stats/people_and_communities/geographic-areas/download-digital-boundaries.aspx"&gt;http://www.stats.govt.nz/browse_for_stats/people_and_communities/geographic-areas/download-digital-boundaries.aspx&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;The data is available in both ESRI Shapefile format and MapInfo format. You can use &lt;a href="http://sharpgis.net/page/Shape2SQL.aspx" target="_blank"&gt;shape2sql&lt;/a&gt; to load this data into sql server spatial. Unfortunately… it has a bug, it won’t create a table from the shp file inside shape2sql – I had to use SQL Profiler to capture the create table instruction and run it interactively – after that the data load works fine - not sure why. &lt;/li&gt;        &lt;li&gt;The data has a hierarchy of increasingly larger geometrical areas made up of units of the smallest size (the meshblock). There’s Area Units, Urban Areas, Regional Councils etc.          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Connecting people to areas      &lt;ul&gt;       &lt;li&gt;Either pay for the GeoPAF file from NZ Post – this gives the meshblock for a delivery address and a NZ Map Grid coordinate. (Not so useful NZ Post… NZMG has been superceeded by NZTM which conforms with WGS84.) &lt;/li&gt;        &lt;li&gt;Or, use the freely obtainable streetlink data from Stats NZ:&amp;#160; &lt;a title="http://www.stats.govt.nz/browse_for_stats/people_and_communities/geographic-areas/streetlink.aspx" href="http://www.stats.govt.nz/browse_for_stats/people_and_communities/geographic-areas/streetlink.aspx"&gt;http://www.stats.govt.nz/browse_for_stats/people_and_communities/geographic-areas/streetlink.aspx&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Aggregating      &lt;ul&gt;       &lt;li&gt;Use SQL Server Analysis Services, or much faster &lt;/li&gt;        &lt;li&gt;Use PowerPivot – for me this allowed me to very quickly aggregate customer metrics from an internal database across areas loaded from the Stats NZ files &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Reporting      &lt;ul&gt;       &lt;li&gt;It’d be nice if Excel had spatial reporting support, but it doesn’t – big thumbs down Microsoft… &lt;/li&gt;        &lt;li&gt;I used SQL Server Reporting Services and the Map control. Problem is that I need to have the map data in SQL/SSAS. It’d be nice to load from PowerPivot but I can’t do that unless I store the Excel PowerPivot doc in Sharepoint 2010. Jumping through hoops to do this though… Microsoft – just get the spatial support into Excel please! &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3105979649750878744?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3105979649750878744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3105979649750878744&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3105979649750878744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3105979649750878744'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/12/spatial-notesgetting-started.html' title='Spatial Notes–Getting Started'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4783233169503655912</id><published>2010-12-05T21:12:00.001+13:00</published><updated>2010-12-06T18:45:30.260+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Strip cutting</title><content type='html'>&lt;p&gt;I followed &lt;a href="http://www.thomassondesign.com/building/building_manual/preparations.aspx"&gt;Bjorn’s instructions&lt;/a&gt; and cut the strips with a circular saw. The planks were pinned to a folding stand at each end. The paulownia was extremely stable. It didn’t split when I pinned it at the edge of the plank. Not one of the strips split or snapped. In the end it was much easier than I expected. Suspect it would’ve been even easier if I had a decent saw…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/TPtJbCa--sI/AAAAAAAAAMQ/2ekm0-lIpEU/s1600-h/Photo0045%5B4%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Photo0045" border="0" alt="Photo0045" src="http://lh5.ggpht.com/_cWvIIiKNA4g/TPtJb1oO72I/AAAAAAAAAMU/DR5RIBrjRtU/Photo0045_thumb%5B6%5D.jpg?imgmax=800" width="118" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4783233169503655912?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4783233169503655912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4783233169503655912&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4783233169503655912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4783233169503655912'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/12/strip-cutting.html' title='Strip cutting'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/TPtJb1oO72I/AAAAAAAAAMU/DR5RIBrjRtU/s72-c/Photo0045_thumb%5B6%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-807598126617255537</id><published>2010-12-05T21:01:00.001+13:00</published><updated>2010-12-06T18:45:30.261+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Ebonizing Paulownia</title><content type='html'>&lt;p&gt;Vinegar and steel wool, left for a few days, filtered and then applied to paulownia strip – thinking of using this on my kayak. Top of the strip has been painted twice.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/TPtGyxXWwOI/AAAAAAAAAMA/rsxprQGD_Sk/s1600-h/Photo0047%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Photo0047" border="0" alt="Photo0047" src="http://lh4.ggpht.com/_cWvIIiKNA4g/TPtGzc8ri8I/AAAAAAAAAME/YE0OPVWKKWc/Photo0047_thumb.jpg?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-807598126617255537?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/807598126617255537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=807598126617255537&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/807598126617255537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/807598126617255537'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/12/ebonizing-paulownia.html' title='Ebonizing Paulownia'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_cWvIIiKNA4g/TPtGzc8ri8I/AAAAAAAAAME/YE0OPVWKKWc/s72-c/Photo0047_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1038311201713576620</id><published>2010-11-28T22:07:00.001+13:00</published><updated>2010-11-29T09:34:36.596+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Black Pearl Forms</title><content type='html'>&lt;p&gt;So terribly slow but here’s a snippet of the forms. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/TPIb5X2nE2I/AAAAAAAAALw/7xYh-Ina4FQ/s1600-h/IMG_1180%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMG_1180" border="0" alt="IMG_1180" src="http://lh5.ggpht.com/_cWvIIiKNA4g/TPIb5-u3HKI/AAAAAAAAAL0/Go0MO4iHBlg/IMG_1180_thumb.jpg?imgmax=800" width="164" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lessons learned:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Level everything first – makes it much easier to align cross sections &lt;/li&gt;    &lt;li&gt;Don’t start screwing cross sections to wooden cross bars until they all line up right. Use clamps first. &lt;/li&gt;    &lt;li&gt;Drill a hole about 5mm on the center of the waterline and shine a bright light from one end – you should be able to see the light all the way down &lt;/li&gt;    &lt;li&gt;I pre-cut the forms for the deck and re-attached them – supposedly to make it easier for later. Not sure it was worth it. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here’s that light shining through a couple of the holes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/TPIb6qYiwvI/AAAAAAAAAL4/fwiUNyOkeZ0/s1600-h/IMG_1182%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMG_1182" border="0" alt="IMG_1182" src="http://lh3.ggpht.com/_cWvIIiKNA4g/TPIb7BnUwbI/AAAAAAAAAL8/cffog7GLsrc/IMG_1182_thumb.jpg?imgmax=800" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1038311201713576620?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1038311201713576620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1038311201713576620&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1038311201713576620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1038311201713576620'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/11/black-pearl-forms.html' title='Black Pearl Forms'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/TPIb5-u3HKI/AAAAAAAAAL0/Go0MO4iHBlg/s72-c/IMG_1180_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-964660653366801148</id><published>2010-10-05T10:05:00.001+13:00</published><updated>2010-10-05T10:05:32.686+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>New Kayak Build: Black Pearl</title><content type='html'>&lt;p&gt;Two years on from building a Guillemot Kayaks &lt;a href="http://bohdanszymanik.blogspot.com/2009/03/s-night-heron-varnishing-and-outfitting.html" target="_blank"&gt;Night Heron stitch and glue&lt;/a&gt; I’ve just purchased plans for a &lt;a href="http://www.thomassondesign.com/choosing/my_kayaks/black_pearl.aspx" target="_blank"&gt;Bjorn Thomasson Black Pearl&lt;/a&gt;. The Night Heron is a great kayak that’s very quick in the water but I just enjoyed the building side too much so I’ve decided to try building a strip kayak. Rather than go with something closer to the Night Heron I decided to go down a slightly different path:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As light as possible – means small or low volume&lt;/li&gt;    &lt;li&gt;Doesn’t need speed – the Night Heron fulfils that requirement for me&lt;/li&gt;    &lt;li&gt;Play boat – I’ve taken up canoe polo so I want the most manuverable sea kayak experience I can get – something that will respond to hip/torso movement.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think the Black Pearl will do this but the proof will be in the pudding. You don’t just order this off the book – the plans are custom printed to your height, arm span and hip measurements.&lt;/p&gt;  &lt;p&gt;I’ll update the blog as I go. It will take awhile – no rush as I have an existing kayak already.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-964660653366801148?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/964660653366801148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=964660653366801148&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/964660653366801148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/964660653366801148'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/10/new-kayak-build-black-pearl.html' title='New Kayak Build: Black Pearl'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-9046122459853384408</id><published>2010-10-04T13:47:00.001+13:00</published><updated>2010-10-04T13:52:24.621+13:00</updated><title type='text'>Populating a Word Document from a Sharepoint List</title><content type='html'>&lt;p&gt;I thought this would be simpler since Sharepoint and Word are so closely related. A mail merge based on list data perhaps? Maybe it’s possible with an office data connection file but I couldn’t figure it out.&lt;/p&gt;  &lt;p&gt;Well, it was useful to me so here’s how I did it with Powershell and Word automation. The example here is a list of standards and the output will be a list of those standards formatted on one Word document. The soap call from powershell comes from somewhere on the net with an added soapaction header. The list has been created with folder items so it needs to list the items recursively – this wouldn’t apply to a normal list. You’ll figure it out as you start looking at the xml attributes. Best way to make progress with these sharepoint soap calls is to use Wireshark in combination with Stramit Caml Viewer.&lt;/p&gt;  &lt;p&gt;Here we go…&lt;/p&gt;  &lt;pre class="csharpcode"&gt;function Execute-SOAPRequest &lt;br /&gt;( &lt;br /&gt;        [Xml]    $SOAPRequest,&lt;br /&gt;        [String] $SOAPAction,&lt;br /&gt;        [String] $URL &lt;br /&gt;) &lt;br /&gt;{ &lt;br /&gt;        write-host &lt;span class="str"&gt;&amp;quot;Sending SOAP Request To Server: $URL&amp;quot;&lt;/span&gt; &lt;br /&gt;        $soapWebRequest = [System.Net.WebRequest]::Create($URL) &lt;br /&gt;        $soapWebRequest.Headers.Add(&lt;span class="str"&gt;&amp;quot;SOAPAction&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;`&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot; + $SOAPAction + &amp;quot;&lt;/span&gt;`&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;) &lt;br /&gt;&lt;br /&gt;        $soapWebRequest.ContentType = &lt;span class="str"&gt;&amp;quot;text/xml;charset=`&amp;quot;&lt;/span&gt;utf-8`&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;br /&gt;        $soapWebRequest.Accept      = &lt;span class="str"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt; &lt;br /&gt;        $soapWebRequest.Method      = &lt;span class="str"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;br /&gt;        write-host &lt;span class="str"&gt;&amp;quot;Authenticating&amp;quot;&lt;/span&gt;&lt;br /&gt;        $soapWebRequest.Credentials = [System.Net.CredentialCache]::DefaultCredentials&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;($soapWebRequest.Proxy -ne $&lt;span class="kwrd"&gt;null&lt;/span&gt;)     {&lt;br /&gt;            $soapWebRequest.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials&lt;br /&gt;        }&lt;br /&gt;    &lt;br /&gt;        write-host &lt;span class="str"&gt;&amp;quot;Initiating Send.&amp;quot;&lt;/span&gt; &lt;br /&gt;        $requestStream = $soapWebRequest.GetRequestStream() &lt;br /&gt;        $SOAPRequest.Save($requestStream) &lt;br /&gt;        $requestStream.Close() &lt;br /&gt;        &lt;br /&gt;        write-host &lt;span class="str"&gt;&amp;quot;Send Complete, Waiting For Response.&amp;quot;&lt;/span&gt; &lt;br /&gt;        $resp = $soapWebRequest.GetResponse() &lt;br /&gt;        $responseStream = $resp.GetResponseStream() &lt;br /&gt;        $soapReader = [System.IO.StreamReader]($responseStream) &lt;br /&gt;        $ReturnXml = [Xml] $soapReader.ReadToEnd() &lt;br /&gt;        $responseStream.Close() &lt;br /&gt;        &lt;br /&gt;        write-host &lt;span class="str"&gt;&amp;quot;Response Received.&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; $ReturnXml &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function Add-Standard&lt;br /&gt;(&lt;br /&gt;        [String] $Standard,&lt;br /&gt;        [String] $Justification,&lt;br /&gt;        $Doc&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;$p = $Doc.Paragraphs.Add()&lt;br /&gt;$p.Range.Text = $Standard&lt;br /&gt;$p.Format.Style = &lt;span class="str"&gt;&amp;quot;Heading 1&amp;quot;&lt;/span&gt;&lt;br /&gt;$p.Range.InsertParagraphAfter()&lt;br /&gt;&lt;br /&gt;$p = $Doc.Paragraphs.Add()&lt;br /&gt;$p.Range.Text = $Justification&lt;br /&gt;$p.Range.InsertParagraphAfter()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$d4 = [xml] &lt;span class="str"&gt;@&amp;quot;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;&lt;/span&gt;1.0&lt;span class="str"&gt;&amp;quot; encoding=&amp;quot;&lt;/span&gt;utf-8&lt;span class="str"&gt;&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;soap:Envelope  xmlns:soap=&amp;quot;&lt;/span&gt;http:&lt;span class="rem"&gt;//schemas.xmlsoap.org/soap/envelope/&amp;quot; &lt;/span&gt;&lt;br /&gt;                xmlns:xsi=&lt;span class="str"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt; &lt;br /&gt;                xmlns:xsd=&lt;span class="str"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;soap:Body&amp;gt;&lt;br /&gt;        &amp;lt;GetListItems xmlns=&lt;span class="str"&gt;&amp;quot;http://schemas.microsoft.com/sharepoint/soap/&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;            &amp;lt;listName&amp;gt;{CF6E48BA-650A-489E-83AB-8EF1E545388A}&amp;lt;/listName&amp;gt;&lt;br /&gt;            &amp;lt;queryOptions&amp;gt;&lt;br /&gt;                &amp;lt;QueryOptions&amp;gt;&lt;br /&gt;                    &amp;lt;ViewAttributes Scope=&lt;span class="str"&gt;&amp;quot;Recursive&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;                    &amp;lt;IncludeMandatoryColumns&amp;gt;False&amp;lt;/IncludeMandatoryColumns&amp;gt;&lt;br /&gt;                &amp;lt;/QueryOptions&amp;gt;&lt;br /&gt;            &amp;lt;/queryOptions&amp;gt;&lt;br /&gt;        &amp;lt;/GetListItems&amp;gt;&lt;br /&gt;    &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;&lt;span class="str"&gt;&amp;quot;@&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# create a document from list data!&lt;br /&gt;$w = new-object -com Word.Application&lt;br /&gt;$w.Visible = $true&lt;br /&gt;$d = $w.Documents.Add()&lt;br /&gt;&lt;br /&gt;Execute-SOAPRequest -SOAPRequest $d4 -SOAPAction &amp;quot;&lt;/span&gt;http:&lt;span class="rem"&gt;//schemas.microsoft.com/sharepoint/soap/GetListItems&amp;quot; -URL &amp;quot;http://&amp;lt;some sharepoint site&amp;gt;/sites/CTO/_vti_bin/lists.asmx&amp;quot; |&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; {$_.Envelope.Body.GetListItemsResponse.GetListItemsResult.listitems.data.row |&lt;br /&gt;         &lt;span class="kwrd"&gt;foreach&lt;/span&gt; {Add-Standard -Standard $_.ows_Standard -Justification $_.ows_Justification  -d $d }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$d.SaveAs([&lt;span class="kwrd"&gt;ref&lt;/span&gt;]&lt;span class="str"&gt;&amp;quot;c:\temp\standards.docx&amp;quot;&lt;/span&gt;)&lt;br /&gt;$d.Close()&lt;br /&gt;$w.Quit()&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-9046122459853384408?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/9046122459853384408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=9046122459853384408&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/9046122459853384408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/9046122459853384408'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/10/populating-word-document-from.html' title='Populating a Word Document from a Sharepoint List'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1418296704328282866</id><published>2010-08-15T11:01:00.001+12:00</published><updated>2010-08-15T11:01:12.756+12:00</updated><title type='text'>FST Auckland Conference Presentation</title><content type='html'>&lt;p&gt;You can find the presentation I did for the Financial Services Technology conference in Auckland last week &lt;a href="http://cid-0e5ff53cd7f11485.office.live.com/view.aspx/Public/FST%20Auckland%20-%20Aug%202010%20-%20Future%20of%20Banking/Creating%20a%20Smarter%20Bank%20-%20FST%20Aug%202010.pptx"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Brief synopsis: systems/operational management provides a useful analogue to the problems faced by implementers of business intelligence environments: huge volumes of data streaming in for which you need to provide health indicators and predictions of the future. &lt;/p&gt;  &lt;p&gt;In the case of Microsoft’s System Center Operations Manager tool this is done in a manner that is very different from conventional BI efforts that rely on staging large quantities of data, building relational and dimensional models and producing KPIs. The solutions developed for operations management can be usefully applied to BI efforts, particularly when not dealing with financial data.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1418296704328282866?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1418296704328282866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1418296704328282866&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1418296704328282866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1418296704328282866'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/08/fst-auckland-conference-presentation.html' title='FST Auckland Conference Presentation'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8086101370446825609</id><published>2010-08-09T21:21:00.001+12:00</published><updated>2010-08-09T21:21:15.614+12:00</updated><title type='text'>CIO Conference–Enterprise 2.0 Presentation</title><content type='html'>&lt;p&gt;I’ve put the presentation here: &lt;a title="http://cid-0e5ff53cd7f11485.office.live.com/browse.aspx/Public/CIO%20Conference%20July%2010" href="http://cid-0e5ff53cd7f11485.office.live.com/browse.aspx/Public/CIO%20Conference%20July%2010"&gt;http://cid-0e5ff53cd7f11485.office.live.com/browse.aspx/Public/CIO%20Conference%20July%2010&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Questions from the audience about my criticism of data focussed BI got me thinking about what might be a better model. I’ve changed the slide deck to cover more of a BI story for presentation at the FST conference in Auckland this Wednesday.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8086101370446825609?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8086101370446825609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8086101370446825609&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8086101370446825609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8086101370446825609'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/08/cio-conferenceenterprise-20.html' title='CIO Conference–Enterprise 2.0 Presentation'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5702914283477358229</id><published>2010-08-09T21:12:00.001+12:00</published><updated>2010-08-09T21:12:07.198+12:00</updated><title type='text'>Seq.unfold</title><content type='html'>&lt;p&gt;Don’t know why this had escaped me for so long!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;PascalsTriangle =&lt;br /&gt;        &lt;span style="color: blue"&gt;let &lt;/span&gt;nextLine aLine =&lt;br /&gt;            &lt;span style="color: blue"&gt;let &lt;/span&gt;partialLine = &lt;br /&gt;                aLine&lt;br /&gt;                |&amp;gt; Seq.pairwise&lt;br /&gt;                |&amp;gt; Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(x,y) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;x+y)&lt;br /&gt;                |&amp;gt; Seq.toList&lt;br /&gt;            List.append (1::partialLine) [1]&lt;br /&gt;        [1] |&amp;gt; Seq.unfold (&lt;span style="color: blue"&gt;fun &lt;/span&gt;s &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;Some(s, nextLine s))&lt;/pre&gt;&lt;br /&gt;Compare to: &lt;a title="Pascal’s Triangle in F#" href="http://bohdanszymanik.blogspot.com/2010/05/pascals-triangle-in-f.html"&gt;Pascal’s Triangle in F#&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5702914283477358229?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5702914283477358229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5702914283477358229&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5702914283477358229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5702914283477358229'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/08/sequnfold.html' title='Seq.unfold'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5524032805956621068</id><published>2010-07-30T10:15:00.001+12:00</published><updated>2010-07-30T10:15:36.130+12:00</updated><title type='text'>Heat/Image Mapping with .Net/F#</title><content type='html'>&lt;p&gt;As part of a demonstration to the Wellington .net user group this week I put together a demo showing a heat mapping of the performance of a transactional system as a function of time of day and arrival rate. My objective was to provide a simple eye balling test of whether performance was being impacted more by daytime customer loading or by competing overnight batch processing. I’ve tried a similar task &lt;a href="http://bohdanszymanik.blogspot.com/2007/10/heat-mapping.html" target="_blank"&gt;before&lt;/a&gt; with Python and &lt;a href="http://matplotlib.sourceforge.net/" target="_blank"&gt;MatPlotLib&lt;/a&gt; but this time I wanted to see how easy it was to accomplish in .Net/F#.&lt;/p&gt;  &lt;p&gt;The answer was ‘very easy’.&lt;/p&gt;  &lt;p&gt;The interactive F# environment in VS2010 gives you JIT compiled code so it’s very fast to work with. The data structures/collections available within F# make importing and manipulating data simple – once it’s in memory you spend most of the time using filter, map and fold operations on elements – explicit recursion or iteration is rarely necessary.&lt;/p&gt;  &lt;p&gt;I found I started with sequences then moved to arrays as data volumes increased and performance slowed. Array.Parallel.map/mapi seemed to make a significant difference whenever the operation being performed was of order a few milliseconds. It’s pointless parallising when the operation performed is short – the overhead of managing threads must just be too great.&lt;/p&gt;  &lt;p&gt;Most of the effort was spent aggregating and binning the data, the actual image prep was trivial. The following assumes you have an array of data to display.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Drawing&lt;br /&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Drawing.Imaging&lt;br /&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Windows.Forms&lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: green"&gt;// adapted some code here from http://thecodedecanter.wordpress.com/2010/04/30/modelling-the-2d-heat-equation-in-f-using-100-lines-of-code/&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;toBitmap (arr:Color[,]) =  &lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;image = &lt;span style="color: blue"&gt;new &lt;/span&gt;Bitmap(arr.GetLength(0),arr.GetLength(1),Imaging.PixelFormat.Format24bppRgb)  &lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;i=0 &lt;span style="color: blue"&gt;to &lt;/span&gt;image.Width-1 &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;do &lt;br /&gt;        for &lt;/span&gt;j=0 &lt;span style="color: blue"&gt;to &lt;/span&gt;image.Height-1 &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;do &lt;br /&gt;            &lt;/span&gt;image.SetPixel(i, j, (arr.[i,j]))  &lt;br /&gt;        &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;done &lt;br /&gt;    done &lt;br /&gt;    &lt;/span&gt;image &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;maxInArray2D (ar:'a[,]) =&lt;br /&gt;    seq{ &lt;span style="color: blue"&gt;for &lt;/span&gt;r &lt;span style="color: blue"&gt;in &lt;/span&gt;0..Array2D.length1 ar-1 &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;do&lt;br /&gt;            yield &lt;/span&gt;Seq.max (ar.[r..r,*] |&amp;gt; Seq.cast&amp;lt;'a&amp;gt;)&lt;br /&gt;    } |&amp;gt; Seq.max&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;intensityMap intensity = Color.FromArgb((int (intensity * 255.0)),0,0) &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;bitmap imageArray =&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;max = imageArray |&amp;gt; maxInArray2D&lt;br /&gt;    imageArray &lt;br /&gt;    |&amp;gt; Array2D.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;f &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;f/max)&lt;br /&gt;    |&amp;gt; Array2D.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;f &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;intensityMap f)&lt;br /&gt;    |&amp;gt; toBitmap&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;ShowForm (f : Form) =&lt;br /&gt;&lt;span style="color: blue"&gt;#if &lt;/span&gt;INTERACTIVE&lt;br /&gt;    f.Show()&lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;#endif&lt;br /&gt;#if &lt;/span&gt;COMPILED&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: gray"&gt;&lt;font size="1"&gt;Application.Run(f)&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;#endif &lt;br /&gt;&lt;br /&gt;let &lt;/span&gt;BitmapForm bitmap = &lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;picBox = &lt;span style="color: blue"&gt;new &lt;/span&gt;PictureBox(BorderStyle = BorderStyle.Fixed3D, Image = bitmap, Size = bitmap.Size, &lt;br /&gt;                                Dock = DockStyle.Fill, SizeMode = PictureBoxSizeMode.StretchImage)&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;form = &lt;span style="color: blue"&gt;new &lt;/span&gt;Form(Text = &lt;span style="color: maroon"&gt;&amp;quot;F# Connection Performance versus Connection Rate and Time&amp;quot;&lt;/span&gt;, Size = bitmap.Size, AutoSize = &lt;span style="color: blue"&gt;true&lt;/span&gt;)&lt;br /&gt;    form.Controls.Add(picBox)&lt;br /&gt;    form&lt;br /&gt;&lt;br /&gt;bitmap surfaceArray |&amp;gt; BitmapForm |&amp;gt; ShowForm&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you don’t have many points that’s going to generate a small image which you can expand by dragging the corner and Windows will magically interpolate for you. I’m sure there’s a way to explicitly do this with the BitmapForm API as well – just didn’t have time to figure that out.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you want to interpolate yourself, you could try something simple like a bilinear approach:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;bilinearInterpolation f00 f01 f10 f11 x y =&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;boundingBox = Array2D.zeroCreate&amp;lt;float&amp;gt; 2 2     &lt;/font&gt;&lt;span style="color: green"&gt;&lt;br /&gt;&lt;font size="1"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="1"&gt;boundingBox.[0,0] &amp;lt;- f00&lt;br /&gt;    boundingBox.[0,1] &amp;lt;- f01&lt;br /&gt;    boundingBox.[1,0] &amp;lt;- f10&lt;br /&gt;    boundingBox.[1,1] &amp;lt;- f11&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;A = RowVector.ofList [1.-x; x]&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;B = Matrix.ofArray2D boundingBox&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;C = Vector.ofList [1.-y; y]&lt;br /&gt;    A * B * C&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Or why not just double the resolution?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;font size="1"&gt;// take an array m x n and return (2m-1) x (2n-1)&lt;br /&gt;let interpolate (A:float[,]) =&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; let B = Array2D.zeroCreate&amp;lt;float&amp;gt; (2*(A.GetLength 0) - 1) (2*(A.GetLength 1) - 1)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for row in 0..((A.GetLength 0) - 1) do&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for col in 0..((A.GetLength 1) - 1) do&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B.[2*row, 2*col] &amp;lt;- A.[row,col]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; done&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; done&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for row in 0..((B.GetLength 0) - 1) do&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if row % 2 = 0 then&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for col in 0..((B.GetLength 1) - 1) do&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if col % 2 = 1 then&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B.[row, col] &amp;lt;- (B.[row,col-1] + B.[row,col+1]) / 2.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; done&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for col in 0..((B.GetLength 1) - 1) do&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if col % 2 = 0 then&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B.[row, col] &amp;lt;- (B.[row-1,col] + B.[row+1,col]) / 2.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B.[row, col] &amp;lt;- (B.[row-1,col-1] + B.[row+1,col-1] + B.[row-1,col+1] + B.[row+1,col+1]) / 4.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; done&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; done&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; B&lt;br /&gt; &lt;br /&gt;// now I can do this...&lt;br /&gt;bitmap (surfaceArray |&amp;gt; interpolate |&amp;gt; interpolate |&amp;gt; interpolate |&amp;gt; interpolate)|&amp;gt; BitmapForm |&amp;gt; ShowForm&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And generate results like this (where connection rate increases down, time goes across, and redness indicates duration of calls):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/TFH9gT8SniI/AAAAAAAAALE/gGkiP-LRh6E/s1600-h/performancemap%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="performancemap" border="0" alt="performancemap" src="http://lh6.ggpht.com/_cWvIIiKNA4g/TFH9hsFyHRI/AAAAAAAAALI/pD_YIEJOojA/performancemap_thumb%5B1%5D.png?imgmax=800" width="644" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5524032805956621068?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5524032805956621068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5524032805956621068&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5524032805956621068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5524032805956621068'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/07/heatimage-mapping-with-netf.html' title='Heat/Image Mapping with .Net/F#'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/TFH9hsFyHRI/AAAAAAAAALI/pD_YIEJOojA/s72-c/performancemap_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5432644518871638012</id><published>2010-07-26T16:33:00.001+12:00</published><updated>2010-07-26T16:33:47.256+12:00</updated><title type='text'>F# for Analysis: Wellington .Net User Group Meeting Wed 28th July</title><content type='html'>&lt;p&gt;Some brief notes for anyone attending this session.&lt;/p&gt;  &lt;p&gt;There’s a brief slide deck &lt;a href="http://cid-0e5ff53cd7f11485.office.live.com/view.aspx/Public/Wellington%20.Net%20User%20Group%20July%202010/f^3%20.net%20user%20group%20presentation%20july%202010.pptx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;There’s sample code working through the basics of the language &lt;a href="http://cid-0e5ff53cd7f11485.office.live.com/self.aspx/Public/Wellington%20.Net%20User%20Group%20July%202010/wgtn%20.net%20ug%20demo.fsx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Sample code for the cross correlation of two time series in F# &lt;a href="http://cid-0e5ff53cd7f11485.office.live.com/self.aspx/Public/Wellington%20.Net%20User%20Group%20July%202010/CrossCorrelation.fsx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I’ll put a separate post together for image generation of a heat map showing web performance data.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5432644518871638012?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5432644518871638012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5432644518871638012&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5432644518871638012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5432644518871638012'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/07/f-for-analysis-wellington-net-user.html' title='F# for Analysis: Wellington .Net User Group Meeting Wed 28th July'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8638295996211640990</id><published>2010-07-26T12:17:00.001+12:00</published><updated>2010-07-26T12:17:56.258+12:00</updated><title type='text'>System Center Operations Manager and BI</title><content type='html'>&lt;p&gt;Last week as part of a presentation to the &lt;a href="http://cio.co.nz/cio/CIOSummit/index.html" target="_blank"&gt;CIO summit&lt;/a&gt; in Auckland I had a bit of fun criticising conventional corporate BI efforts as being too focussed on data management. Basically, the argument went that companies spend too much of the budget worrying about getting the data right and not about enabling people to use it – and that ‘easy to use’ BI front ends are a pointless exercise. It’s not a hard argument to make – you can expend a great deal of time and effort on staging, transforming, cubing, KPI development, and reconciliation quality checks – usually driven by the fact that corporate BI is focussed on financial measures which drives people to want the data correct to the cent.&lt;/p&gt;  &lt;p&gt;The natural question that comes back in response is what should be done instead?&lt;/p&gt;  &lt;p&gt;Operations management using a model driven tool like System Center Operations Manager provides some useful pointers.&lt;/p&gt;  &lt;p&gt;Think about it – what’s operations management?&lt;/p&gt;  &lt;p&gt;= Data + Model + Health logic + Alerting for response&lt;/p&gt;  &lt;p&gt;What’s BI?&lt;/p&gt;  &lt;p&gt;= Data + Model + Business Health Logic + “Strategy execution” for response&lt;/p&gt;  &lt;p&gt;What’s smart about model driven operations management?&lt;/p&gt;  &lt;p&gt;The tools (like &lt;a href="http://www.microsoft.com/systemcenter/en/us/operations-manager.aspx" target="_blank"&gt;SCOM&lt;/a&gt;) monitor systems that can produce huge volumes of data; they give that data context with hierarchical models (à la cubes) that can even be graphical (&lt;a href="http://www.savision.com/" target="_blank"&gt;LiveMaps&lt;/a&gt;/&lt;a href="http://visiotoolbox.com/downloads/addins/Visio_2010_Add-in_for_System_Center_Operations_Manager_2007_R2_961.aspx" target="_blank"&gt;Visio 2010 diagrams&lt;/a&gt;); they provide health indicators (cf KPIs) and they empower end users by making the information available for more detailed analysis at the desktop.&lt;/p&gt;  &lt;p&gt;So how would you put this kind of model into action for BI?&lt;/p&gt;  &lt;p&gt;How about mirrored true to source data sources using cheap databases (maybe SQL Express/MySQL). You’d need a grooming schedule to stay on top of the data volumes – perhaps and agent model just like the operations management tools have.&lt;/p&gt;  &lt;p&gt;To collect the data from multiple sources, and give some context a cube model is attractive, but what about implementing with &lt;a href="http://www.powerpivot.com/" target="_blank"&gt;PowerPivot&lt;/a&gt;. It puts the end user in charge. They can create health indications in an Excel like environment; and they can submit back into a shared (Sharepoint) repository.&lt;/p&gt;  &lt;p&gt;I’ve got to present at the longwinded &lt;a href="http://www.fst.net.au/Agenda.aspx?con=24" target="_blank"&gt;FST 3rd Annual Technology &amp;amp; Innovation – the Future of Banking &amp;amp; Financial Services New Zealand conference&lt;/a&gt; in August. I’ll be exploring this in more detail and hopefully have a few examples to test out.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8638295996211640990?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8638295996211640990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8638295996211640990&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8638295996211640990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8638295996211640990'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/07/system-center-operations-manager-and-bi.html' title='System Center Operations Manager and BI'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7430592536048097003</id><published>2010-07-18T13:39:00.001+12:00</published><updated>2010-07-18T13:52:23.409+12:00</updated><title type='text'>Dynamically changing format statements in the F# ISE</title><content type='html'>&lt;p&gt;This had me stuck yesterday – how to change the width of&amp;#160; some formatted printf output. In the end with a bit of searching I realised the TextWriterFormat member gives you a way to define the format such that you can change it in your program. An example is a better viewer for the &lt;a href="http://bohdanszymanik.blogspot.com/2010/05/pascals-triangle-in-f.html"&gt;Pascals Triangle sequence generator&lt;/a&gt; I made recently – all related to a school math project. Also – where does it tell you that to print a % you need to double it? Why didn’t they do as with speech marks and use a leading \?&lt;/p&gt;  &lt;pre class="code"&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;let rec &lt;/span&gt;PascalsTriangle = seq {&lt;br /&gt;    &lt;span style="color: blue"&gt;yield &lt;/span&gt;[1];&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;aLine &lt;span style="color: blue"&gt;in &lt;/span&gt;PascalsTriangle &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;-&amp;gt;&lt;br /&gt;        let &lt;/span&gt;newLine =&lt;br /&gt;            aLine&lt;br /&gt;            |&amp;gt; Seq.pairwise&lt;br /&gt;            |&amp;gt; Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(x,y) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;x+y)&lt;br /&gt;            |&amp;gt; Seq.toList&lt;br /&gt;        List.append (1::newLine) [1]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;PascalsTriangle |&amp;gt; Seq.take 10&lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: green"&gt;//|&amp;gt; Seq.iter (fun i -&amp;gt; printfn &amp;quot;%A&amp;quot; i)&lt;br /&gt;&lt;/span&gt;|&amp;gt; Seq.iter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;v &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;-&amp;gt; &lt;br /&gt;                        &lt;/span&gt;v |&amp;gt; Seq.iter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;w &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;printf &lt;span style="color: maroon"&gt;&amp;quot;%3i&amp;quot; &lt;/span&gt;w)&lt;br /&gt;                        printfn &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;br /&gt;            &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: green"&gt;// smarten up the printing...&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;samplePT = PascalsTriangle |&amp;gt; Seq.take 12&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;maxDigits = (Seq.concat samplePT |&amp;gt; Seq.max).ToString().Length&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;numberFormatter digits = Printf.TextWriterFormat&amp;lt;int&lt;span style="color: blue"&gt;-&amp;gt;&lt;/span&gt;unit&amp;gt;(sprintf &lt;span style="color: maroon"&gt;&amp;quot;%%%dd&amp;quot; &lt;/span&gt;digits)&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;spaceFormatter digits = Printf.TextWriterFormat&amp;lt;string&lt;span style="color: blue"&gt;-&amp;gt;&lt;/span&gt;unit&amp;gt;(sprintf &lt;span style="color: maroon"&gt;&amp;quot;%%%ds&amp;quot; &lt;/span&gt;digits)&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;rows = Seq.length samplePT&lt;br /&gt;samplePT |&amp;gt; Seq.iteri   ( &lt;span style="color: blue"&gt;fun &lt;/span&gt;u v &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;-&amp;gt;&lt;br /&gt;                                    for &lt;/span&gt;i &lt;span style="color: blue"&gt;in &lt;/span&gt;1..((rows / 1) - u) &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: blue"&gt;do&lt;br /&gt;                                        &lt;/span&gt;printf (spaceFormatter ((int)((maxDigits+1)/2))) &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: maroon"&gt;&amp;quot; &amp;quot;&lt;br /&gt;                                    &lt;/span&gt;v |&amp;gt; Seq.iter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;w &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;printf (numberFormatter (maxDigits+1)) w)&lt;br /&gt;                                    printfn &lt;/font&gt;&lt;font size="1"&gt;&lt;span style="color: maroon"&gt;&amp;quot;&amp;quot;&lt;br /&gt;                        &lt;/span&gt;)&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;The output is like this:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 2&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 3&amp;#160;&amp;#160; 3&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 4&amp;#160;&amp;#160; 6&amp;#160;&amp;#160; 4&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 5&amp;#160; 10&amp;#160; 10&amp;#160;&amp;#160; 5&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 6&amp;#160; 15&amp;#160; 20&amp;#160; 15&amp;#160;&amp;#160; 6&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 7&amp;#160; 21&amp;#160; 35&amp;#160; 35&amp;#160; 21&amp;#160;&amp;#160; 7&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 8&amp;#160; 28&amp;#160; 56&amp;#160; 70&amp;#160; 56&amp;#160; 28&amp;#160;&amp;#160; 8&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160; 9&amp;#160; 36&amp;#160; 84 126 126&amp;#160; 84&amp;#160; 36&amp;#160;&amp;#160; 9&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;#160; 1&amp;#160; 10&amp;#160; 45 120 210 252 210 120&amp;#160; 45&amp;#160; 10&amp;#160;&amp;#160; 1&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;1&amp;#160; 11&amp;#160; 55 165 330 462 462 330 165&amp;#160; 55&amp;#160; 11&amp;#160;&amp;#160; 1&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Wish I knew how to do this in WPF…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Wish I knew a better way to post into the blog…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7430592536048097003?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7430592536048097003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7430592536048097003&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7430592536048097003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7430592536048097003'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/07/dynamically-changing-format-statements.html' title='Dynamically changing format statements in the F# ISE'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1079901215104279767</id><published>2010-06-04T13:55:00.001+12:00</published><updated>2010-06-04T14:01:23.657+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>IP Address to Country Map</title><content type='html'>&lt;p&gt;I’m learning how to use the F# HashMultiMap and I thought up a sample exercise – do a lookup in memory of IP address to a country code. This is a task I’ve seen embedded in a relational table before but that seemed daft – it’s on disk so it will be slow. It seems smarter to do this all in memory and just serve out a result.&lt;/p&gt; &lt;p&gt;It’s relatively easy to get hold of IP address country/region/ISP lookups in the form of a single file, for example &lt;a title="http://software77.net/geo-ip/" href="http://software77.net/geo-ip/"&gt;http://software77.net/geo-ip/&lt;/a&gt; provide one for country lookups under a GNU license. &lt;/p&gt; &lt;p&gt;First I load up the text file:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System&lt;br /&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.IO&lt;br /&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Text.RegularExpressions&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;(|ActiveRegex|_|) regex str =&lt;br /&gt;   &lt;span style="color: blue"&gt;let &lt;/span&gt;ms = Regex(regex).Matches(str)&lt;br /&gt;   &lt;span style="color: blue"&gt;if &lt;/span&gt;ms.Count &amp;gt; 0&lt;br /&gt;   &lt;span style="color: blue"&gt;then &lt;/span&gt;Some ((Seq.cast ms : Match seq))&lt;br /&gt;   &lt;span style="color: blue"&gt;else &lt;/span&gt;None&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;matches s re =&lt;br /&gt;    &lt;span style="color: blue"&gt;match &lt;/span&gt;s &lt;span style="color: blue"&gt;with&lt;br /&gt;    &lt;/span&gt;| ActiveRegex re results &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;results&lt;br /&gt;    | _ &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;Seq.empty&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;capturesSeq s p =&lt;br /&gt;    seq{&lt;br /&gt;        &lt;span style="color: blue"&gt;for &lt;/span&gt;m &lt;span style="color: blue"&gt;in &lt;/span&gt;matches s p &lt;span style="color: blue"&gt;-&amp;gt;&lt;br /&gt;            &lt;/span&gt;Seq.skip 1 (seq{&lt;span style="color: blue"&gt;for &lt;/span&gt;g &lt;span style="color: blue"&gt;in &lt;/span&gt;m.Groups &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;g.Value})&lt;br /&gt;        }&lt;br /&gt;    |&amp;gt; Seq.concat&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;csvRegex = &lt;span style="color: maroon"&gt;"\"([\w\s:;'`~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)(?:\",|\"$)"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;isInt64 i =&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;v,_ = Int64.TryParse(i)&lt;br /&gt;    v&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;parseIpToCountryLine lineNo (line:String) =&lt;br /&gt;    &lt;span style="color: blue"&gt;try&lt;br /&gt;        let &lt;/span&gt;values = &lt;br /&gt;            capturesSeq line csvRegex&lt;br /&gt;            |&amp;gt; Seq.toArray&lt;br /&gt;&lt;br /&gt;        isInt64 values.[0] |&amp;gt; &lt;span style="color: blue"&gt;fun &lt;/span&gt;test &lt;span style="color: blue"&gt;-&amp;gt; if &lt;/span&gt;not test &lt;span style="color: blue"&gt;then &lt;/span&gt;failwith (sprintf &lt;span style="color: maroon"&gt;"Bad IP FROM on line %i" &lt;/span&gt;lineNo)&lt;br /&gt;        isInt64 values.[1] |&amp;gt; &lt;span style="color: blue"&gt;fun &lt;/span&gt;test &lt;span style="color: blue"&gt;-&amp;gt; if &lt;/span&gt;not test &lt;span style="color: blue"&gt;then &lt;/span&gt;failwith (sprintf &lt;span style="color: maroon"&gt;"Bad IP TO on line %i" &lt;/span&gt;lineNo)&lt;br /&gt;        int64 values.[0], int64 values.[1], string values.[6]&lt;br /&gt;    &lt;span style="color: blue"&gt;with&lt;br /&gt;        &lt;/span&gt;| :? System.IndexOutOfRangeException &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;failwithf &lt;span style="color: maroon"&gt;"Failed on line %A, contents: %A" &lt;/span&gt;lineNo line&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;IpToCountryLines = File.ReadAllLines(&lt;span style="color: maroon"&gt;@"c:\temp\IpToCountry.csv"&lt;/span&gt;, Text.Encoding.Default) &lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;(*&lt;br /&gt;File format like this... detail in the header comments of the file&lt;br /&gt;# IP FROM      IP TO        REGISTRY  ASSIGNED   CTRY CNTRY COUNTRY&lt;br /&gt;# "1346797568","1346801663","ripencc","20010601","il","isr","Israel"&lt;br /&gt;&lt;br /&gt;there is a tricky line in there, it contains an 'Å' character which seems to require that I explicitly define the text encoding. Don't see why since it's just default...&lt;br /&gt;*)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;getIpToCountry (lines:string []) =&lt;br /&gt;    lines &lt;br /&gt;    |&amp;gt; Seq.filter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;i &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;not(i.StartsWith(&lt;span style="color: maroon"&gt;"#"&lt;/span&gt;)))&lt;br /&gt;    |&amp;gt; Seq.mapi parseIpToCountryLine &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;Ip2Country = getIpToCountry IpToCountryLines&lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Then a function to create a numeric form of an IP address:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;numIP (a:int) (b:int) (c:int) (d:int) = (int64 d) + ((int64 c)*256L) + ((int64 b)*256L*256L) + ((int64 a)*256L*256L*256L)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then the hash and a quick test:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;#r &lt;/span&gt;&lt;span style="color: maroon"&gt;"FSharp.PowerPack.dll"&lt;/span&gt;&lt;span style="color: green"&gt;&lt;br /&gt;// count down until a key is found - could be speed up by creating extra entries when to-from is a large gap&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;Ip2Country3 = HashMultiMap&amp;lt;_,_&amp;gt;(&lt;br /&gt;                                    Ip2Country&lt;br /&gt;                                    |&amp;gt; Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(ipFrom,ipTo,country) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;ipFrom, country )&lt;br /&gt;                                , HashIdentity.Structural)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let rec &lt;/span&gt;countryFromIP (ip:int64) =&lt;br /&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;Ip2Country3.ContainsKey(ip) &lt;span style="color: blue"&gt;then &lt;br /&gt;        &lt;/span&gt;Ip2Country3.[ip]&lt;br /&gt;    &lt;span style="color: blue"&gt;else&lt;br /&gt;        &lt;/span&gt;countryFromIP (ip-1L)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// test with 10 addresses taken from our public site web logs&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;testIPs = [… in the interests of confidentiality stick some of your own in here… as (a,b,c,d) tuples…]&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;time f x =&lt;br /&gt;    &lt;span style="color: blue"&gt;let &lt;/span&gt;timer = System.Diagnostics.Stopwatch.StartNew()&lt;br /&gt;    &lt;span style="color: blue"&gt;try &lt;/span&gt;f x &lt;span style="color: blue"&gt;finally&lt;br /&gt;    &lt;/span&gt;printf &lt;span style="color: maroon"&gt;"Execution duration: %gms\n" &lt;/span&gt;timer.Elapsed.TotalMilliseconds;;&lt;br /&gt;&lt;br /&gt;testIPs |&amp;gt; List.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(a,b,c,d) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;numIP a b c d) |&amp;gt; time List.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;nIP &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;countryFromIP nIP)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;I’ve found it takes about 1 millisecond for 10 random lookups on my virtual workstation instance (running under Hyper-V with 3GB allocated on a desktop Dell Optiplex 760).&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1079901215104279767?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1079901215104279767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1079901215104279767&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1079901215104279767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1079901215104279767'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/06/ip-address-to-country-map.html' title='IP Address to Country Map'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-954820965423119661</id><published>2010-05-26T14:23:00.003+12:00</published><updated>2010-05-26T14:23:31.154+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>My Regex Lessons (Probably 1 of many…)</title><content type='html'>&lt;p&gt;OK, that &lt;a href="http://bohdanszymanik.blogspot.com/2010/05/parsing-csv-escaped-with-speech-marks.html"&gt;previous post&lt;/a&gt; had a couple of minor problems.&lt;/p&gt;  &lt;p&gt;First that regular expression – terribly unwieldy. I haven’t managed to shorten it fully yet, but this is marginally better: &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: maroon"&gt;&amp;quot;([\w\s:;… add whatever characters are valid here…&lt;/span&gt;&lt;span style="color: maroon"&gt;]*)(?:\&amp;quot;,|\&amp;quot;$)&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Secondly, I wasn’t fully thinking through the matches/groups/captures hierarchy. I kept getting empty captures being reported back without understanding why I was getting them. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Updated code here:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System&lt;br /&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Text.RegularExpressions&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;(|ActiveRegex|_|) regex str =&lt;br /&gt;   &lt;span style="color: blue"&gt;let &lt;/span&gt;ms = Regex(regex).Matches(str)&lt;br /&gt;   &lt;span style="color: blue"&gt;if &lt;/span&gt;ms.Count &amp;gt; 0&lt;br /&gt;   &lt;span style="color: blue"&gt;then &lt;/span&gt;Some ((Seq.cast ms : Match seq))&lt;br /&gt;   &lt;span style="color: blue"&gt;else &lt;/span&gt;None&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;matches s re =&lt;br /&gt;    &lt;span style="color: blue"&gt;match &lt;/span&gt;s &lt;span style="color: blue"&gt;with&lt;br /&gt;    &lt;/span&gt;| ActiveRegex re results &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;results&lt;br /&gt;    | _ &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;Seq.empty&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;capturesSeq s p =&lt;br /&gt;    seq{&lt;br /&gt;        &lt;span style="color: blue"&gt;for &lt;/span&gt;m &lt;span style="color: blue"&gt;in &lt;/span&gt;matches s p &lt;span style="color: blue"&gt;-&amp;gt;&lt;br /&gt;            &lt;/span&gt;Seq.skip 1 (seq{&lt;span style="color: blue"&gt;for &lt;/span&gt;g &lt;span style="color: blue"&gt;in &lt;/span&gt;m.Groups &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;g.Value})&lt;br /&gt;        }&lt;br /&gt;    |&amp;gt; Seq.concat&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;csvRegex = &lt;span style="color: maroon"&gt;&amp;quot;\&amp;quot;([\w\s:;~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)(?:\&amp;quot;,|\&amp;quot;$)&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;testLine = &lt;span style="color: maroon"&gt;&amp;quot;\&amp;quot;31\&amp;quot;,\&amp;quot;a 1\&amp;quot;,\&amp;quot;b-2\&amp;quot;,\&amp;quot;c+3\&amp;quot;,\&amp;quot;,.;~!@#$%^&amp;amp;*()\/?&amp;gt;&amp;lt;,.|{}[]_+-\&amp;quot;,\&amp;quot;\&amp;quot;,\&amp;quot;14/05/2010 12:12:20 a.m.\&amp;quot;,\&amp;quot;1: 2; 3. 4? 5[ 6] 7&amp;amp; 8*\&amp;quot;,\&amp;quot;a,b\&amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;capturesSeq testLine csvRegex&lt;br /&gt;|&amp;gt; Seq.iter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;x &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;printfn &lt;span style="color: maroon"&gt;&amp;quot;%A&amp;quot; &lt;/span&gt;x)&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-954820965423119661?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/954820965423119661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=954820965423119661&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/954820965423119661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/954820965423119661'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/my-regex-lessons-probably-1-of-many.html' title='My Regex Lessons (Probably 1 of many…)'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2046485137478126759</id><published>2010-05-25T11:51:00.001+12:00</published><updated>2010-05-25T13:36:57.137+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>Parsing CSV Escaped with Speech Marks</title><content type='html'>&lt;p&gt;I just know this isn’t the right way to do this but what the heck it seems to work for me.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The simple match is "([\w,]*)",+|"([\w,]*)"$ but I needed to account for all the other commonly occurring characters such as %&amp;amp;* etc. ( I would’ve thought I could just use .* but I can’t seem to get it to work.)&lt;/p&gt; &lt;p&gt;I’m using the F# Active Pattern approach to divvy up the matches – and returning the Match objects into the seq rather than breaking out the capture in the active pattern. This was more useful to me when I was using the matches later on in the code.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;open &lt;/span&gt;System.Text.RegularExpressions&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;(|ActiveRegex|_|) regex str =&lt;br /&gt;   &lt;span style="color: blue"&gt;let &lt;/span&gt;ms = Regex(regex).Matches(str)&lt;br /&gt;   &lt;span style="color: blue"&gt;if &lt;/span&gt;ms.Count &amp;gt; 0&lt;br /&gt;   &lt;span style="color: blue"&gt;then &lt;/span&gt;Some ([ &lt;span style="color: blue"&gt;for &lt;/span&gt;m &lt;span style="color: blue"&gt;in &lt;/span&gt;ms &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;m ])&lt;br /&gt;   &lt;span style="color: blue"&gt;else &lt;/span&gt;None&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;matches s re =&lt;br /&gt;    &lt;span style="color: blue"&gt;match &lt;/span&gt;s &lt;span style="color: blue"&gt;with&lt;br /&gt;    &lt;/span&gt;| ActiveRegex re results &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;results&lt;br /&gt;    | _ &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;[]&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;testLine = &lt;span style="color: maroon"&gt;"\"31\",\"a 1\",\"b-2\",\"c+3\",\",.;~!@#$%^&amp;amp;*()\/?&amp;gt;&amp;lt;,.|{}[]_+-\",\"\",\"14/05/2010 12:12:20 a.m.\",\"1: 2; 3. 4? 5[ 6] 7&amp;amp; 8*\",\"a,b\""&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;matches testLine &lt;span style="color: maroon"&gt;"\"([\w\s:;~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)\",+|\"([\w\s:;~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)\"$"&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;printMatches s p =&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;m &lt;span style="color: blue"&gt;in &lt;/span&gt;matches s p &lt;span style="color: blue"&gt;do&lt;br /&gt;        &lt;/span&gt;seq{&lt;span style="color: blue"&gt;for &lt;/span&gt;g &lt;span style="color: blue"&gt;in &lt;/span&gt;m.Groups &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;g} &lt;br /&gt;        |&amp;gt; Seq.skip 1 &lt;br /&gt;        |&amp;gt; Seq.iter (&lt;span style="color: blue"&gt;fun &lt;/span&gt;x &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;printfn &lt;span style="color: maroon"&gt;"%A" &lt;/span&gt;x)&lt;br /&gt;&lt;br /&gt;printMatches testLine &lt;span style="color: maroon"&gt;"\"([\w\s:;~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)\",+|\"([\w\s:;~!@#$%\^&amp;amp;\*_&amp;lt;&amp;gt;,\.\\\/\|\[\]\{\}\(\)\-\+\?]*)\"$"&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2046485137478126759?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2046485137478126759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2046485137478126759&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2046485137478126759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2046485137478126759'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/parsing-csv-escaped-with-speech-marks.html' title='Parsing CSV Escaped with Speech Marks'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2074895492785960257</id><published>2010-05-20T14:39:00.001+12:00</published><updated>2010-05-25T11:52:52.946+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>System Center Operations Manager Health Explorer Context</title><content type='html'>&lt;p&gt;I’ve been wondering for a while why the Health Explorer doesn’t always display the context for a state change. I found one recent link through both Bing and Google that explains what’s going on: &lt;a title="http://social.technet.microsoft.com/Forums/en-US/systemcenteressentials/thread/df725076-e307-4d63-9be9-5d875c6924b5/" href="http://social.technet.microsoft.com/Forums/en-US/systemcenteressentials/thread/df725076-e307-4d63-9be9-5d875c6924b5/"&gt;http://social.technet.microsoft.com/Forums/en-US/systemcenteressentials/thread/df725076-e307-4d63-9be9-5d875c6924b5/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Basically, at Entity level if there are multiple sources for state change information then the UI doesn’t know how to represent that information so it just says “No context was available for this state change event” and it displays a bunch of state changes with no text… something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/S_Sgw0bpe-I/AAAAAAAAAK4/ZtZwt0qzOQo/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_cWvIIiKNA4g/S_Sgx3hG0KI/AAAAAAAAAK8/sDTqAcsryfk/image_thumb%5B2%5D.png?imgmax=800" width="644" height="238" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;What you need to do is drill down into Availability/Configuration/Performance etc and as you do you’ll get the state change context appearing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2074895492785960257?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2074895492785960257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2074895492785960257&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2074895492785960257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2074895492785960257'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/system-center-operations-manager-health.html' title='System Center Operations Manager Health Explorer Context'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/S_Sgx3hG0KI/AAAAAAAAAK8/sDTqAcsryfk/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-181574543244675389</id><published>2010-05-19T12:35:00.001+12:00</published><updated>2010-05-25T11:53:39.001+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><title type='text'>Pascal’s Triangle in F#</title><content type='html'>&lt;p&gt;Fun with F# :)&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let rec &lt;/span&gt;PascalsTriangle = seq { &lt;br /&gt;    &lt;span style="color: blue"&gt;yield &lt;/span&gt;[1];&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;aLine &lt;span style="color: blue"&gt;in &lt;/span&gt;PascalsTriangle &lt;span style="color: blue"&gt;-&amp;gt; &lt;br /&gt;            &lt;/span&gt;List.append (1::Seq.toList (Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(x,y) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;x+y) (Seq.pairwise aLine))) ([1])&lt;br /&gt;                    }&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;gt; PascalsTriangle |&amp;gt; Seq.take 10 |&amp;gt; Seq.toList;;&lt;br /&gt;val it : int list list =&lt;br /&gt;  [[1]; [1; 1]; [1; 2; 1]; [1; 3; 3; 1]; [1; 4; 6; 4; 1]; [1; 5; 10; 10; 5; 1];&lt;br /&gt;   [1; 6; 15; 20; 15; 6; 1]; [1; 7; 21; 35; 35; 21; 7; 1];&lt;br /&gt;   [1; 8; 28; 56; 70; 56; 28; 8; 1]; [1; 9; 36; 84; 126; 126; 84; 36; 9; 1]]&lt;br /&gt;&amp;gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I actually started this with a pipe forward approach, but ( at least with my knowledge of the syntax) it seemed longer to write down.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let rec &lt;/span&gt;PascalsTriangle1 = seq { &lt;br /&gt;    &lt;span style="color: blue"&gt;yield &lt;/span&gt;[1];&lt;br /&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;aLine &lt;span style="color: blue"&gt;in &lt;/span&gt;PascalsTriangle1 &lt;span style="color: blue"&gt;-&amp;gt; &lt;br /&gt;            let &lt;/span&gt;newLine = &lt;br /&gt;                aLine&lt;br /&gt;                |&amp;gt; Seq.pairwise&lt;br /&gt;                |&amp;gt; Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;(x,y) &lt;span style="color: blue"&gt;-&amp;gt; &lt;/span&gt;x+y)&lt;br /&gt;                |&amp;gt; Seq.toList&lt;br /&gt;            List.append (1::newLine) [1] &lt;br /&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-181574543244675389?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/181574543244675389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=181574543244675389&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/181574543244675389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/181574543244675389'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/pascals-triangle-in-f.html' title='Pascal’s Triangle in F#'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5948324848952656607</id><published>2010-05-14T20:41:00.001+12:00</published><updated>2010-05-14T21:35:03.477+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>Discovering the presence of a database in a System Center Powershell script</title><content type='html'>&lt;p&gt;I’m pretty sure there’s a better way to do this using the native SQL Server management pack but this worked for me (peppered with debugging statements). It looks for a database called staging and if it finds it, it returns the discovery information back.&lt;/p&gt;  &lt;pre class="code"&gt;      &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Discovery &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;B.Staging.DiscoverProcessingComponent&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Enabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Target&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;B.Staging.ComputerRole&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;ConfirmDelivery&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Remotable&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Priority&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Normal&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Category&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Discovery&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Category&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiscoveryTypes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiscoveryClass &lt;/span&gt;&lt;span style="color: red"&gt;TypeID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;B.Staging.ProcessingComponent&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiscoveryTypes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataSource &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;PSScript&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;TypeID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;IntervalSeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;18&lt;/span&gt;0&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;IntervalSeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SyncTime &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;DiscoverBStagingProcessingComponent.ps1&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptBody&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: gray"&gt;param($sourceId, $managedEntityId, $computerName)&lt;br /&gt;      &lt;br /&gt;      $api = New-Object -comObject 'MOM.ScriptAPI'&lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;Created MOM.ScriptAPI with param sourceId = $sourceId , managedEntityId = $managedEntityId , computerName = $computerName &amp;quot;)&lt;br /&gt;      &lt;br /&gt;      $discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId) &lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;Executed CreateDiscoveryData&amp;quot;)&lt;br /&gt;      &lt;br /&gt;      [system.reflection.assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null&lt;br /&gt;&lt;br /&gt;      $s=new-object('Microsoft.SqlServer.Management.Smo.Server') $computerName&lt;br /&gt;      $dbs=$s.databases&lt;br /&gt;      $dbs | get-member -membertype property&lt;br /&gt;      $staging = ($dbs | select name | where {$_.name -eq 'staging'}).&amp;quot;Name&amp;quot;&lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;Found anything: $staging&amp;quot;)&lt;br /&gt;      &lt;br /&gt;      $instance = $discoveryData.CreateClassInstance(&amp;quot;$MPElement[Name='B.Staging.ProcessingComponent']$&amp;quot;)&lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;Executed CreateClassInstance&amp;quot;)&lt;br /&gt;&lt;br /&gt;      if ($staging -eq 'staging') {&lt;br /&gt;        $instance.AddProperty(&amp;quot;$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$&amp;quot;, $computerName)&lt;br /&gt;        $instance.AddProperty(&amp;quot;$MPElement[Name='B.Staging.ProcessingComponent']/B.Staging.ProcessingComponentKey$&amp;quot;, &amp;quot;staging&amp;quot;)&lt;br /&gt;        &lt;br /&gt;        $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;In the staging branch&amp;quot;)&lt;br /&gt;&lt;br /&gt;      } else {&lt;br /&gt;          $instance.AddProperty(&amp;quot;$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;        $instance.AddProperty(&amp;quot;$MPElement[Name='B.Staging.ProcessingComponent']/B.Staging.ProcessingComponentKey$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;        &lt;br /&gt;        $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;In the not-staging branch&amp;quot;)&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;About to AddInstance&amp;quot;)&lt;br /&gt;&lt;br /&gt;      $discoveryData.AddInstance($instance)&lt;br /&gt;      &lt;br /&gt;      $api.LogScriptEvent(&amp;quot;Processing discovery&amp;quot;,101,2,&amp;quot;About to return discoveryData&amp;quot;)&lt;br /&gt;&lt;br /&gt;      $discoveryData&lt;br /&gt;      &lt;br /&gt;      &lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptBody&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameters&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;sourceID&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;$MPElement$&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;managedEntityID&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;$Target/Id$&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;computerName&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;              &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;$Target/Host/Property[Type=&amp;quot;Windows!Microsoft.Windows.Computer&amp;quot;]/PrincipalName$&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Parameters&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TimeoutSeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;300&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TimeoutSeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Discovery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5948324848952656607?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5948324848952656607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5948324848952656607&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5948324848952656607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5948324848952656607'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/discovering-presence-of-database-in.html' title='Discovering the presence of a database in a System Center Powershell script'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1555242854932074278</id><published>2010-05-14T20:27:00.001+12:00</published><updated>2010-05-14T21:35:03.478+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>Lessons in System Center Operations Manager Discovery</title><content type='html'>&lt;p&gt;Some quick notes before I forget them.&lt;/p&gt;  &lt;h2&gt;General Hints&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Run through the &lt;a href="http://technet.microsoft.com/en-us/library/ee957010.aspx"&gt;Management Pack Authoring Guide&lt;/a&gt; first. It’s useful but I feel it didn’t give me enough of an explanation of what’s actually going on under the covers. Much of the inner workings of system center remain a mystery to me.&lt;/li&gt;    &lt;li&gt;Setup a &lt;a href="http://ops-mgr.spaces.live.com/Blog/cns!3D3B8489FCAA9B51!2271.entry?sa=123783026"&gt;single all in one dev environment&lt;/a&gt; to allow yourself the chance to really play around when you’re not sure what’s going on. Then load on an agent onto your normal desktop workstation/laptop and test discoveries out on that machine at the same time as you begin deploying your management packs into the production environment.&lt;/li&gt;    &lt;li&gt;Get a copy of &lt;a href="http://www.savision.com/"&gt;Savision Live Maps&lt;/a&gt; – a 5 diagram copy is freely available. It has a simple, easy to use interface for finding your class instances and testing out your discoveries. And, I’ve just discovered – there’s a new version out – v5 is RTM - gotta try it.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Registry Discovery&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Use the filtered registry discovery not the unfiltered discovery. This ensures you can get the Build Event Expression page which enables you to test for the existence of a registry key.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;WMI Discovery&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Use wbemtest.exe to try out queries and drill down into the CIM classes.&lt;/li&gt;    &lt;li&gt;Documentation to help you with WMI is again weak. Classic example – at time of writing this there’s a community comment to highlight the fact that the &lt;a href="http://msdn.microsoft.com/en-us/library/ms179354.aspx"&gt;SQL Server 2008 ComputerManagement namespace is incorrectly labelled&lt;/a&gt; (should be root\Microsoft\SqlServer\ComputerManagement10 – you can verify by using select * from __namespace under root\Microsoft\SqlServer).&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Powershell Script Discovery&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;This one is still a bit of a mystery: I copied from the &lt;a href="http://technet.microsoft.com/en-us/library/ee957031.aspx"&gt;example in the Authoring Guide&lt;/a&gt; in combination with this &lt;a href="http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.opsmgr.authoring&amp;amp;tid=bf56544c-ff08-484b-8e75-3e77e1bff3e5&amp;amp;cat=774D10FA-BF78-EAAC-87D5-11F4E93F9FCC&amp;amp;lang=en&amp;amp;cr=US&amp;amp;sloc=&amp;amp;p=1"&gt;example showing debugging&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1555242854932074278?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1555242854932074278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1555242854932074278&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1555242854932074278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1555242854932074278'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/lessons-in-system-center-operations.html' title='Lessons in System Center Operations Manager Discovery'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8832737845192090311</id><published>2010-05-06T13:18:00.001+12:00</published><updated>2010-05-06T13:20:25.970+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>Adding SCOM Class Properties to the DGML</title><content type='html'>&lt;p&gt;Updated transform for SCOM/OpsMgr management pack diagramming with DGML. This time I added in the SCOM class attributes as properties on DGML nodes – perhaps I should’ve used categories?? The legend in the visual studio viewer then lets you highlight parts of the class model based upon properties.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/S-IYzqAMp_I/AAAAAAAAAKw/QUOn9us-amU/s1600-h/scr1%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="scr1" border="0" alt="scr1" src="http://lh5.ggpht.com/_cWvIIiKNA4g/S-IY0dVZrkI/AAAAAAAAAK0/BKsSAoaERpE/scr1_thumb%5B1%5D.jpg?imgmax=800" width="644" height="423" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next thing would be to include attributes about relationships as properties on the links. Also, what about referencing other system center management packs?&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:stylesheet &lt;/span&gt;&lt;span style="color: red"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://schemas.microsoft.com/vs/2009/dgml&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:output&lt;/span&gt;&lt;span style="color: red"&gt;method&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;xml&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;indent&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DirectedGraph&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Nodes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:apply-templates&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ManagementPack/TypeDefinitions/EntityTypes/ClassTypes/ClassType&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Nodes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Links&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:apply-templates&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ManagementPack/TypeDefinitions/EntityTypes/RelationshipTypes/RelationshipType&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Links&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Categories&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Categories&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Properties&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Property&lt;/span&gt;&lt;span style="color: red"&gt;Id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Accessibility&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Accessibility&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Accessibility&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;DataType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.String&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Property&lt;/span&gt;&lt;span style="color: red"&gt;Id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Abstract&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Abstract&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Whether this is an abstract class&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;DataType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.Boolean&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Property&lt;/span&gt;&lt;span style="color: red"&gt;Id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Base&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Base&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Whether this is a base class&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;DataType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.String&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Property&lt;/span&gt;&lt;span style="color: red"&gt;Id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Hosted&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Hosted&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Whether this is hosted&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;DataType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.Boolean&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Property&lt;/span&gt;&lt;span style="color: red"&gt;Id&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Singleton&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Label&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Singleton&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Description&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Whether this is singleton&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;DataType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.Boolean&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Properties&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DirectedGraph&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ManagementPack/TypeDefinitions/EntityTypes/ClassTypes/ClassType&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:element&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Node&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Id&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@ID&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Accessibility&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@Accessibility&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Abstract&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@Abstract&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Base&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@Base&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Hosted&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@Hosted&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Singleton&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;@Singleton&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ManagementPack/TypeDefinitions/EntityTypes/RelationshipTypes/RelationshipType&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Link&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Source&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Source&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Target&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Target&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Link&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;     &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8832737845192090311?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8832737845192090311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8832737845192090311&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8832737845192090311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8832737845192090311'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/adding-scom-class-properties-to-dgml.html' title='Adding SCOM Class Properties to the DGML'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/S-IY0dVZrkI/AAAAAAAAAK0/BKsSAoaERpE/s72-c/scr1_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6721441352454582540</id><published>2010-05-03T14:20:00.001+12:00</published><updated>2010-05-05T12:47:41.664+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><title type='text'>WMI Web Site Discovery with System Center Operations Manager</title><content type='html'>&lt;p&gt;Learning how to perform a discovery with WMI under SCOM/OpsMgr isn’t easy – documentation is appalling and there’s few examples on the net. Here’s my, eventually, successful attempt with some lessons learned along the way.&lt;/p&gt;  &lt;p&gt;First off a quick description of the original problem – I want to discover multiple instances of web services running on servers. &lt;/p&gt;  &lt;p&gt;After much, much time spent &lt;a href="http://ops-mgr.spaces.live.com/Blog/cns!3D3B8489FCAA9B51!2271.entry?sa=123783026"&gt;building a single server SCOM/OpsMgr&lt;/a&gt; development environment (just exactly what do people call this product anyway?) and figuring my way tentatively through SCOM and the SCOM Authoring Console I defined a class based on Microsoft.Windows.LocalApplication. If you ever have any issues with this stuff a good place to go is the Operations Manager Authoring discussion board – one of my questions and the helpful response from Elizabeth 1978 is &lt;a href="http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.opsmgr.authoring&amp;amp;cat=774D10FA-BF78-EAAC-87D5-11F4E93F9FCC&amp;amp;lang=en&amp;amp;cr=US"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/S94yz-NeW0I/AAAAAAAAAJ4/Z_TevgFgmL8/s1600-h/clip_image002%5B17%5D%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[17]" border="0" alt="clip_image002[17]" src="http://lh5.ggpht.com/_cWvIIiKNA4g/S94y0_V7IXI/AAAAAAAAAJ8/Qn6tVcSBcok/clip_image002%5B17%5D_thumb%5B1%5D.jpg?imgmax=800" width="644" height="359" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then I created a discovery based upon a wmi query against the root\webadministration namespace to retrieve a list of sites. (Try it out in Powershell first: &lt;font face="Courier New"&gt;get-wmiobject –query “select * from site” –namespace root\webadministration&lt;/font&gt;.)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/S94y2P5FA-I/AAAAAAAAAKA/hJm1DDWD3z4/s1600-h/clip_image002%5B19%5D%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[19]" border="0" alt="clip_image002[19]" src="http://lh5.ggpht.com/_cWvIIiKNA4g/S94y3ciZ1XI/AAAAAAAAAKE/Wwr_Pl2tVTw/clip_image002%5B19%5D_thumb%5B5%5D.jpg?imgmax=800" width="644" height="421" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now try to simulate this (learning to use the simulate tool as an experiment in itself – remember to load the MP into SCOM then click the arrow heads to attach to your development RMS so expressions can be resolved)… and it doesn’t work.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/S94y4nL9x_I/AAAAAAAAAKI/qqbuRS6Gpgw/s1600-h/clip_image002%5B21%5D%5B6%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[21]" border="0" alt="clip_image002[21]" src="http://lh6.ggpht.com/_cWvIIiKNA4g/S94y5k1Vp4I/AAAAAAAAAKM/qquotTrqyQA/clip_image002%5B21%5D_thumb%5B6%5D.jpg?imgmax=800" width="244" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/S94y6L1LtrI/AAAAAAAAAKQ/P0YuawAoiBE/s1600-h/clip_image002%5B23%5D%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[23]" border="0" alt="clip_image002[23]" src="http://lh3.ggpht.com/_cWvIIiKNA4g/S94y7dWvVlI/AAAAAAAAAKU/R5DdOBlampA/clip_image002%5B23%5D_thumb%5B3%5D.jpg?imgmax=800" width="244" height="111" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/S940JHwwfGI/AAAAAAAAAKo/DAdWA0wvGsc/s1600-h/clip_image002%5B29%5D%5B5%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[29]" border="0" alt="clip_image002[29]" src="http://lh6.ggpht.com/_cWvIIiKNA4g/S940KFOfIAI/AAAAAAAAAKs/q3eybY9OkuI/clip_image002%5B29%5D_thumb%5B5%5D.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Strange. Then by trial and error I find that the asterisk doesn’t allow SCOM to pick up the data element for the name from the WMI query. Basically it seems to need you to identify each value you want returned in the WMI query to be sure you can map it in the Authoring Console mapper screen.&lt;/p&gt;  &lt;p&gt;So this works:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/S94y8aulXtI/AAAAAAAAAKY/kWFjJkSflnw/s1600-h/clip_image002%5B25%5D%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[25]" border="0" alt="clip_image002[25]" src="http://lh6.ggpht.com/_cWvIIiKNA4g/S94y9ZCqVEI/AAAAAAAAAKc/kVEG3cSm0Vs/clip_image002%5B25%5D_thumb%5B5%5D.jpg?imgmax=800" width="644" height="386" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can check by running a simulation.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/S94y-fVE_dI/AAAAAAAAAKg/xFW-z9-PAXg/s1600-h/clip_image002%5B27%5D%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[27]" border="0" alt="clip_image002[27]" src="http://lh6.ggpht.com/_cWvIIiKNA4g/S94y_iH5TsI/AAAAAAAAAKk/3cMYjQF7LL0/clip_image002%5B27%5D_thumb%5B1%5D.jpg?imgmax=800" width="644" height="432" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And to be doubly sure I imported the management pack into the SCOM environment with a monitor that targeted the class and checked when the ASP.NET Apps v4.0.30319 Requests/Sec counter was in excess of 10 requests/second.&lt;/p&gt;  &lt;p&gt;As a web service I used a wcf service – just a simple hello world affair (in F# – why is there no template in visual studio??) and executed from a powershell console.&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;1..1000 | foreach-object {(new-object system.net.webclient).downloadstring(“http://localhost/service.svc”) }&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6721441352454582540?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6721441352454582540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6721441352454582540&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6721441352454582540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6721441352454582540'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/05/wmi-web-site-discovery-with-system.html' title='WMI Web Site Discovery with System Center Operations Manager'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/S94y0_V7IXI/AAAAAAAAAJ8/Qn6tVcSBcok/s72-c/clip_image002%5B17%5D_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5938236487692205233</id><published>2010-04-22T09:32:00.002+12:00</published><updated>2010-05-05T12:47:41.665+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>“Ah Ha” Moment</title><content type='html'>&lt;p&gt;So if I can convert a system definition model from OpsMgr/SCOM to directed graph markup language… then presumably I could use VS2010 to create my architecture model and then generate the framework for my OpsMgr/SCOM management pack!&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Update... it seems to me that none fo the vs2010 model types make sense with scom. Guess that it might be better waiting till the system center team publish a modelling tool.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5938236487692205233?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5938236487692205233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5938236487692205233&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5938236487692205233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5938236487692205233'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/04/ah-ha-moment.html' title='“Ah Ha” Moment'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1893787587077085714</id><published>2010-04-21T22:14:00.003+12:00</published><updated>2010-05-05T12:47:41.665+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>SCOM Class Hierarchy to Directed Graph Markup</title><content type='html'>&lt;p&gt;As part of a struggle to get to grips with management pack authoring for Systems Center Operations Manager I wanted a way to diagram the relationships between classes. You can do it with the OpsMgr Authoring kit and Visio… but I don’t have it on my machine. However, with the management pack being xml, it seemed a simple job to transform to directed graph markup language to view inside Visual Studio 2010. Here’s a sample xsl transform.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.w3.org/1999/XSL/Transform"&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;="/"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DirectedGraph&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/vs/2009/dgml"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Nodes&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Nodes&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Links&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;="ManagementPack/TypeDefinitions/EntityTypes/RelationshipTypes/RelationshipType"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Link&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Source"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;="Source"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:attribute&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Target"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;="Target"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:attribute&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Link&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Links&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Categories&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Categories&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DirectedGraph&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This seems to work with the sample management pack created on &lt;a href="http://blogs.technet.com/brianwren/archive/2009/06/04/powershell-scripts-in-a-management-pack-part-2.aspx"&gt;Brian Wren’s blog for an article about embedded Powershell&lt;/a&gt; scripts. Using the transform and either the &lt;a href="http://www.altova.com/altovaxml.html"&gt;Altova xslt1 processor&lt;/a&gt; or the native transform in VS2010 I got a dgml file that displays like this. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/S87P6gLwx2I/AAAAAAAAAJw/AIqrRGSIItI/s1600-h/image%5B3%5D.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_cWvIIiKNA4g/S87P7T_QXsI/AAAAAAAAAJ0/EhXBRL_CtiU/image_thumb%5B1%5D.png?imgmax=800" width="644" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1893787587077085714?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1893787587077085714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1893787587077085714&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1893787587077085714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1893787587077085714'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/04/scom-class-hierarchy-to-directed-graph.html' title='SCOM Class Hierarchy to Directed Graph Markup'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_cWvIIiKNA4g/S87P7T_QXsI/AAAAAAAAAJ0/EhXBRL_CtiU/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2417360822034941314</id><published>2010-01-18T14:02:00.002+13:00</published><updated>2010-04-26T14:17:03.392+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>PowerShell Data Munging</title><content type='html'>&lt;p&gt;There’s a data munging exercise on &lt;a href="http://rosettacode.org/"&gt;Rosetta Code&lt;/a&gt; which was missing a PowerShell solution. Since I spend a lot of time importing data to graph and present in my day job – often using PowerShell, I thought I’d add a couple of PowerShell options for the import of the data in the &lt;a href="http://rosettacode.org/wiki/Data_Munging_2"&gt;Data Munging&lt;/a&gt; 2 problem.&lt;/p&gt;&lt;p&gt;First just using iteration alone to look up good values.&lt;/p&gt;&lt;pre class="csharpcode"&gt;$dateHash = @{}&lt;br /&gt;$goodLineCount = 0&lt;br /&gt;get-content c:\temp\readings.txt&lt;br /&gt;    ForEach-Object {&lt;br /&gt;        $line = $_.split(&lt;span class="str"&gt;" `t"&lt;/span&gt;,2)&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ($dateHash.containskey($line[0])) {&lt;br /&gt;            $line[0] + &lt;span class="str"&gt;" is duplicated"&lt;/span&gt;&lt;br /&gt;        } &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;br /&gt;            $dateHash.add($line[0], $line[1])&lt;br /&gt;        }&lt;br /&gt;        # split up the 24 instrument values and count the total number of entries with flag &amp;gt;=1&lt;br /&gt;        $readings = $line[1].split()&lt;br /&gt;        $goodLine = $&lt;span class="kwrd"&gt;true&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ($readings.count -ne 48) { $goodLine = $&lt;span class="kwrd"&gt;false&lt;/span&gt;; &lt;span class="str"&gt;"incorrect line length : $line[0]"&lt;/span&gt;  }&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; ($i=0; $i -lt $readings.count; $i++) {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ($i % 2 -ne 0) {                               &lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ([&lt;span class="kwrd"&gt;int&lt;/span&gt;]$readings[$i] -lt 1) {&lt;br /&gt;                    $goodLine = $&lt;span class="kwrd"&gt;false&lt;/span&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ($goodLine) { $goodLineCount++ }&lt;br /&gt;    }&lt;br /&gt;$goodLineCount&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And secondly taking advantage of the regular expression syntax.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;$dateHash = @{}&lt;br /&gt;$goodLineCount = 0&lt;br /&gt;ForEach ($rawLine &lt;span class="kwrd"&gt;in&lt;/span&gt; ( get-content c:\temp\readings.txt) ){&lt;br /&gt;    $line = $rawLine.split(&lt;span class="str"&gt;" `t"&lt;/span&gt;,2)&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($dateHash.containskey($line[0])) {&lt;br /&gt;        $line[0] + &lt;span class="str"&gt;" is duplicated"&lt;/span&gt;&lt;br /&gt;    } &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;br /&gt;        $dateHash.add($line[0], $line[1])&lt;br /&gt;    }&lt;br /&gt;    $readings = [regex]::matches($line[1],&lt;span class="str"&gt;"\d+\.\d+\s-?\d"&lt;/span&gt;)&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($readings.count -ne 24) { &lt;span class="str"&gt;"incorrect number of readings for date "&lt;/span&gt; + $line[0] }&lt;br /&gt;    $goodLine = $&lt;span class="kwrd"&gt;true&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; ($flagMatch &lt;span class="kwrd"&gt;in&lt;/span&gt; [regex]::matches($line[1],&lt;span class="str"&gt;"\d\.\d*\s(?&amp;lt;flag&amp;gt;-?\d)"&lt;/span&gt;)) {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ([&lt;span class="kwrd"&gt;int&lt;/span&gt;][&lt;span class="kwrd"&gt;string&lt;/span&gt;]$flagMatch.groups[&lt;span class="str"&gt;"flag"&lt;/span&gt;].&lt;span class="kwrd"&gt;value&lt;/span&gt; -lt 1) {&lt;br /&gt;            $goodLine = $&lt;span class="kwrd"&gt;false&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($goodLine) { $goodLineCount++}&lt;br /&gt;}&lt;br /&gt;[&lt;span class="kwrd"&gt;string&lt;/span&gt;]$goodLineCount + &lt;span class="str"&gt;" good lines"&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The F# solution on the site includes use of seq.forall – I thought maybe this would be useful to implement for the PowerShell solution as well – but I couldn't figure it out. Fortunately the good folks at &lt;a href="http://stackoverflow.com/questions/2092159/powershell-equivalent-to-f-seq-forall"&gt;stackoverflow helped out on that&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/17672034-2417360822034941314?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2417360822034941314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2417360822034941314&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2417360822034941314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2417360822034941314'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2010/01/powershell-data-munging.html' title='PowerShell Data Munging'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5978117606821483399</id><published>2009-11-04T15:01:00.003+13:00</published><updated>2010-05-05T12:47:41.666+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Center Operations Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Connecting to SCOM from the Powershell ISE</title><content type='html'>Temporary interlude, figuring out how to get some numbers from our IT environment to create some models for complexity in our technology environment. I thought System Center Operations Manager should be useful here but running powershell from the SCOM shell isn't that clever. It'd be much nicer in a decent editor... but how? I couldn't find this anywhere else on the net... so here's how I managed to get SCOM (R2) accessible from the Powershell ISE...&lt;br /&gt;&lt;br /&gt;import-module "C:\Program Files\System Center Operations Manager 2007\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll"&lt;br /&gt;&lt;br /&gt;&amp;amp;"C:\Program Files\System Center Operations Manager 2007\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Functions.ps1"&lt;br /&gt;&lt;br /&gt;Start-OperationsManagerClientShell -ManagementServerName: somemachinename -PersistConnection: $true -Interactive: $True&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5978117606821483399?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5978117606821483399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5978117606821483399&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5978117606821483399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5978117606821483399'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/11/connecting-to-scom-from-powershell-ise.html' title='Connecting to SCOM from the Powershell ISE'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1617956851038653426</id><published>2009-03-18T12:58:00.001+13:00</published><updated>2009-03-18T12:58:10.052+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Fibreglassing the Outside</title><content type='html'>&lt;p&gt;Quick notes from here on as the exterior was considerably easier than the interior.&lt;/p&gt;  &lt;p&gt;I bias cut the fibrglass for the exterior to get it to drape better. The epoxy application was much simpler than inside although I did find a few areas that ended up a bit on the dry side. Main reason for this was I ended up working into the evenings and the lighting was awful. This also resulted in a couple of unnecessary floating bubbles and drips – but all easily fixed. So much easier after having done the interior first.&lt;/p&gt;  &lt;p&gt;One tip (I think) was to fibreglass across the sheer line; that is, when I fibreglassed the deck, I went to about an inch beyond the deck-hull join, and likewise when I fibreglassed the hull, so that the join between deck and hull was secured with interior tape and a doubling of the exterior glass.&lt;/p&gt;  &lt;p&gt;I doubled the glass on the exterior hull from the sheer line to the keel so that under my body I ended up with 4 layers of 200g (6oz) fibreglass. &lt;/p&gt;  &lt;p&gt;Having read about the difficulties of making a lightweight boat I spent a lot of time checking the weight as I progressed. One very useful thing here (especially to avoid wastage) was a cheap digital scale. I bought this from a supermarket for $16 and used it to successfully mix epoxy down to 1g hardener and 5g epoxy. I recorded the weight of each batch of epoxy and I weighed the boat after each major application so I could clearly see the increase from 12kg prior to exterior glassing to 19kg after the fill coats were complete.&lt;/p&gt;  &lt;p&gt;I found the fill coats a little painful. I seemed to never quite get the right amount on. I’d put a coat on, sand some off, then try again; many times over. What was particularly irritating here was that to avoid excessive exposure to the epoxy while curing I would make myself wait a few days before any sanding. The time just seemed to drag!&lt;/p&gt;  &lt;p&gt;If I was doing it again I’d make two changes.&lt;/p&gt;  &lt;p&gt;Firstly, I’d use a slow hardener and warm epoxy/conditions. I found that on a few of my (autumn) evenings the temperature had dropped to maybe 15C and the epoxy had thickened and would spread easily. You want it to spread really easily so a really hot day with a slow hardener would be a better combination.&lt;/p&gt;  &lt;p&gt;Secondly, I’d use a random orbital sander more extensively. I spent far too much time continuing on with hand sanding when I should have just used the ROS. The pads clog up quick but crikey it does a hell of a job!    &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1617956851038653426?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1617956851038653426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1617956851038653426&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1617956851038653426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1617956851038653426'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/03/s-night-heron-fibreglassing-outside.html' title='S&amp;amp;G Night Heron – Fibreglassing the Outside'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5222391415129787413</id><published>2009-03-18T12:57:00.001+13:00</published><updated>2009-03-18T12:57:54.943+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Varnishing and Outfitting</title><content type='html'>&lt;p&gt;I was initially unsure what to use for the final coat: varnish or polyurethane. The documentation on the net seemed a little confusing. In the end I’ve gone with a varnish from Altex. Not sure if this was the best choice, I suspect it’s more expensive than the equivalent products I could have just bought at Mitre 10 or Placemakers. Nevermind.&lt;/p&gt;  &lt;p&gt;The can said 6 to 10 coats. I think I’ve run up 7 on the top and 6 on the bottom. Hard to remember!&lt;/p&gt;  &lt;p&gt;I used the ROS with 180 grit pads and this seems to produce a good surface. I’ve still got a fair 250mls left so I’ll put that on sometime in winter.&lt;/p&gt;  &lt;p&gt;I enjoyed this part much more than the epoxy. No special safety gear required and it could be done at an enjoyable pace. &lt;/p&gt;  &lt;p&gt;I put the kayak in the garage – there was some dust but it pails into insignificance when viewed from a few feet. Runs were definitely a problem. Sponge applicators helped but invariably I’d come back the next day and find a few runs that had formed.&lt;/p&gt;  &lt;p&gt;For the outfitting I’ve kept to a bare minimum, at least for the moment. I used window weather stripping for the hatches – seems a bit leaky but I’m sure I’ll be able to tune it better.&lt;/p&gt;  &lt;p&gt;I used plastic foot pegs; very light but they also seem a bit flimsy. In retrospect I’d go aluminium.&lt;/p&gt;  &lt;p&gt;The back rest provided in the Night Heron plans seems quite effective without any padding. In fact, I spent $80 on closed cell foam and so far haven’t put any in yet, but it doesn’t seem to be especially uncomfortable so I’m in no great rush to finish it.&lt;/p&gt;  &lt;p&gt;For the spray deck I ended up, after a few false starts, with getting one made by someone (Gabi) in Nelson. You can get hold of them on &lt;a href="http://www.trademe.co.nz/Members/Listings.aspx?member=1155499"&gt;TradeMe&lt;/a&gt; and I’d recommend the product. Other options include &lt;a href="http://www.rasdex.co.nz"&gt;Rasdex&lt;/a&gt; and &lt;a href="http://www.backofbeyond.co.nz"&gt;BackOfBeyond&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;And the final result? Well, here I am on the inaugural launch in the Waikanae River at the Otaihanga domain. Beautiful spot; you can head out at high tide down the 2kms to the river mouth, play in the sea, then come back with the salt water washed off in the river.&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/ScA4-aFvCAI/AAAAAAAAAJg/bFS1f09WFTg/s1600-h/DSC033423.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DSC03342" border="0" alt="DSC03342" src="http://lh6.ggpht.com/_cWvIIiKNA4g/ScA4_0_ixhI/AAAAAAAAAJk/dogO9SP0J9c/DSC03342_thumb1.jpg?imgmax=800" width="644" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In the end I guess I spent 10 hours / week from the middle of November 2008 until the first week of March this year. So that’s about 160 hours. The cost is approximately $1000. It’s easy to spend more if you don’t hunt around for good prices on ply, fibreglass, epoxy and varnish.&lt;/p&gt;  &lt;p&gt;And performance? Well, I’m very familiar with the plastic sea kayaks that you can hire. My Night Heron is faster, feels more manoeuvrable (and it doesn’t have a rudder) and it’s much lighter. So all in all – I LOVE IT!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5222391415129787413?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5222391415129787413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5222391415129787413&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5222391415129787413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5222391415129787413'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/03/s-night-heron-varnishing-and-outfitting.html' title='S&amp;amp;G Night Heron – Varnishing and Outfitting'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/ScA4_0_ixhI/AAAAAAAAAJk/dogO9SP0J9c/s72-c/DSC03342_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6225950370430688392</id><published>2009-02-27T19:10:00.003+13:00</published><updated>2010-04-26T14:17:24.832+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Functionally complete kayak</title><content type='html'>Second to last day of February and a quick note to remind me in the future: kayak is functionally complete. No photograph, camera batteries are flat, but the rubber seals are on hatch rims, the foot pegs are in, the back rest is in. That makes it about 15 weeks from when I started in mid november. Phew. One thing left to do - varnish, maybe wait a couple of weeks to be sure the epoxy has set. Weather this weekend looks shocking. Maybe Sunday to try on the sea? Write some more detail on the last steps of the build after that. For those interested, final weight about 19kgs. Hard to tell, scales difficult to read, maybe 18.5. That's with 6oz everywhere, 2 layers on the bottom and 2 layers most of the inside hull.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6225950370430688392?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6225950370430688392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6225950370430688392&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6225950370430688392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6225950370430688392'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/functionally-complete-kayak.html' title='Functionally complete kayak'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4765161768959498774</id><published>2009-02-02T22:13:00.001+13:00</published><updated>2009-02-02T22:13:45.134+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Attaching the Deck to the Hull</title><content type='html'>&lt;p&gt;I found I couldn’t do this with just tape. The hull and deck needed more force to get the positioning of them together so I ended up wiring them together. This was the second time I did this. I did it first time round when wiring together the deck on top of the hull. I probably should’ve put more effort in then with the stern and it would’ve made life easier for me now.&lt;/p&gt;  &lt;p&gt;The stern of the Night Heron has to be squashed together with some force. I’m not the only one that seems to have to do this. In the pictures supplied with Nick’s instructions you can see he has it happen to him and I’ve seen pictures from another builder with the same problem:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://outdoors.webshots.com/photo/1165926632056308877loLvMK"&gt;http://outdoors.webshots.com/photo/1165926632056308877loLvMK&lt;/a&gt; – this builder’s comments mirrored my experience exactly&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The bow was easy. The last two feet of the stern were stubborn and took a bit of technique. There I used a paint spatula to force out the hull and then pressed hard and fast on the deck to squish the two beveled edges together for taping. One side of the stern just didnt want to play nice..&lt;/em&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Maybe an extra form or two would be useful when creating the stern of the boat?&lt;/p&gt;  &lt;p&gt;To help with getting the stern to fit I ended up putting in extra stitches along the rear of the boat. Getting them in at the back is easy as long you use long wires and get them through both holes while the deck and hull are still some distance apart. Then, only after all wires are in do you push the deck down onto the hull and tighten the wires.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa5JwIB5iI/AAAAAAAAAI4/JTkUg0OHUJg/s1600-h/DSC032355.jpg"&gt;&lt;img title="Attaching deck and hull. The stern was difficult. You seem to need to press down hard to get the hull to expand out and meet the deck on the edges." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Attaching deck and hull. The stern was difficult. You seem to need to press down hard to get the hull to expand out and meet the deck on the edges." src="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa5KuZVyGI/AAAAAAAAAI8/5C2Fes4EeEA/DSC03235_thumb9.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa5LtqBw8I/AAAAAAAAAJA/6XSiYgDQAKI/s1600-h/DSC032344.jpg"&gt;&lt;img title="Finally finished with those wires (except for the stern and bow - I&amp;#39;m going to pack glue and chopped fibreglass in there then tighten up)." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="372" alt="Finally finished with those wires (except for the stern and bow - I&amp;#39;m going to pack glue and chopped fibreglass in there then tighten up)." src="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa5MWQ1mtI/AAAAAAAAAJE/mPA8C2dG7y4/DSC03234_thumb9.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I then glued up between the stitches – wish I’d done a cleaner job as I’m still sanding the rough bits up - and then waited a few days to be sure the two pieces wouldn’t crack or pop apart at any point.&lt;/p&gt;  &lt;p&gt;With the stitches gone I then put the kayak up on it’s side and taped the inside seam. Notice I cut the hatches before attaching the deck. This made the taping quite easy.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa5NWPl4hI/AAAAAAAAAJI/MuUrpaUPkTM/s1600-h/DSC032683.jpg"&gt;&lt;img title="DSC03268" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="DSC03268" src="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa5OZKmh2I/AAAAAAAAAJM/jt63eGAWr7A/DSC03268_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I taped up to maybe 50cms from each end but in retrospect I could have gone further. The secret seemed to be lots of light!&lt;/p&gt;  &lt;p&gt;Here’s one bit that went a bit wobbly:)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SYa5PLFZ6GI/AAAAAAAAAJQ/KYZKX8xxdKg/s1600-h/DSC032713.jpg"&gt;&lt;img title="Oh, I can see it wobbling off to the side there..." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Oh, I can see it wobbling off to the side there..." src="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa5QElmYwI/AAAAAAAAAJU/_heBU6BMdAE/DSC03271_thumb1.jpg?imgmax=800" width="364" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(Notice all the sanding dust still left inside!)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And then I just had to put it into the pool and proved it worked!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa5RGNsPUI/AAAAAAAAAJY/l7fe8rN5pr0/s1600-h/DSC03278Cropped3.jpg"&gt;&lt;img title="It floats! (Just taped internal seams and thought it deserved to see water...)" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="422" alt="It floats! (Just taped internal seams and thought it deserved to see water...)" src="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa5SDmgxRI/AAAAAAAAAJc/kJUmm11ITMc/DSC03278Cropped_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4765161768959498774?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4765161768959498774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4765161768959498774&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4765161768959498774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4765161768959498774'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-attaching-deck-to-hull.html' title='S&amp;amp;G Night Heron – Attaching the Deck to the Hull'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/SYa5KuZVyGI/AAAAAAAAAI8/5C2Fes4EeEA/s72-c/DSC03235_thumb9.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5897850938118697822</id><published>2009-02-02T22:11:00.001+13:00</published><updated>2009-02-02T22:11:51.368+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Extra Cockpit Glass</title><content type='html'>&lt;p&gt;Since I did such a terrible job of glassing the inside of the hull on my first attempt I decided to put a second, large piece of glass on the inside of the boat.&lt;/p&gt;  &lt;p&gt;I guess I covered maybe 40% of the inside of the hull with a second layer of 200g glass (equivalent to 6oz), so it should be very strong!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa4yn06a7I/AAAAAAAAAIo/2d6Rip5qmyU/s1600-h/DSC032203.jpg"&gt;&lt;img title="An oversize cockpit area sheet of extra 200g (6oz) fibreglass in the hull. I did this because my first hull fibreglassing left a lot to be desired." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="An oversize cockpit area sheet of extra 200g (6oz) fibreglass in the hull. I did this because my first hull fibreglassing left a lot to be desired." src="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa4zSYhfPI/AAAAAAAAAIs/KssFMgLiAXg/DSC03220_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here’s the finished product. Much better! This time I took extra care to wipe off excess epoxy during the initial curing process and I used a tape edge to stop the frayed glass fibres sticking.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa40pVmzFI/AAAAAAAAAIw/U0sC54yY5Vw/s1600-h/DSC032213.jpg"&gt;&lt;img title="Much nicer!" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Much nicer!" src="http://lh3.ggpht.com/_cWvIIiKNA4g/SYa41VCTpdI/AAAAAAAAAI0/M2NcG3TJZSs/DSC03221_thumb1.jpg?imgmax=800" width="364" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5897850938118697822?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5897850938118697822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5897850938118697822&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5897850938118697822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5897850938118697822'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-extra-cockpit-glass.html' title='S&amp;amp;G Night Heron – Extra Cockpit Glass'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/SYa4zSYhfPI/AAAAAAAAAIs/KssFMgLiAXg/s72-c/DSC03220_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5938189914641038405</id><published>2009-02-02T22:10:00.001+13:00</published><updated>2009-02-02T22:10:03.430+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Grab Loops</title><content type='html'>&lt;p&gt;Rather than a big end pour I’ve gone with a couple of small plastic tubes (from old felt pens). I drilled the holes using the stitching holes in the hull as a guide for positioning them on each side of the hull.&lt;/p&gt;  &lt;p&gt;To glue them into place I used the chopped up glass, epoxy mix. I wish I’d discovered this earlier. It looks very useful.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SYa4XUQ4umI/AAAAAAAAAIY/ptbCp9VxoA8/s1600-h/DSC032173.jpg"&gt;&lt;img title="I should&amp;#39;ve discovered this stuff earlier. It would&amp;#39;ve made a much better way of fibreglassing round the pvc tube Maroske fitting. It&amp;#39;s chopped up fibres with a cotton microfibre adhesive additive." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="I should&amp;#39;ve discovered this stuff earlier. It would&amp;#39;ve made a much better way of fibreglassing round the pvc tube Maroske fitting. It&amp;#39;s chopped up fibres with a cotton microfibre adhesive additive." src="http://lh4.ggpht.com/_cWvIIiKNA4g/SYa4YH852sI/AAAAAAAAAIc/uauTbNe0lGM/DSC03217_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Notice the digital scales in the picture. I bought these from a supermarket for $16. They’ve been extremely useful in ensuring I get the epoxy mix right. I use small mixes of typically 36g, 48g, or 60g total weight (the mix ratio for Nuplex R180 is 1:5…).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa4Y_JwXRI/AAAAAAAAAIg/zrQqGJ4TYzQ/s1600-h/DSC032196.jpg"&gt;&lt;img title="Gluing in the loop holders (old marker pens)." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Gluing in the loop holders (old marker pens)." src="http://lh4.ggpht.com/_cWvIIiKNA4g/SYa4aoKzruI/AAAAAAAAAIk/p-C5jZohVJo/DSC03219_thumb4.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5938189914641038405?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5938189914641038405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5938189914641038405&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5938189914641038405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5938189914641038405'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-grab-loops.html' title='S&amp;amp;G Night Heron – Grab Loops'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_cWvIIiKNA4g/SYa4YH852sI/AAAAAAAAAIc/uauTbNe0lGM/s72-c/DSC03217_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5496678307748289307</id><published>2009-02-02T22:09:00.001+13:00</published><updated>2009-02-02T22:09:18.195+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Deck Line Fittings</title><content type='html'>&lt;p&gt;For these I used the Maroske style fitting. I used the instructions on Bjorn Thomasson’s site but in retrospect would do things a little differently.&lt;/p&gt;  &lt;p&gt;The first couple that I did I left the pvc tubes in place for more than 24 hours and had a tough time pulling the tube out. In the end I found a hair dryer would blow in hot air and soften the tube sufficiently they came out. For the rest I found if I just pulled the tube out within 12 hours I was fine.&lt;/p&gt;  &lt;p&gt;If I was doing it again I’d put a few larger pieces under the pvc loop then cover the pvc with epoxy mixed with lots of chopped up fibreglass then place a couple of larger pieces of glass over the top. I’m sure it would make a smaller, better fitting.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SYa4OkIverI/AAAAAAAAAIQ/HfAjzNrl8yY/s1600-h/DSC032143.jpg"&gt;&lt;img title="Inside view of one of the Maroske style fittings." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Inside view of one of the Maroske style fittings." src="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa4PSeudII/AAAAAAAAAIU/CNLYXhnRxYs/DSC03214_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5496678307748289307?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5496678307748289307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5496678307748289307&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5496678307748289307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5496678307748289307'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-deck-line-fittings.html' title='S&amp;amp;G Night Heron – Deck Line Fittings'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_cWvIIiKNA4g/SYa4PSeudII/AAAAAAAAAIU/CNLYXhnRxYs/s72-c/DSC03214_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6155407299633816375</id><published>2009-02-02T22:08:00.001+13:00</published><updated>2009-02-02T22:08:52.195+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron – Hip Plates</title><content type='html'>&lt;p&gt;These were quite easy to position prior to gluing with a few lengths of masking tape.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/SYa4IRXaEXI/AAAAAAAAAII/7dFIWoSmQ88/s1600-h/DSC032163.jpg"&gt;&lt;img title="Positioning both cheek plates." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Positioning both cheek plates." src="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa4I9mn_YI/AAAAAAAAAIM/qUNb8vz_M6M/DSC03216_thumb1.jpg?imgmax=800" width="364" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I glued them into position with a microfibre additive then created a thick fillet and applied fibreglass up each side then a couple more shorter fibreglass pieces to strengthen the joint on the inside (where I’ll never be able to reach again once the deck is attached to the hull).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6155407299633816375?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6155407299633816375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6155407299633816375&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6155407299633816375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6155407299633816375'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-hip-plates.html' title='S&amp;amp;G Night Heron – Hip Plates'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/SYa4I9mn_YI/AAAAAAAAAIM/qUNb8vz_M6M/s72-c/DSC03216_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7117612957674358825</id><published>2009-02-02T22:07:00.001+13:00</published><updated>2009-02-02T22:08:04.043+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron Build Notes – Fibreglassing The Coaming</title><content type='html'>&lt;p&gt;Quick post. This wasn’t especially easy. Two layers of bias cut cloth. Putting them on wasn’t hard until it came time to push the cloth under the deck. You have to cut darts and fold the cloth under but it’s a tight corner and fibreglass doesn’t like tight corners. If I was doing this again I’d make a rounder corner to fold under. Unfortunately this is neigh on impossible with the thigh braces as you’ve only got the thickness of the ply to work with. Also, I flipped the deck upside down and the glass on the top of the coaming wanted to come off. Maybe I should have waited for the epoxy to gel before turning the deck upside down?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa34wbvJcI/AAAAAAAAAIA/csYR_e1bW1w/s1600-h/DSC032133.jpg"&gt;&lt;img title="DSC03213" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="DSC03213" src="http://lh5.ggpht.com/_cWvIIiKNA4g/SYa35hL8mOI/AAAAAAAAAIE/MSslUtomJz4/DSC03213_thumb1.jpg?imgmax=800" width="364" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7117612957674358825?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7117612957674358825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7117612957674358825&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7117612957674358825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7117612957674358825'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/02/s-night-heron-build-notes-fibreglassing.html' title='S&amp;amp;G Night Heron Build Notes – Fibreglassing The Coaming'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/SYa35hL8mOI/AAAAAAAAAIE/MSslUtomJz4/s72-c/DSC03213_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5439414610200121154</id><published>2009-01-11T20:09:00.001+13:00</published><updated>2009-01-11T20:09:18.551+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron Build Notes – Gluing the Coaming</title><content type='html'>&lt;p&gt;Well this was a bit tricky! For the life of me I couldn’t get the cutout coaming risers to bend round the curve of the cockpit cutout. I tried kerfing every inch, I tried kerfing much less than an inch (bad idea), I tried a heat gun (good idea). In the end the result was a lot of fine line cracks at the points that I’d cut kerfs. I’m not too fussed. I can easily adjust the final strength by changing the amount of fibreglass I lay on; and now I’ve had success with fibreglassing the inside of the deck that doesn’t bother me one bit.&lt;/p&gt;  &lt;p&gt;One thing I was a bit surprised about – how come I couldn’t get the two coaming risers to meet neatly? There was a 5mm gap that I had to plug with a bit of ply. &lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SWmbExZ0pNI/AAAAAAAAAHY/08tKLAO3PTc/s1600-h/DSC03201%5B3%5D.jpg"&gt;&lt;img title="Coaming risers didn&amp;#39;t meet together exactly and a shim was needed. Hmm, I should&amp;#39;ve sanded it down a trifle..." style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="Coaming risers didn&amp;#39;t meet together exactly and a shim was needed. Hmm, I should&amp;#39;ve sanded it down a trifle..." src="http://lh4.ggpht.com/_cWvIIiKNA4g/SWmbFm_YXuI/AAAAAAAAAHc/4ScFsZND8lQ/DSC03201_thumb%5B1%5D.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hmm, just looking at that photograph I can see I should’ve sanded the insert down a mm or two. Nevermind.&lt;/p&gt;  &lt;p&gt;The surprising thing for me looking from the top down is how come the top of the coaming still fits neatly. Obviously the risers must have been cut out ok. No problem, it was easy to plug and actually I quite like the way it’s on an angle. I wonder what a riser would look like made of angled strips?&lt;/p&gt;  &lt;p&gt;As for the final product see below. Obviously I’ve yet to fibreglass it. Currently I’ve just glued the pieces. I’m going to fillet tomorrow the fibreglass within the next day or so. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SWmbGqao6GI/AAAAAAAAAHg/Qeb08mGzOaw/s1600-h/DSC03200%5B3%5D.jpg"&gt;&lt;img title="Coaming installed. THe cut out on the table was a (failed) idea to help me support a number of uprights to assist bending the coaming upriser." style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="Coaming installed. THe cut out on the table was a (failed) idea to help me support a number of uprights to assist bending the coaming upriser." src="http://lh4.ggpht.com/_cWvIIiKNA4g/SWmbHY9VbzI/AAAAAAAAAHk/Q7w3wmZ-yOQ/DSC03200_thumb%5B1%5D.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;A quick note here about the use of cyano-acrylate glue. I didn’t use it but I’m thinking perhaps I should’ve. I liked the idea that I could use the epoxy and it would give me time to set it up right whereas I was worried that with CA glue I’d fix into the wrong place too quickly. In retrospect it probably would’ve made the stitching and this coaming much faster.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5439414610200121154?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5439414610200121154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5439414610200121154&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5439414610200121154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5439414610200121154'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/01/s-night-heron-build-notes-gluing.html' title='S&amp;amp;G Night Heron Build Notes – Gluing the Coaming'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_cWvIIiKNA4g/SWmbFm_YXuI/AAAAAAAAAHc/4ScFsZND8lQ/s72-c/DSC03201_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7416237588651722830</id><published>2009-01-08T21:25:00.001+13:00</published><updated>2009-01-08T21:25:45.278+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron Build Notes – Fibreglassing</title><content type='html'>&lt;p&gt; Well this was exciting. What amazing stuff fibreglass is. I read and re-read numerous fibreglassing guides from across the net; use a spatula, use a paintbrush, use a roller. I just came away quite confused.&lt;/p&gt;  &lt;p&gt;So I’m going to recount my experiences for you, and probably it’ll just help to confuse you too. Probably main suggestion I have is to find your own way of doing it.&lt;/p&gt;  &lt;p&gt;Anyhow, here’s my fibreglassing lessons gleaned from doing the inside of my hull and deck.&lt;/p&gt;  &lt;p&gt;Firstly, I think it does make it easier to seal the wood with a thin coat of epoxy first. I ended up deciding that a bit of rag was as good as anything else at applying the epoxy. Wear two layers of gloves to be sure they don’t rip, then dab the rag in the epoxy and rub it on the wood. Worked fine for me and a lot cheaper than any other tool. Certainly means you can apply a very thin layer.&lt;/p&gt;  &lt;p&gt;Secondly, for me, rollers suck. I’ve decided that a flat plastic spatula made from the lids of takeaway plastic food containers work great. They’re sufficiently flexible that they can get into funny internal corners easily and they don’t grab at the cloth. They especially good and removing excess epoxy and spreading it away from where it might otherwise pool.&lt;/p&gt;  &lt;p&gt;Thirdly, and perhaps most importantly for me, on the internal sides of the deck and hull you should cut the cloth on the bias. This makes a huge difference. The pain with which I watched my first attempts to lay the fibreglass just pull away from the internal corners whenever I ever so slightly stretched the fabric was truly irritating.&lt;/p&gt;  &lt;p&gt;Cutting the fabric on the bias (at an angle – 45 degrees seemed good to me) gives it much more stretch on those internal angles.&lt;/p&gt;  &lt;p&gt;Here’s the result of my first attempt:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/SWW4YpS6fAI/AAAAAAAAAHI/BtHVbLdTEAM/s1600-h/DSC03172%5B3%5D.jpg"&gt;&lt;img title="Yikes, how not to fibreglass" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="Yikes, how not to fibreglass" src="http://lh5.ggpht.com/_cWvIIiKNA4g/SWW4cb6y3bI/AAAAAAAAAHM/ADxFP78XdQQ/DSC03172_thumb%5B1%5D.jpg?imgmax=800" width="364" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Compare that with this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_cWvIIiKNA4g/SWW4ezTNHGI/AAAAAAAAAHQ/H7ydncsiPuc/s1600-h/DSC03198%5B3%5D.jpg"&gt;&lt;img title="Wow, my fibreglassing is just sooo much better than my first attempt!" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="Wow, my fibreglassing is just sooo much better than my first attempt!" src="http://lh6.ggpht.com/_cWvIIiKNA4g/SWW4h4OtzAI/AAAAAAAAAHU/Xj5Odrzdnjo/DSC03198_thumb%5B1%5D.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7416237588651722830?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7416237588651722830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7416237588651722830&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7416237588651722830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7416237588651722830'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/01/s-night-heron-build-notes-fibreglassing.html' title='S&amp;amp;G Night Heron Build Notes – Fibreglassing'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/SWW4cb6y3bI/AAAAAAAAAHM/ADxFP78XdQQ/s72-c/DSC03172_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1884416912574991348</id><published>2009-01-08T21:05:00.001+13:00</published><updated>2009-01-08T21:05:18.268+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>S&amp;G Night Heron Build Notes – Attaching the Panels</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;This was an interesting exercise. Handling the long hull panels is a difficult task and getting them to fit well is not trivial.&lt;/p&gt;  &lt;p&gt;There were a few lessons here.&lt;/p&gt;  &lt;h2&gt;Alignment&lt;/h2&gt;  &lt;p&gt;Firstly, get a properly flat work surface to ensure the stations are positioned correctly.&lt;/p&gt;  &lt;p&gt;Use a pencil to mark out a long straight edge down one side of the flat surface and mark out the perpendicular lines where the stations should sit.&lt;/p&gt;  &lt;p&gt;In the S&amp;amp;G Night Heron instructions Nick suggests holding the stations vertical using a couple of quick clamps. I found that was painful as they’d move out of place whenever I pushed the kayak eg trying to knock an edge off; sand a bump off an edge or generally just touch it...&lt;/p&gt;  &lt;p&gt;Instead, lock the stations into place using some scrap wood that’s wide enough to clamp securely into place. In the photo below you can see the deck on the stations and how they’re clamped to the table. (I wish I’d done this while building the hull:))&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SWWzeEtf4DI/AAAAAAAAAGo/TWs0oy-j7mw/s1600-h/DSC031903.jpg"&gt;&lt;img title="Issues somewhat resolved, time to glue it up." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Issues somewhat resolved, time to glue it up." src="http://lh3.ggpht.com/_cWvIIiKNA4g/SWWzg8YKy8I/AAAAAAAAAGs/zknAwnA7apk/DSC03190_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Bevelling&lt;/h2&gt;  &lt;p&gt;Next thing to remember is, bevel to the edge. Assuming you’ve cut the panels correctly this should ensure your boat stitches up as it is supposed to. Compare figure A to figure B… I naively would’ve thought that B was preferred to keep all fillets on the inside of the kayak, however, &lt;a href="http://www.clcboats.com/shoptips/stitch_glue/round_edges.html"&gt;this&lt;/a&gt; might lead you to think differently.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SWWzkUmebcI/AAAAAAAAAGw/b_DYMQbvD3w/s1600-h/bevelandstationimpact3.png"&gt;&lt;img title="bevel and station impact" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="470" alt="bevel and station impact" src="http://lh3.ggpht.com/_cWvIIiKNA4g/SWWznCYNa-I/AAAAAAAAAG0/35l13bCbCNw/bevelandstationimpact_thumb1.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Nick Schade’s instructions said to bevel so I worked on the idea it was figure B. Checking a station plan against the hull bottom confirms this, so, yes, you need to bevel completely to the outer edge (but not beyond). &lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SWWzpV0hl8I/AAAAAAAAAG4/mpXiW7-PEeY/s1600-h/00112.jpg"&gt;&lt;img title="001" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="446" alt="001" src="http://lh4.ggpht.com/_cWvIIiKNA4g/SWWzrF9qrdI/AAAAAAAAAG8/Kph9FftcSsc/001_thumb16.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The best way to ensure you don’t overdo it is to bevel most of the way with a plane or sanding block; loosely tie the panels together; then run a bit of sandpaper up and down the join until the panels close up together. Check the picture below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_cWvIIiKNA4g/SWWzslL8c7I/AAAAAAAAAHA/hEHLoiZ4bJI/s1600-h/DSC031863.jpg"&gt;&lt;img title="How to get that bevel right. Run a bit of sandpaper up and down the connecting sheets to close up the gap." style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="How to get that bevel right. Run a bit of sandpaper up and down the connecting sheets to close up the gap." src="http://lh6.ggpht.com/_cWvIIiKNA4g/SWWzupa-I0I/AAAAAAAAAHE/BUsooRPh7uU/DSC03186_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Stitching&lt;/h2&gt;  &lt;p&gt;What sort of wire do you use??? I tried copper wire and galvanised steel tie wire. The tie wire worked fine. After reading various messages on the different kayak building boards on the net I was quite confused about what to use. Once you try it you realise you can use just about anything. The important this is that you’ve cut the panels correctly and there is a consistent internal bevel.&lt;/p&gt;  &lt;h2&gt;Gluing&lt;/h2&gt;  &lt;p&gt;I found this a bit confusing. Do you use plain epoxy or do you add an adhesive additive like West Systems 403. My current take on it is this: quickly wipe over plain epoxy because it will soak into the wood easily; then add a bit of the adhesive additive (made up of microfibres and colloidal silica I believe) and paint into the joint. You only want a minimal amount to actually glue the joint together. Don’t worry about forming a fillet during gluing.&lt;/p&gt;  &lt;p&gt;If you have trouble removing stitches after the glue has set I found that the commonly repeated advice to use a soldering iron works great.&lt;/p&gt;  &lt;h2&gt;Filleting&lt;/h2&gt;  &lt;p&gt;For the filleting I used a lightweight filler (from Epiglass I think) and masking tape. Masking tape is great.&lt;/p&gt;  &lt;p&gt;I tried lots of methods to apply the fillets: a plastic spoon worked great, a wooden stirring stick shaped like a doctor’s tongue depressor worked great and I think I could easily have cut any bit of plastic to a round shape to form an applicator. So all in all, it wasn’t very hard.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1884416912574991348?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1884416912574991348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1884416912574991348&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1884416912574991348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1884416912574991348'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/01/s-night-heron-build-notes-attaching.html' title='S&amp;amp;G Night Heron Build Notes – Attaching the Panels'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_cWvIIiKNA4g/SWWzg8YKy8I/AAAAAAAAAGs/zknAwnA7apk/s72-c/DSC03190_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7684828193775608435</id><published>2009-01-05T22:11:00.001+13:00</published><updated>2009-01-05T22:11:24.038+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Stitch and Glue Night Heron Build Notes – Cutting the Panels</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;There are a few important points here which I learn’t from the process.&lt;/p&gt;  &lt;h2&gt;Scarfing. &lt;/h2&gt;  &lt;p&gt;I used the jig described in the &lt;a href="http://oneoceankayaks.com/Shop.htm#plydex"&gt;One Ocean Kayaking building manual&lt;/a&gt;. It worked but my implementation of the jig wasn’t that great. In retrospect I think I might in future either do it by hand using a sharp plane, or use a router jig I’ve seen on the Kayak Forum.&lt;/p&gt;  &lt;p&gt;Holding onto a circular saw and ensuring it cuts cleanly and evenly across the ply requires a fair bit of attention and a good horizontal guide with a clean, straight edge. The first piece I used was too thin and had a slight waiver in the middle. Better to make it nice and wide so it remains a true straight edge. &lt;/p&gt;  &lt;p&gt;The ply sheets are thin with external veneers and an internal core; the saw is rough, so use a bit of waste material as the bottom and top layers. I ended up with the top and bottom sheets having some tatty edges (because of course I didn’t use the waste material top and bottom).&lt;/p&gt;  &lt;p&gt;Clamp or weigh down the center of the sheets otherwise the middle has a habit of lifting.&lt;/p&gt;  &lt;p&gt;Finally, check before you’ve finshed that the scarf is accurately square to the long edge of ply. Use a large builders square. If I had I would’ve seen I had a waiver in the middle of my scarfs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_cWvIIiKNA4g/SWHOosGHczI/AAAAAAAAAGY/hu5L71yI0GU/s1600-h/0043.jpg"&gt;&lt;img title="Plywood scarfs with an unfortunate wobble in the middle" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Plywood scarfs with an unfortunate wobble in the middle" src="http://lh5.ggpht.com/_cWvIIiKNA4g/SWHOqZAy0BI/AAAAAAAAAGc/bJ0zb_LyA6c/004_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Scarf Gluing&lt;/h2&gt;  &lt;p&gt;This would’ve been a whole lot easier if I didn’t have that waiver in the scarf!&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Having said that, the output hasn’t been that bad. There was some badly overlapping ply, and I really should have taken more time with the weighting down of the joint, and actually, in retrospect I went too light with the epoxy, but in the end it appears to have worked fine.&lt;/p&gt;  &lt;p&gt;Just one note on the use of the epoxy. This was the first time I’d used the epoxy and if there’s one lesson with doing anything new – it’s give yourself time and opportunity to learn from your errors. I’ve tried a few different methods of application in the last 2 weeks and my current favourite is the nylon brush topped foam pads that are sold in the hardware stores as speed brushes. I can buy the pads for just a few dollars and they stick onto a plastic holder which, at least for me, is easier to work with than a roller.&lt;/p&gt;  &lt;p&gt;I think the best approach is to mix up some epoxy, run a quick line of it up and down the scarf edges to allow it to soak in; then add an adhesive filler, give it a swirl and apply it to the edges before joining. This will help fill voids better than just epoxy itself.&lt;/p&gt;  &lt;h2&gt;Cutting the Panels&lt;/h2&gt;  &lt;p&gt;First discovery: positioning the paper patterns on the ply with spray on glue was a breeze. I was worried that I’d permanently stick the patterns on but it was surprisingly easy to apply a thin coat that would allow me to reposition a pattern. Having said that, I did end up using a couple of different spray glue brands. The 3M glue seemed to be far better to use.&lt;/p&gt;  &lt;p&gt;I also used a string line for the main pattern that included the hull pieces. This is such a long paper pattern that I wanted to be sure that a center line drawn on the pattern actually ran straight down the table. Getting this wrong would be annoying as you’re cutting through two ply panels not just one.&lt;/p&gt;  &lt;p&gt;I drilled the tie wire holes next and put little bits of wire in the lot of them to keep the panels from moving; then just for overkill I decided I’d hot glue round the edges of the two panels. I used a sharp hobby knife to cut round the pattern edges – surprisingly easy to do. Then I used a jigsaw to cut out each piece. The jig saw did a good job (I think) but the best method appeared to be to stay a mm or two away and use a block plane or sanding block to finish. That gave a very good finish. Just to give myself time to improve I purposefully cut the stations first.&lt;/p&gt;  &lt;p&gt;Since cutting the main panels I’ve actually moved to using a fine point panel saw. It’s just less noisy, less dusty and more accurate for the straighter lines.&lt;/p&gt;  &lt;p&gt;Lifting the cut pieces was alarming, They wobble a lot and by experimenting with offcuts I could tell the scarf joints could break at the point the ply starts to thin. There was often no epoxy at that point and when combined with a thinning (or complete lack) of external veneer, the ply was substantially weakened. My advice: don’t go too light on the epoxy round the scarf joint, and make sure in the positioning of the pieces that the inner ply layer isn’t left substantially exposed anywhere along the joint.&lt;/p&gt;  &lt;p&gt;If you do get a dodgy joint just try a wood backing block. In the case of the photograph below I’d been a bit aggressive and planning away some badly overlapping ply on a scarf. The result was a weak point so I then thinned a piece of scrap ply down and glued that onto the joint. I later sanded this down so just a thin veneer was left covering the low points. It appears to have fixed my problem nicely. (Note that I decided to put a thin epoxy coat on panels but at the time I took the photo I hadn’t epoxied under the clamp.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_cWvIIiKNA4g/SWHOr8LEG3I/AAAAAAAAAGg/MgvC_gvUk3k/s1600-h/0213.jpg"&gt;&lt;img title="Backing block for a weak scarf" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="Backing block for a weak scarf" src="http://lh5.ggpht.com/_cWvIIiKNA4g/SWHOuZOuACI/AAAAAAAAAGk/NsyVGSV7zTs/021_thumb1.jpg?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7684828193775608435?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7684828193775608435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7684828193775608435&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7684828193775608435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7684828193775608435'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/01/stitch-and-glue-night-heron-build-notes.html' title='Stitch and Glue Night Heron Build Notes – Cutting the Panels'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_cWvIIiKNA4g/SWHOqZAy0BI/AAAAAAAAAGc/bJ0zb_LyA6c/s72-c/004_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1796050471165847193</id><published>2009-01-05T21:48:00.003+13:00</published><updated>2009-01-05T21:58:38.707+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Stitch and Glue Night Heron</title><content type='html'>&lt;p&gt;Over recent weeks I’ve been building a &lt;a href="http://www.guillemot-kayaks.com/guillemot/SGNH"&gt;stitch and glue Night Heron&lt;/a&gt; kayak designed by &lt;a href="http://www.guillemotkayaks.com/guillemot/About"&gt;Nick Schade&lt;/a&gt; from &lt;a href="http://www.guillemotkayaks.com/"&gt;Guillemot Kayaks&lt;/a&gt;. There’s a lot I’ve learnt along the way so I thought it useful to post up some notes on the blog. &lt;/p&gt;&lt;p&gt;As a quick background to the project, the Night Heron family of kayaks are 5.5m ocean going sea kayaks available in plywood hard chin form or strip form. Check out the web site as there’s a lot more information there. Of special use when building is the &lt;a href="http://www.kayakforum.com/cgi-bin/Building/index.cgi"&gt;Kayak Building Bulletin Board&lt;/a&gt; hosted by Guillemot. This is a great resource.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1796050471165847193?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1796050471165847193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1796050471165847193&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1796050471165847193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1796050471165847193'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2009/01/stitch-and-glue-night-heron.html' title='Stitch and Glue Night Heron'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1497010303431352781</id><published>2008-07-20T20:12:00.001+12:00</published><updated>2008-07-20T20:12:27.236+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><title type='text'>Dr Joe Trodahl on Radio NZ with Veronika Meduna</title><content type='html'>&lt;p&gt;Here’s a voice from the past, my old thesis supervisor at Victoria University, Joe Trodahl on Radio NZ speaking about new materials that combine ferroelectric and ferromagnetic properties. Joe’s got a great accent with that wonderful Alaskan sound. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.radionz.co.nz/audio/national/ocw/2008/07/17/new_materials" href="http://www.radionz.co.nz/audio/national/ocw/2008/07/17/new_materials"&gt;http://www.radionz.co.nz/audio/national/ocw/2008/07/17/new_materials&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/17672034-1497010303431352781?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1497010303431352781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1497010303431352781&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1497010303431352781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1497010303431352781'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/dr-joe-trodahl-on-radio-nz-with.html' title='Dr Joe Trodahl on Radio NZ with Veronika Meduna'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-880680243945224346</id><published>2008-07-15T12:48:00.002+12:00</published><updated>2008-07-15T12:49:22.530+12:00</updated><title type='text'>Label Cloud in Blogger</title><content type='html'>Great, just found how to do it. Seems to work fine with Blogger labels. Go to &lt;a href="http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html"&gt;http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-880680243945224346?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/880680243945224346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=880680243945224346&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/880680243945224346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/880680243945224346'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/label-cloud-in-blogger.html' title='Label Cloud in Blogger'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1709125269676551587</id><published>2008-07-14T17:34:00.003+12:00</published><updated>2008-07-16T12:27:45.742+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>More Adventures with  Innovation Blogging</title><content type='html'>&lt;p&gt;So, as I reported recently I’ve been working on an internal blog to report the clever stuff we do in the IT shared service line within the corporate where I work. The reason behind doing it is of course to raise awareness of the great stuff I see the broader team delivering each week. This might be grass roots incremental or possibly (hopefully!) ground breaking and disruptive.&lt;/p&gt;&lt;p&gt;Now I’m getting blog postings, I’ve managed to deliver a KPI on the Sharepoint list hosting the blog, I’ve worked through how to create a chart to make progress through the year obvious, but now I want to get a summary of the blog postings on pages elsewhere in the Sharepoint server.&lt;/p&gt;&lt;p&gt;Unfortunately, while I have a large team of developers, the reality is they’re all fully busy so I’ve had to work through this problem myself.&lt;/p&gt;&lt;p&gt;Here’s some guidance for others doing the same. First off quick note to say I was surprised at how hard it was. Still, I’ve got there.&lt;/p&gt;&lt;p&gt;So, to get the blog posts and re-display them elsewhere I used Sharepoint Designer. This gives you the ability to place a DataView in a webpart on any page. It turns out the DataView is the Swiss Army knife of Sharepoint programming (at least when you’re using Sharepoint Designer). This control allows you perform an XSL transform on a data source and display the results. The query is represented using CAML and the best reference to help me with my problem was a &lt;a href="http://blogs.msdn.com/sharepointdesigner/archive/2008/02/25/filtering-and-formatting-with-date-values.aspx#filter_list_on_today_offset"&gt;posting on the Sharepoint Designer blog&lt;/a&gt;. Look for the entry on the CAML query. My select command turned out like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;selectcommand="&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;View&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Query&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;OrderBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;='PublishedDate'&lt;/span&gt; &lt;span class="attr"&gt;Ascending&lt;/span&gt;&lt;span class="kwrd"&gt;='FALSE'&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;OrderBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Geq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;='PublishedDate'&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;='DateTime'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Today&lt;/span&gt; &lt;span class="attr"&gt;OffsetDays&lt;/span&gt;&lt;span class="kwrd"&gt;='-30'&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Geq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Query&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;View&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;"&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The next problem is formatting the output. If you don’t format the output you’ll get HTML tags that will disrupt the rest of the page.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So, in the end I did something like the following. Note that I used some XSL to remove the markup where it occurred. I got that from &lt;a title="http://blogs.pointbridge.com/Blogs/morse_matt/Pages/Post.aspx?_ID=" href="http://blogs.pointbridge.com/Blogs/morse_matt/Pages/Post.aspx?_ID=37"&gt;http://blogs.pointbridge.com/Blogs/morse_matt/Pages/Post.aspx?_ID=37&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solidfont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:template&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="RemoveHtmlTags"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:param&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="html"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:when&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="contains($html, '&amp;amp;lt;')"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="substring-before($html, '&amp;amp;lt;')"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;            &lt;span style="color:#008000;"&gt;&amp;lt;!-- Recurse through HTML --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:call-template&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="RemoveHtmlTags"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;              &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:with-param&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="html"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="substring-after($html, '&amp;amp;gt;')"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:call-template&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:when&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="$html"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:template&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="dvt_1.rowview"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:variable&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="pureTextBody"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:call-template&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="RemoveHtmlTags"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:with-param&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="html"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="substring(@Body,0,250)"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:call-template&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="position() mod 2 = 1"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:attribute&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="class"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;ms-alternating&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:if&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;test&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="$dvt_1_automode = '1'"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ddwrt:cf_ignore&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ms-vb"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="1%"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;nowrap&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="nowrap"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;span&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ddwrt:amkeyfield&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ID"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ddwrt:amkeyvalue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ddwrt:EscapeDelims(string(@ID))"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ddwrt:ammode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="view"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;span&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:if&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ms-vb"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="/CleverStuff/Lists/Posts/Post.aspx?ID={@ID}"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="@Title"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ms-vb"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ddwrt:FormatDate(string(@PublishedDate), 1033, 5)"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ms-vb"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:value-of&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;select&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="$pureTextBody"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;disable-output-escaping&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="yes"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt; l:stylesheet&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, I still have a problem. I’m getting an error message at the bottom of the (successfully) displayed list. The message is “&lt;em&gt;An error occurred processing the data view. The XslText property is empty.”&lt;/em&gt;. Any ideas???? &lt;a href="http://support.microsoft.com/kb/830974"&gt;This Microsoft KB article&lt;/a&gt; has some information but it’s for Sharepoint 2003.  I might have to get one of the dev team onto it:)&lt;/p&gt;&lt;p&gt;Update: 16 July&lt;/p&gt;&lt;p&gt;Doh! Figured the problem out - I had an extra DataView webpartzone inserted. I think this is an outcome of the sluggish performance of Sharepoint Designer. You tend to click too many times when you're inserting controls...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1709125269676551587?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1709125269676551587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1709125269676551587&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1709125269676551587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1709125269676551587'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/more-adventures-with-innovation.html' title='More Adventures with  Innovation Blogging'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3444195871028447980</id><published>2008-07-09T21:37:00.001+12:00</published><updated>2008-07-09T21:37:51.822+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint'/><title type='text'>Update on the List Activity Viewer</title><content type='html'>&lt;p&gt;Just a quick note regarding deployment of the activity &lt;a href="http://bohdanszymanik.blogspot.com/2008/07/graphing-sharepoint-list-activity.html"&gt;grapher&lt;/a&gt; I described last week. This is now deployed and working a treat but I did have a minor problem getting it going. Turns out our current production implementation of sharepoing isn’t using the delegation model for Excel Services security. Instead we’re using the trusted subsystem approach (typical for a farm). In this instance to get the UDF going I just needed to remove the impersonation I was using for my dev/test environment. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3444195871028447980?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3444195871028447980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3444195871028447980&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3444195871028447980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3444195871028447980'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/update-on-list-activity-viewer.html' title='Update on the List Activity Viewer'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8778818878409619772</id><published>2008-07-04T21:30:00.001+12:00</published><updated>2008-07-04T21:30:31.513+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>Great Day</title><content type='html'>&lt;p&gt;What a great day! A month ago almost exactly, I spoke at the FSI Media Technology and Innovation Conference and mentioned the importance of internal selling in a corporate. As an example of the opportunities we often miss I mentioned that I have a development team sitting in an open plan pod next to the CEOs pod (a remarkable fact in itself for a corporate of our size!). David, the team lead, had recently shown me his real time graphs of call centre activity displayed using Microsoft’s new WPF technology. They looked fantastic and the obvious thought was to maximise the impact by making available a big screen that ensured CEO, GMs all and sundry could see the impressive output from these monitoring programs. All I had to do was make a big screen available.&lt;/p&gt;  &lt;p&gt;Well, it took a month but finally we got a 40” screen up there and yes, they had the desired impact. Before leaving work today we had a cluster of people ranging from analysts through our EXT team admiring the graphs and watching them turn from green to red and back as the metrics progressively changed in real time.&lt;/p&gt;  &lt;p&gt;Success and many thanks to David!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8778818878409619772?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8778818878409619772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8778818878409619772&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8778818878409619772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8778818878409619772'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/great-day.html' title='Great Day'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6149422202846627736</id><published>2008-07-01T23:11:00.004+12:00</published><updated>2008-07-02T13:21:34.587+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>Graphing Sharepoint List Activity</title><content type='html'>&lt;p&gt;Here’s an interesting challenge that I’ve had over the last few days. At work we’re beginning to use sharepoint (MOSS/WSS) more and more as a tool within our office environment. It’s used for document/record management; it’s used for team workplaces; it’s used for hosting business processes; heck, it’s used for all sorts of things. In my case I’ve been using it lately to track the innovative ideas and deliverables that our IT shared service line are coming up with. I bug them for their clever stuff and either they post an entry into a blog, or I do it for them.&lt;/p&gt;&lt;p&gt;Now, here’s the problem. The blog looks great and I have a KPI web part showing blog items submitted over the last 2 weeks. I even have separate KPIs for different team’s submissions (identified by the category of the blog post), but what I really wanted was a graph of activity over the weeks. Do you think this would be easy? Well no!&lt;/p&gt;&lt;p&gt;You can easily add a web part to show an Excel report using Excel Services at the top of the blog. You can access sharepoint list data in an Excel workbook. The tricky part is that when you go to publish it into Excel Services you find an error message saying that retrieving data from sharepoint lists isn’t supported yet! A search on the net tells you that you need to create a UDF. I read somewhere that Excel Services is a ‘version 1’ product and apparently it doesn’t support everything you’d expect. Hmm, consuming a sharepoint list was one thing I definitely was expecting Excel Services to be capable of doing. Nevermind…&lt;/p&gt;&lt;p&gt;OK - back on track, so there is some sample code out there (eg check &lt;a href="http://msdn.microsoft.com/en-us/library/bb267252.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb267252.aspx&lt;/a&gt;) but explanations are fairly limited. So here’s a quick run down of what I’ve managed to do.&lt;/p&gt;&lt;p&gt;Firstly, borrow someone else’s code (eg from the link above):) Then iterate through items in the sharepoint list and accumulate across a number of previous week counters (or maybe put into a collection and try using linq?) eg:&lt;/p&gt;&lt;div style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solidfont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// Create an object array to return to Excel and initialise values&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; toExcel = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[weekCount, 2];&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; weekCount; i++)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     toExcel[i, 0] = i;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     toExcel[i, 1] = 0;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// two approaches to try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// 1: iterate through all list items and increment week activity counters when in range; or&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// 2: use linq&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; CultureInfo ci = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CultureInfo(CultureInfo.CurrentCulture.Name, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; thisWeek = ci.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// Iterate through SPListItems in the view.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPListItem currVal &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// get created date field&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// !** might need to set DateTimeFormatInfo appropriately &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// use Calendar.GetWeekOfYear (from System.Globalization) to determine difference in weeks from today&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// or perhaps SPIntlCal.GetWeekNumber from Microsoft.Sharepoint.Utilities&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;     SPField field = currVal.Fields.GetFieldByInternalName(&lt;span style="color:#006080;"&gt;"Created"&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;     DateTime created = DateTime.Parse(field.GetFieldValueAsText(currVal[field.Id]));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// find week number for today&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// then find week number of list item&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// subtract and accumalate appropriate counter&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// if week difference &amp;lt; max number of weeks previous&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; createdWeek = ci.Calendar.GetWeekOfYear(created, CalendarWeekRule.FirstDay, DayOfWeek.Monday);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; weeksPast = thisWeek-createdWeek;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (weeksPast &amp;lt; weekCount)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;         toExcel[weeksPast, 1] = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)toExcel[weeksPast, 1] + 1;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;     {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// must be the first few weeks of a new year&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;"   &gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-: nonefont-family:consolas, 'Courier New', courier, monospace;font-size:8pt;color:white;"   &gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Then return to Excel, generate the chart and post back into Excel Services so you get something like the screenshot below (all test data of course).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/bohdan.szymanik/SGoQ3S8OJNI/AAAAAAAAAEI/jVptTUqQpUw/s1600-h/image%5B4%5D.png"&gt;&lt;img title="image" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="480" alt="image" src="http://lh4.ggpht.com/bohdan.szymanik/SGoQ4eLIdaI/AAAAAAAAAEM/dV_399XQd5g/image_thumb%5B2%5D.png?imgmax=800" width="628" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In this case there were 8 posts in the previous week, 1 post in the current week, and none going back 2 weeks. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One thing to keep in mind with the code I put up above – I didn’t put in any logic to handle week intervals around the change of one year to another – in this instance I think you’ll need to add 52. You can grab some sample code from my public skydrive folder: &lt;a title="ListActivityInWeeks.zip-download" href="http://cid-0e5ff53cd7f11485.skydrive.live.com/self.aspx/Public/ListActivityInWeeks.zip"&gt;ListActivityInWeeks.zip-download&lt;/a&gt;. Suggestion: grab a copy of Cum Grano Sails Professional Excel Services book.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Update 2 July 08: Code changed slightly from snippet above - check download for difference - basically just to add 52 if week difference goes negative...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6149422202846627736?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6149422202846627736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6149422202846627736&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6149422202846627736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6149422202846627736'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/07/graphing-sharepoint-list-activity.html' title='Graphing Sharepoint List Activity'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/bohdan.szymanik/SGoQ4eLIdaI/AAAAAAAAAEM/dV_399XQd5g/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8045139871826646184</id><published>2008-06-14T22:40:00.002+12:00</published><updated>2008-07-02T13:22:18.760+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kayaking'/><title type='text'>Kayak Strongback Option 2</title><content type='html'>Just seen in a recent mailer from Bunnings - 4m aluminium planks for around the $NZ150 mark. Surely this would provide a good rigid base for building a kayak.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8045139871826646184?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8045139871826646184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8045139871826646184&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8045139871826646184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8045139871826646184'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/06/kayak-strongback-option-2.html' title='Kayak Strongback Option 2'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3532083855217645185</id><published>2008-06-11T20:44:00.002+12:00</published><updated>2008-06-14T22:38:55.489+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unusual'/><title type='text'>What Are The Odds?</title><content type='html'>You go walking along the Wellington waterfront and... end up on the 6 o'clock news on TV.&lt;br /&gt;&lt;br /&gt;Apparently not so low. Check the last interviewee on &lt;a href="http://tvnz.co.nz/view/video_popup_windows_skin/1842042"&gt;http://tvnz.co.nz/view/video_popup_windows_skin/1842042&lt;/a&gt; . Ah yes, that's me. Now I must admit this is at least my second performance on the biggish screen. I remember my primary school class being used as in the opening to Nice One Stu - a popular 1970s, kids after school TV programme in NZ.&lt;br /&gt;&lt;br /&gt;Fortunately I suspect the video clip will be archived fairly soon. But it's good to know that in little 'ol NZ it's not that hard to end up in the media:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3532083855217645185?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3532083855217645185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3532083855217645185&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3532083855217645185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3532083855217645185'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/06/what-are-odds.html' title='What Are The Odds?'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7240781322008785070</id><published>2008-06-06T22:34:00.002+12:00</published><updated>2008-06-09T15:54:05.735+12:00</updated><title type='text'>Kayak Strongback Spacing Planner</title><content type='html'>&lt;p&gt;Now getting away from banking, and remembering that I’ve kept my blog as a personal blog first and foremost, here’s an article (hopefully the first of many) on the building of (hopefully) 3 kayaks. &lt;/p&gt;  &lt;p&gt;For some time now I’ve been prepping myself for the construction of a fibreglass composite kayak and finally I feel I’m underway! The basic process is to construct a sandwich core with a wood (or other) substrate used to create the form for the kayak with fibreglass on each side providing tensile strength on the inside and abrasion resistance on the outside. &lt;/p&gt;  &lt;p&gt;There are two common methods for creating the sandwich core: stitch and glue plywood; and wood strip. I’m starting off with stitch and glue plywood but I have it firmly in mind to go on and create 2 more strip form kayaks. Wife and daughter will surely be bemused as I gift them their own high performance kayak... &lt;/p&gt;  &lt;p&gt;The initial kayak is a &lt;a href="http://www.guillemot-kayaks.com/guillemot/NHFamily"&gt;Night Heron&lt;/a&gt; from &lt;a href="http://www.guillemot-kayaks.com/guillemot/blog/nick"&gt;Nick Schade&lt;/a&gt; at &lt;a href="http://www.guillemot-kayaks.com/guillemot/"&gt;Guillemot kayaks&lt;/a&gt;. Check the web site and especially the message board he administers. This is an invaluable resource. Once that is done I’ve got my eye on &lt;a href="http://www.blueheronkayaks.com/"&gt;Ross Leidy’s&lt;/a&gt; &lt;a href="http://www.blueheronkayaks.com/kayak/whiptail/index.htm"&gt;Whiptail&lt;/a&gt;, and one of &lt;a href="http://www.thomassondesign.com/"&gt;Bjorn Thomasson’s&lt;/a&gt; kayaks in particular the &lt;a href="http://www.thomassondesign.com/entry.aspx?id=114"&gt;Njord&lt;/a&gt;, &lt;a href="http://www.thomassondesign.com/entry.aspx?id=128"&gt;Hunter&lt;/a&gt; or maybe &lt;a href="http://www.thomassondesign.com/entry.aspx?id=124"&gt;Isfjord&lt;/a&gt;. No special reason apart from the fact that they just all look so HOT! &lt;/p&gt;  &lt;p&gt;So, what about the strongback spacing planner you ask!? Well, when you build your sandwich core form you need a rigid straight guide. This is the strongback and you can create it in a variety of ways. (And no, I don’t need one for the stitch and glue Night Heron but it should make a good flat surface for construction and will suit my needs for the later kayaks.) &lt;/p&gt;  &lt;p&gt;The thing is how you go about creating a strongback. I’m very keen on the approach taken by &lt;a href="http://www.thomassondesign.com/slide.aspx?id=229"&gt;Bjorn Thomasson&lt;/a&gt; and &lt;a href="http://clearstreamwood.com/WordPress/?p=9"&gt;Dan Caouette&lt;/a&gt; but in building one for myself I used (like Dan) doubled up plywood sheet strips (although in my case I went 150mm wide). The problem is when I went to bend them they seemed in a lot of stress and I wasn’t sure how to even that curvature stress out over the full length. Well, this is where a bit of geometry came in useful and I thought it was worth reporting out for others. &lt;/p&gt;  &lt;p&gt;First a diagram; let’s use H to represent the length from the centre to the long end of the strongback, W the distance from the centre to the edge at the widest point (ie half the width), r to represent the radius of the circles that would make up the two sides of the strongback, and h and w to represent the distance up and across at an arbitrary point on the strongback. &lt;/p&gt;  &lt;div&gt;&lt;a href="http://lh5.ggpht.com/bohdan.szymanik/SEkSiWQ25aI/AAAAAAAAADY/7HEBbEiFK00/s1600-h/Strongback%20drawing%5B4%5D.png"&gt;&lt;img title="Strongback drawing" style="border: 0px none ;" alt="Strongback drawing" src="http://lh4.ggpht.com/bohdan.szymanik/SEkSkGQ25bI/AAAAAAAAADc/tQinWSchrXw/Strongback%20drawing_thumb%5B2%5D.png?imgmax=800" width="708" border="0" height="477" /&gt;&lt;/a&gt; &lt;/div&gt;  &lt;p&gt;How do you get the radius of the circles? Easy thanks to Pythagoras.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/bohdan.szymanik/SEkSlGQ25cI/AAAAAAAAADg/f-DCeDBeDn4/s1600-h/eq1%5B4%5D.png"&gt;&lt;img title="eq1" style="border: 0px none ;" alt="eq1" src="http://lh4.ggpht.com/bohdan.szymanik/SEkSmGQ25dI/AAAAAAAAADk/gcefQJ8Ygq0/eq1_thumb%5B2%5D.png?imgmax=800" width="154" border="0" height="38" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, solve for r to get:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/bohdan.szymanik/SEkSm2Q25eI/AAAAAAAAADo/kG8srR8az4c/s1600-h/eq2%5B4%5D.png"&gt;&lt;img title="eq2" style="border: 0px none ;" alt="eq2" src="http://lh4.ggpht.com/bohdan.szymanik/SEkSoGQ25fI/AAAAAAAAADs/UStyNH6DRy0/eq2_thumb%5B2%5D.png?imgmax=800" width="139" border="0" height="50" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Question is now how to get the width at some arbitrary distance along the centreline of the strongback. No worries,&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/bohdan.szymanik/SEkSomQ25gI/AAAAAAAAADw/Vgwbl36MLeQ/s1600-h/eq3%5B4%5D.png"&gt;&lt;img title="eq3" style="border: 0px none ;" alt="eq3" src="http://lh6.ggpht.com/bohdan.szymanik/SEkSpmQ25hI/AAAAAAAAAD0/bO11vXqNDqA/eq3_thumb%5B2%5D.png?imgmax=800" width="182" border="0" height="35" /&gt;&lt;/a&gt;  &lt;/p&gt;  &lt;p&gt;This time we want to solve for w.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/bohdan.szymanik/SEkSqmQ25iI/AAAAAAAAAD4/TPc3JZP1t1I/s1600-h/eq4%5B4%5D.png"&gt;&lt;img title="eq4" style="border: 0px none ;" alt="eq4" src="http://lh4.ggpht.com/bohdan.szymanik/SEkSuGQ25jI/AAAAAAAAAD8/ahbBkk9RJHM/eq4_thumb%5B2%5D.png?imgmax=800" width="182" border="0" height="36" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And remember that the width at distance h from the centre is 2w.&lt;/p&gt;  &lt;p&gt;Using Excel for my case where I wanted the total length to be 5.00m with greatest width 0.6m I get a table such as this.&lt;/p&gt;  &lt;table width="400" border="0" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;strong&gt;Overall Length&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;strong&gt;Greatest Width&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;strong&gt;Circle Radius&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;strong&gt;Offset from Centre&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;strong&gt;Width&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;5.00&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.60&lt;/td&gt;        &lt;td valign="top" width="80"&gt;10.57&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.00&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.60&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.50&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.58&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;1.00&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.51&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;1.50&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.39&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;2.00&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.22&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="80"&gt;2.50&lt;/td&gt;        &lt;td valign="top" width="80"&gt;0.00&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Applying this to my sample kayak strongback gives me the following drawing.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/bohdan.szymanik/SEkSu2Q25kI/AAAAAAAAAEA/2phxGfCLKDE/s1600-h/Strongback%20schematic%5B5%5D.png"&gt;&lt;img title="Strongback schematic" style="border: 0px none ;" alt="Strongback schematic" src="http://lh4.ggpht.com/bohdan.szymanik/SEkSwGQ25lI/AAAAAAAAAEE/us3xEYoq1VI/Strongback%20schematic_thumb%5B3%5D.png?imgmax=800" width="302" border="0" height="480" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;br /&gt;&lt;p&gt;Update: 9th June 2008: Thanks to the wizardry of Google Docs you can view a spreadsheet: &lt;/p&gt;&lt;p lang="x-none"&gt;&lt;a href="http://spreadsheets.google.com/pub?key=pYTbzqIDg8t4ncGmXY2EBIw"&gt;http://spreadsheets.google.com/pub?key=pYTbzqIDg8t4ncGmXY2EBIw&lt;/a&gt;&lt;/p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Or just view the graph here:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;  &lt;/p&gt; &lt;img src="http://spreadsheets.google.com/pub?key=pYTbzqIDg8t4ncGmXY2EBIw&amp;oid=5&amp;output=image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7240781322008785070?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7240781322008785070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7240781322008785070&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7240781322008785070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7240781322008785070'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/06/kayak-strongback-spacing-planner_06.html' title='Kayak Strongback Spacing Planner'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/bohdan.szymanik/SEkSkGQ25bI/AAAAAAAAADc/tQinWSchrXw/s72-c/Strongback%20drawing_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5099326563607875676</id><published>2008-06-05T09:32:00.006+12:00</published><updated>2008-06-14T22:39:32.329+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Future of Banking Conference</title><content type='html'>Or more accurately titled &lt;a href="http://www.fst.net.au/agenda.aspx?confid=7"&gt;the 2nd Annual Technology and Innovation Conference - The Future of Banking and Financial Services&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Crikey, bit of a mouthful.&lt;br /&gt;&lt;br /&gt;I attended this yesterday and spoke briefly just before lunch. Briefer than intended unfortunately because of the length of the previous presentation. Still, I finished on time and had a ball!&lt;br /&gt;&lt;br /&gt;Main messages and comments:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The role of IT, knowing why you're there: operations plus business transformation. Understanding just why you're so critically a part of the business whenever change is necessary, especially disruptive change.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The need to sell and market internally. No innovation will get anywhere when you're not selling it. Just as a quick aside, I noted this come up a day ago in a post from &lt;a href="http://bankervision.typepad.com/bankervision/2008/06/innovation-not-cool-enough-in-banks.html"&gt;James Gardner on BankerVision&lt;/a&gt;. It is hard but you *can* innovate in banks; just understand that the selling will be a great part of the effort.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Handling of conflicts of interest especially product management versus project management. We do this so poorly in banks - the approaches taken for managing the ongoing development of software products that have enormous impact on the customer service offered by the institution is really quite simplistic. Considering that these systems are extensive pieces of IP consisting of code, hardware, ideas in the heads of testers, developers, analysts, architects, and managers, well we really should approach it like a software product vendor. We need to keep the people together and we need to balance off the conflict to build right versus build the right product. It was comforting to hear Jeff Smith from Suncorp also spoke about this within the first session of the day. In fact, quick note hear to say I was very impressed with Jeff's talk. Suncorp have scored well there.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally I managed ever (ever) so briefly to talk about complexity and how to deal to it with services. Never had anywhere near enough time to talk about this one. I noticed that the IBM stand in the vendor area had a bunch of dice. I was tempted to grab a dozen, toss them on the floor and ask the audience how complex they thought that system was. Then split them into two groups of dice, put one lot on a desk and another on a different desk with a string between them representing an interface. Then I could show the transitioning of total complexity from multiplicative to additive. This would have given a good demonstration of the power of componentisation. As an aside I have done this before with a group building many sided solid objects from paper cutouts (tetrahedrons, cubes, dodecahedrons etc), I think it worked so there's a potential way of demonstrating complexity in a tactile manner.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A few general comments about the rest of the event...&lt;/p&gt;&lt;p&gt;Gosh what a lot of suits! and what a lot of people from ANZ! I guess their building was just right next door. Lot's of conversation about mobile technologies. Much overrated based on my experiences although I am very interested in the browser interfaces possible with the iPhone and Windows Touch phones. I can see that xhtml compliance with an understanding of modern phone browser capabilities could provide a far faster and more usable method of deploying mobile applications. Java midlets might let you control the buttons, but who cares when there are no buttons! Of all the presentations that I saw I found the most value in Jeff Smiths. Good commentary on people and approach with a good criticism of the prevalence of the waterfall approach to project managing complex system change in financial services companies. A real need for more maturity of project management in our sector.&lt;/p&gt;&lt;p&gt;So all in all a great time and now I'm looking forward to getting stuck into some real work back in the office.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5099326563607875676?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5099326563607875676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5099326563607875676&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5099326563607875676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5099326563607875676'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/06/future-of-banking-conference.html' title='Future of Banking Conference'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-412304358988565518</id><published>2008-03-27T08:39:00.001+13:00</published><updated>2008-06-14T22:39:32.329+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Presentation Roadtrip</title><content type='html'>&lt;p&gt;It's been 3 weeks of presenting for me for two separate events; Microsoft Architect Councils in Christchurch, Melbourne, Canberra, Sydney, Auckland, and a BrightStar Enterprise Architecture conference also held in Auckland. The tripping is now over and it's time I put some background material up onto this blog.&lt;/p&gt; &lt;p&gt;For the BrightStar conference attendees I know you can get the presentation from the BrightStar site and you should have been provided with the link and credentials from Brightstar.&lt;/p&gt; &lt;p&gt;For the Microsoft Architect Council meetings, which were public events, I've got a &lt;a href="http://cid-0e5ff53cd7f11485.skydrive.live.com/self.aspx/Public/Microsoft%20Architect%20Council%20March%2008/Microsoft%20Architects%20Council%200308.pptx"&gt;copy of the presentation&lt;/a&gt; loaded on my &lt;a href="http://cid-0e5ff53cd7f11485.skydrive.live.com/browse.aspx/Public"&gt;public SkyDrive folder&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Looking back over the presentations it's now easier for me to see the main themes come through and to recognise which have raised the most interest from attendees.&lt;/p&gt; &lt;p&gt;In random order they appear to be.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The recognition of business value in the IT shared service line and the special function of architects to enable change, especially disruptive change in a company; something typically unrecognised in companies as typified by the statement fragment 'the business must make the decision...'.&lt;br&gt;&lt;/li&gt; &lt;li&gt;The explicit recognition of the conflict of interest between building a product right and building the right product and why this leads you away from a single project manager role in your project delivery towards separate programme and product manager roles.&lt;br&gt;&lt;/li&gt; &lt;li&gt;The discussion in the presentations about the normal but arguably short sighted pecking order of market facing teams over shared service lines and why this leads to the failure of brands and companies due to disruptive innovations.&lt;br&gt;&lt;/li&gt; &lt;li&gt;Why companies fail to be creative because they deny their staff the time fully saturate themselves with all the information required to solve a problem, and the time for their subconscious mind to actually figure it out. You can't achieve innovation in a project, projects are defined once you know what you're planning to do.&lt;br&gt;&lt;/li&gt; &lt;li&gt;The importance of addressing complexity and efforts to do this from &lt;a href="http://www.literateprogramming.com/mccabe.pdf"&gt;modular programming&lt;/a&gt; through object orientation and service oriented architecture with lots of references to the work of Roger Sessions and his recent &lt;a href="http://www.objectwatch.com/white_papers.htm"&gt;complexity papers&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;All in all it was a great experience that benefited me probably a lot more than the attendees so a big thank you goes out to Microsoft and BrightStar for getting me along.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-412304358988565518?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/412304358988565518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=412304358988565518&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/412304358988565518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/412304358988565518'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/03/presentation-roadtrip.html' title='Presentation Roadtrip'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5323484580918153673</id><published>2008-02-10T20:41:00.001+13:00</published><updated>2008-06-14T22:38:55.490+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unusual'/><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>From a recent trip to India</title><content type='html'>&lt;p&gt;In Mumbai an elephant is stuck in a traffic jam while a young woman wearing dirt covered rags sits on a pile of rubbish and combs her hair, in another world she could be a model. In the far reaches of a rough shop in Agra sits a derelict life size wooden statue of a Hindu god, intricately carved, old and dirty, why isn't it out the front in place of the tacky tourist baubles? On the road to Delhi a camel pulls a cart in the early morning while just off the road men squat and presumably undertake morning ablutions.  In Bangalore high technology campuses with green grounds and gates and walls and guards provide paradise away from the daily grime of the city. Contrasts run so great that senses are initially sent awray until a form of acceptance comes in and you now longer lift an eyelid at the sights in front of you. I liked it, a lot.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5323484580918153673?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5323484580918153673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5323484580918153673&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5323484580918153673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5323484580918153673'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2008/02/from-recent-trip-to-india.html' title='From a recent trip to India'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-498810734058584540</id><published>2007-12-07T13:04:00.001+13:00</published><updated>2008-06-14T22:40:40.670+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>barcamp agile Wellington and the power of the individual</title><content type='html'>&lt;p&gt;&lt;a title="http://barcamp.org/BarCampAgileWellington" href="http://barcamp.org/BarCampAgileWellington"&gt;http://barcamp.org/BarCampAgileWellington&lt;/a&gt;&lt;/p&gt; &lt;p&gt;...is underway and the it's proving more thought provoking than I'd assumed. The development process isn't something I'm directly focused on in my everyday work but it's certainly an important area for me. The biggest theme striking me today is the focus on the individual which I find fascinating.&lt;/p&gt; &lt;p&gt;There was a trend for awhile that worked hard to deliver results through process. Methodology x, prescriptive guidance y. The dehumanisation of the worker.&lt;/p&gt; &lt;p&gt;It just doesn't work that way - we're human after all. It really is all about individuals. Teams yeah, sure - but every member of that team is an individual with ideas and beliefs. You either recognise it and work with that or you ignore at your peril.&lt;/p&gt; &lt;p&gt;I love the blogging world today and I love the way guru characters have appeared that lead through the posting of their ideas. They're enormously important at driving company directions and in defining respect and appreciation from those that watch and listen. Companies such as Google, IBM, Microsoft and Sun all have these people, but there are plenty of companies that don't yet. Big companies, large consulting companies and product companies. I have no faith in their ideas, direction, or products not until I see a passionate, articulate voice from someone I trust.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-498810734058584540?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/498810734058584540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=498810734058584540&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/498810734058584540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/498810734058584540'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/12/barcamp-agile-wellington-and-power-of.html' title='barcamp agile Wellington and the power of the individual'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-743688789408062006</id><published>2007-11-23T12:56:00.001+13:00</published><updated>2007-11-23T12:56:24.773+13:00</updated><title type='text'>Schneier on Security: More "War on the Unexpected"</title><content type='html'>&lt;p&gt;One can only hope that the increasing information transparency we see occurring on the Internet and in modern computing technology continues...&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.schneier.com/blog/archives/2007/11/more_war_on_the.html"&gt;Schneier on Security: More "War on the Unexpected"&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/17672034-743688789408062006?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/743688789408062006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=743688789408062006&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/743688789408062006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/743688789408062006'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/11/schneier-on-security-more-on-unexpected.html' title='Schneier on Security: More &amp;quot;War on the Unexpected&amp;quot;'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1915309875950956190</id><published>2007-10-18T12:02:00.003+13:00</published><updated>2008-07-15T12:38:10.698+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unusual'/><title type='text'>Wellington Weather...</title><content type='html'>...is incomprehensible! &lt;p&gt;Yesterday morning I awoke to howling westerlies and heavy rain in Paraparaumu, then exited the train in Wellington (50km distance) to a warm, dry, windy day with the sun shining!&lt;/p&gt;&lt;p&gt;This morning I awake to incredibly heavy rain, take the train to Wellington and find it cold with a strong damp southerly.&lt;/p&gt;&lt;p&gt;What will it be tomorrow? Heck, what will it be tonight?&lt;/p&gt;&lt;p&gt;Living here you know that you just don't know. Looking on the bright side, at least we have something to talk about.&lt;/p&gt;&lt;p&gt;And as for tonight, best advice I can give is follow the &lt;a href="http://www.metvuw.com/"&gt;MetVUW&lt;/a&gt; site (and keep looking out the window). Based upon the forecast for 7pm, I'm guessing it may have cleared up again!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1915309875950956190?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1915309875950956190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1915309875950956190&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1915309875950956190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1915309875950956190'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/10/wellington-weather.html' title='Wellington Weather...'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2580268841298464285</id><published>2007-10-16T13:18:00.001+13:00</published><updated>2008-06-14T22:38:01.851+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Heat Mapping</title><content type='html'>&lt;p&gt;I've recently had the pleasure of uncovering some new data visualisation -visualization for you Americans- capabilities, in particular heat mapping a measure that's a function of two input variables.&lt;/p&gt; &lt;p&gt;Generating eye catching representations of information is crucial in the corporate world, and yet for the most part, business data visualisation is very poor. Back in the 90s I was busy with research for a physics PhD and I lived by &lt;a href="http://www.gnuplot.info/"&gt;gnuplot&lt;/a&gt; and a Windows package called &lt;a href="http://www.originlab.com/"&gt;Origin&lt;/a&gt;. In transitioning into the business world I also transitioned into Excel. I've enjoyed using Excel and I'm a really great fan of Excel 2007 and especially the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7c76e8df-8674-4c3b-a99b-55b17f3c4c51&amp;amp;displaylang=en"&gt;data mining tools&lt;/a&gt; that Microsoft now provide with it but the problem with the graphs, is that everyone else at work generates graphs that look, well, exactly the same. So, I thought I'd go and take a look at what else is now available.&lt;/p&gt; &lt;p&gt;First off I discovered that Gnuplot and Origin still exist and their capabilities have advanced far beyond what I used when I produced a thesis on a 386 linux pc with.. was it 120MB of disk But, then I discovered Python, the scipy (scientific Python) and numpy (numeric python) libraries, and the MatPlotLib library. Now these looked especially useful because of the image mapping capability which could be used to generate a heat map.&lt;/p&gt; &lt;p&gt;Working with a range of people with different backgrounds in a corporate environment you're constantly trying to re-represent information in differing ways to achieve some connection with your audience. For some people an Excel bar chart works great, for others scatter plots, for others they'll want error bars etc. So you want a range of graphing tools available. Now Excel is good, especially Excel 2007, but there's still a range of visualisations that it can't perform, especially image mapping or heat mapping and some 3D plot types. &lt;/p&gt; &lt;p&gt;Now MatPlotLib can help to fill some of the void, particularly with the image mapping. Check the &lt;a href="http://matplotlib.sourceforge.net/screenshots.html"&gt;screenshots&lt;/a&gt; to see a range of examples of image (heat) maps and polar plots mixed along with more conventional 2D plot types.&lt;/p&gt; &lt;p&gt;In one example I looked at the pattern of customer usage through our Internet channel as a function of customer age and their total relationship with the company. To do this with MatPlotLib I first collected the data from our database environment, I then used Excel to manipulate the data into an array format (same format as an Excel surface plot), then saved it to a file, I then loaded it into a Python array and used the imshow() command to generate a heat map. I regenerated the graph over successive half year intervals keeping the color range set to run over a constant interval, then combined the images together into a movie with Windows Movie Maker (you can also do this with command line tools such as memcoder which part of the opensource &lt;a href="http://www.mplayerhq.hu/"&gt;mplayer&lt;/a&gt; suite).&lt;/p&gt; &lt;p&gt;The output of this exercise was a movie that showed customer activity through the Internet increasing over time across all age ranges but accentuated by the degree of total transactional relationship they had with the company.&lt;/p&gt; &lt;p&gt;One of the biggest problems you face with generating heat maps/image plots is getting a full range of data. If the value you want to plot is a function of x and y, and you're not actually taking measurements, but just relying instead on historical data you'll probably end up with a lot of missing data points. The imshow() command interpolates data points to smooth over the holes. &lt;/p&gt; &lt;p&gt;The easiest way to get MatPlotLib on your pc/laptop is to install the standard Python distribution and then over the top install the IPython shell. &lt;a href="http://ipython.scipy.org/"&gt;IPython&lt;/a&gt; provides you with a scipy item in your programs list which gives you a Python command prompt with all the necessary libraries pre-loaded.&lt;/p&gt; &lt;p&gt;If you're interested in other visualisation tools then I've since found a good background reference at IBM: &lt;a href="http://www.ibm.com/developerworks/linux/library/l-datavistools/"&gt;http://www.ibm.com/developerworks/linux/library/l-datavistools/&lt;/a&gt;. It's say's it's for Linux but in reality most of this software runs on Windows (and in fact if you look at the numbers of downloads on some of the packages the majority of downloads are for the WinOS).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2580268841298464285?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2580268841298464285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2580268841298464285&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2580268841298464285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2580268841298464285'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/10/heat-mapping.html' title='Heat Mapping'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3349394939021607510</id><published>2007-09-06T16:56:00.001+12:00</published><updated>2008-06-14T22:37:34.152+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>The Business Shutdown Statement</title><content type='html'>&lt;div&gt;&lt;a href="http://www.andredurand.com/2007/05/10.html#a689"&gt;http://www.andredurand.com/2007/05/10.html#a689&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's not a day goes by I get the very same. As if I'm not thinking about  the business!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3349394939021607510?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.andredurand.com/2007/05/10.html#a689' title='The Business Shutdown Statement'/><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3349394939021607510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3349394939021607510&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3349394939021607510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3349394939021607510'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/09/business-shutdown-statement.html' title='The Business Shutdown Statement'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5756537790476201086</id><published>2007-08-24T21:18:00.001+12:00</published><updated>2007-08-26T09:09:09.045+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>The Value Of An Employee</title><content type='html'>&lt;p&gt;Some recent project activity I've been involved with has reminded me of the all too commonly occurring scenario that plays out in corporate offices up and down the land each day; the relegation of the employee to support while the contractors populate the projects. (Disclaimer : I've been a contract resource, an employee, a project manager, and team manager so I've covered pretty much all the bases...)&lt;/p&gt; &lt;p&gt;Now, it never ceases to amaze me that organisations persist in driving project delivery with their contract staff in preference to their corporate staff. The usual argument is to better manage resources and budget for asset development enabling easy capitalisation of time, depreciation of asset cost, and flexible staffing levels with project load, but consider this.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;How will your employees feel if they're forever stuck on support and bug fixing while the glory of new project delivery (and the happy celebrations on project completion) are forever the domain of your contractors?&lt;br /&gt;&lt;/li&gt; &lt;li&gt;How will you stop your people believing that your employees are second rate staff to the contractors you bring on for the big projects?&lt;br /&gt;&lt;/li&gt; &lt;li&gt;How do you successfully manage operation of the project deliverables when the operational staff were not involved in the project development?&lt;br /&gt;&lt;/li&gt; &lt;li&gt;How do you continue long term development and idea innovation on a system produced by one team and operated by another?&lt;br /&gt;&lt;/li&gt; &lt;li&gt;And just how many projects actually really do successfully deliver generating the actual value originally envisaged in the business cases? Wouldn't it be better to manage the cost up front knowing you can capitalise after the fact?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you're building a valuable asset then you should be building a commensurately valuable human structure to continue development over time, not just hand over and dash off to the next engagement.&lt;/p&gt;&lt;p&gt;It's a naive view that sees a complex system developed, deployed and left alone. Again, anything valuable at a point in time needs to change to remain valuable in response to a changing environment. It's simply ridiculous to imagine a complex system can be simply bounded by the original project definition.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Relegating employees to operational activity because of concerns over managing budget is a strategic error for any company.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5756537790476201086?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5756537790476201086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5756537790476201086&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5756537790476201086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5756537790476201086'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/08/value-of-employee.html' title='The Value Of An Employee'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7511982907755070352</id><published>2007-08-16T10:08:00.001+12:00</published><updated>2007-08-24T21:32:00.742+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>Richard Rumelt on making choices and Disruptive Innovation</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Thanks go to the McKinsey Quarterly Journal for this great interview. You'll need to register (it's free) to read the original &lt;a href="http://www.mckinseyquarterly.com/Strategys_strategist_An_interview_with_Richard_Rumelt"&gt;article&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Now the title of this post isn't exactly what&amp;nbsp;Rumelt&amp;nbsp;wrote but the theme runs strongly through&amp;nbsp;the interview.&lt;/p&gt; &lt;p&gt;While responding to questions on the nature of corporate strategy Rumelt gives the example of the resurgence of Apple (and really Steven Jobs) through the iPod:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Jobs didn't give me a doorknob-polishing answer. He didn't say, 'We're cutting costs and we're making alliances.' He was waiting until the right moment for that predatory leap, which for him was Pixar and then, in an even bigger way, the iPod. That very predatory approach of leaping through the window of opportunity and staying focused on those big wins - not on maintenance activities - is what distinguishes a real entrepreneurial strategy."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And,&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Enter Jobs. He was perfectly positioned because he was a bit of an insider in the entertainment industry but didn't have any of those asset positions that were being threatened. He didn't need to make a fantastic leap of imagination into the far future. He found a set of ideas that needed to be quickly and decisively acted upon."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Two other&amp;nbsp;good points in the interview are the power of writing down&amp;nbsp;thoughts in sentences over bullet points and&amp;nbsp;the concept of value denial.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7511982907755070352?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7511982907755070352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7511982907755070352&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7511982907755070352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7511982907755070352'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/08/richard-rumelt-on-making-choices-and.html' title='Richard Rumelt on making choices and Disruptive Innovation'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6826105608505708149</id><published>2007-08-16T09:41:00.000+12:00</published><updated>2007-08-24T21:31:24.425+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Computerworld Article Response</title><content type='html'>Well I was quoted in Computerworld yesterday(&lt;a href="http://computerworld.co.nz/news.nsf/tech/DABFB2798D9A6E50CC257336007EAB04"&gt;http://computerworld.co.nz/news.nsf/tech/DABFB2798D9A6E50CC257336007EAB04&lt;/a&gt;) as a result of statements made during my voice of the customer track presentation on Kiwibank at TechEd 07 in Auckland. During the presentation I made a point that platform infrastructure is an important enabling factor in exploiting future opportunities; and that at Kiwibank we were embarking on a desktop upgrade, initially to XP and at a later date to Vista.&lt;br /&gt;&lt;br /&gt;During question time at the end of the presentation I was asked to explain in more detail why we were not going directly from Windows 2000 to Vista. The answer is simply that we need to complete our natural desktop replacement to ensure people get a reasonable performance. This is underway and from my perspective, being mostly interested in application deployment, it is not a great inhibitor to future progress. Windows XP does provide organisations with the ability to deploy the .net 3 components for presentation, workflow management, and communication and while I'm sure that from an infrastructure perspective there are many good reasons to deploy Vista for improved management, I'm satisfied with the operating system for application hosting.&lt;br /&gt;&lt;br /&gt;The remainder of the article referred to some of the more interesting ways in which we're trying to take advantage of a range of new technologies within the bank; if I had had time in the presentation I could've shown many more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6826105608505708149?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6826105608505708149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6826105608505708149&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6826105608505708149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6826105608505708149'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/08/computerworld-article-response.html' title='Computerworld Article Response'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4594766271191103728</id><published>2007-08-14T12:42:00.000+12:00</published><updated>2007-08-24T21:31:24.425+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>New Web</title><content type='html'>These notes come from Michael Platt's Web 2.0 presentation at TechEd07 Auckland.&lt;br /&gt;&lt;br /&gt;Why TCP?&lt;br /&gt;Why HTTP?&lt;br /&gt;&lt;br /&gt;Why not UDP and BitTorrent...&lt;br /&gt;This follows on from the SAF06 event and Bill Gates talk. Current web protocols were designed with low bandwidth environments in mind; now there is a high bandwidth environment and the time is right for a disruptive innovation. A new read/write peer to peer protocol could easily supplant HTTP with the PUT/POST/GET verbs.&lt;br /&gt;&lt;br /&gt;If we do this then REST could provide a model for a new implementation.&lt;br /&gt;&lt;br /&gt;Basic support available in WCF1.0 but it's native in Orcas.&lt;br /&gt;&lt;br /&gt;Question could be what REST support exists in Silverlight?&lt;br /&gt;&lt;br /&gt;Interesting point raised on process management and the Robotics SDK which contains graphical process designer. In a bidirectional web environment you need process support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4594766271191103728?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4594766271191103728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4594766271191103728&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4594766271191103728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4594766271191103728'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/08/new-web.html' title='New Web'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7167983547249967152</id><published>2007-08-13T17:38:00.000+12:00</published><updated>2007-08-24T21:31:24.426+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>TechEd 2007 Auckland Presentation</title><content type='html'>Just finished! I can never tell in advance how the presentation will go until it's performed in front of the obvious. It's only then that you can gauge the feed back and know which areas of the presentation were actually important to the audience.&lt;br /&gt;&lt;br /&gt;In this particular case I think the following areas stood out:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Innovation is not the result of projects&lt;/li&gt;&lt;li&gt;My rant on incubators never succeeding&lt;/li&gt;&lt;li&gt;The requirement to sell internally your ideas&lt;/li&gt;&lt;li&gt;The need to think ahead two, three or more years and use that to build your strategy for your technology development&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Big thanks go out to Lou Carbone for his keynote, best keynote speech I've seen, and I took a hint and used my time before the presentation to add some pictures - they speak a thousand words.&lt;/p&gt;&lt;p&gt;Main message from Lou's speech was that emotional clues are everywhere; and you're daft if you don't take heed. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7167983547249967152?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7167983547249967152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7167983547249967152&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7167983547249967152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7167983547249967152'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/08/teched-2007-auckland-presentation.html' title='TechEd 2007 Auckland Presentation'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1630114930008470984</id><published>2007-06-01T10:31:00.001+12:00</published><updated>2007-08-24T21:31:24.426+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Surfacing a new Internet</title><content type='html'>&lt;p&gt;The message has been clear for months; the internet has been limited through protocols designed in 1994 andwe're now on the verge of a new electronic world. I watched Bill Gates give this message&amp;nbsp;last December at the Strategic Architects Forum in Seattle and it's now becoming very clear what he had in mind.&lt;/p&gt; &lt;p&gt;First the release of the Silverlight beta with vector graphics; then the Silverlight alpha with a downloadable sandbox; and now &lt;a href="http://www.microsoft.com/surface"&gt;Surface&lt;/a&gt;. I've been telling people in my industry ever since that the world will be dramatically different in 5 years time. I don't think it's been well understood but maybe now it will be different.&lt;/p&gt; &lt;p&gt;When you think of a core Internet application such as Internet Banking you realise that a customer's expectations of what Internet banking is has only been based upon 10 years of experience at most. Five years from now this experience will be very different. Silverlight and Surface will enable whole new styles of user interaction. Interacting with the bank becomes a flick of the wrist!&lt;/p&gt; &lt;p&gt;Now, one last memory from that conference in Seattle: the statement that the Internet is increasingly becoming a&amp;nbsp;mirror of reality. Seems more accurate every day...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1630114930008470984?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1630114930008470984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1630114930008470984&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1630114930008470984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1630114930008470984'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/06/surfacing-new-internet.html' title='Surfacing a new Internet'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8660245756883628653</id><published>2007-05-28T20:15:00.001+12:00</published><updated>2007-05-28T21:04:05.498+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Commentary'/><title type='text'>Almost Forgotten</title><content type='html'>&lt;p&gt;A few weeks ago it was ANZAC day in NZ; a day of remembrance originally defined by the failed WW1 landings at Gallipoli, but now extended to encompass those Australians and New Zealanders injured or lost during all the wars since. A day also celebrated in Turkey for the creation of a secular state: for one world a disastrous invasion; for another the rise of a modern state.&lt;/p&gt; &lt;p&gt;Now, I&amp;nbsp;usually find these days disconcerting; there&amp;nbsp;seems&amp;nbsp;too great&amp;nbsp;a yearning for days past, as though something about those historic events made us better people, proved our metal, gave perhaps a reason to celebrate our forefather's heroic achievements. It seems a dangerous thing.&lt;/p&gt; &lt;p&gt;Now that might be true but on this occasion, I think I've found something else that warrents mentioning.&lt;/p&gt; &lt;p&gt;My family background on my father's side is Polish. That side of my family came to NZ as refugees in the 1940s and 1950s&amp;nbsp;via the Soviet Union, Persia, and Palestine. Of 1.5 million Poles deported by Stalin in 1939/1940 to Siberian labour camps, only about 700 made there way to start new lives in NZ.&amp;nbsp;The original arrivals consisted of orphaned kids, followed after the war, thanks to the Red Cross, by those close family members that managed to find their children or siblings. It was by this mechanism that what remained of my polish ancestry came together in NZ.&lt;/p&gt; &lt;p&gt;The impact upon families of the trip from labour camps was severe with many dying along the way including members of my father's family. The men of fighting age went into the army, navy or airforce and variously split into those fighting for the West and those fighting for the Soviets.&lt;/p&gt; &lt;p&gt;I recently came across a web site which attempts to document some of the Polish forces during the war, a force which included members of my family. I know that the internet is unreliable but the &lt;a href="http://www.polishsoldier.co.uk/"&gt;site&lt;/a&gt; seems to confirm what I heard from my family as I grew up.&lt;/p&gt; &lt;p&gt;The Polish forces were a major part of WW2 and yet also now largely forgotten.&lt;/p&gt; &lt;p&gt;The Soviet controlled Polish army fought through to the battle for Berlin and put a Polish flag temporarily on the Brandenburg gate next to the Soviet flags, albiet temporarily as it was rapidly taken down. They numbered 396,000 through the war with 23000 killed or missing in action.&lt;/p&gt; &lt;p&gt;The British controlled forces numbered 255,000 across airforce, army, and navy with 13,000 killed or missing in action.&lt;/p&gt; &lt;p&gt;This means that ignoring the initial invasion of Poland, and the 15,000 officers believed killed by the Soviets in camps in 1940, Poland still fielded a combined total of approximately 650,000 servicemen through WWII making it the 4th largest allied armed forces.&lt;/p&gt; &lt;p&gt;Comparing the casuality rate with that suffered by the US forces during the war is enlightening: 5% of those fighting in the West were killed or missing; 6% of those fighting in the East were killed or missing. As many Poles fought in WW2 under British and Soviet command as did US Marines but they suffered&amp;nbsp;twice &amp;nbsp;the casualty rate (&lt;a href="http://www.usmm.org/casualty.html"&gt;http://www.usmm.org/casualty.html&lt;/a&gt;). And that's excluding the initial invasion of Poland by Germany and the Soviet Union in 1939.&lt;/p&gt; &lt;p&gt;Yet you'll never hear that mentioned on the History channel!&lt;/p&gt; &lt;p&gt;With Yalta and Stalin's desire to incorporate Poland into the Eastern Bloc the efforts of those 2 armies was effectively sealed. In 1946 the British command demobilized the Polish army. They were not allowed to join the London victory parade and according to an interview on the &lt;a href="http://www.polishsoldier.co.uk/eyewitness.htm"&gt;Polish Solder&lt;/a&gt; website they were given identity cards with "Enemy Alien" written on them.&lt;/p&gt; &lt;p&gt;In the case of my family 3 members were mobilized into the army, navy and cadets. All survived and ended up coming to live in NZ, a country that&amp;nbsp;interestingly fought alongisde the Polish 2nd Corps throughout North Africa and Italy.&lt;/p&gt; &lt;p&gt;I think it's about time that the efforts of these forgotten soldiers were better brought to light.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8660245756883628653?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8660245756883628653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8660245756883628653&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8660245756883628653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8660245756883628653'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/05/almost-forgotten.html' title='Almost Forgotten'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7277970999614460749</id><published>2007-05-28T19:55:00.001+12:00</published><updated>2007-05-28T21:03:49.919+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>SQL Server 2005 Data Mining Classification Matrix</title><content type='html'>&lt;p&gt;Finally figured it out, so easy, and yet so poorly described in the documentation; the classification model tab in SQL Server 2005 data mining shows you the accuracy of your model prediction. Figuring out how to use it had me confused for quite some time. If you're as daft as me then perhaps the following might help.&lt;/p&gt; &lt;p&gt;The easiest way to discover how to correctly read the&amp;nbsp;classification matrix&amp;nbsp;is to generate a table from your testing data set (you do split your original data into training and test data sets don't you...!?) with the ID, the actual outcome you're trying to predict, and the predicted value. You can do this in the Mining Model Prediction Tab. It's easier there because the option to save to table in your database is accessible from the little disk icon in the top left corner. You choose the ID, the actual and the predicted value in the bottom half of the screen. The first time I looked at this it was a bit of mystery how to drive that half of the screen, I'm guessing you've mastered that part.&lt;/p&gt; &lt;p&gt;Load up the table that is saved from your mining query into SQL Server's query window and count up the number of entries that are correctly predicted; and the number of actual values for each state of the actual attribute. You'll then see how it maps to the classification table. Basically, the succinct description at the top of the table is correct. Columns correspond to actuals; rows to predicted values. The bit they leave out that would've been useful to me is that the total number of cases of any one actual value you get from summing vertically; the total number of predicted cases of a value you get from summing the row.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7277970999614460749?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7277970999614460749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7277970999614460749&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7277970999614460749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7277970999614460749'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/05/sql-server-2005-data-mining.html' title='SQL Server 2005 Data Mining Classification Matrix'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3297760461165537235</id><published>2007-04-19T08:58:00.001+12:00</published><updated>2007-05-28T21:03:49.919+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>Singleton DMX</title><content type='html'>&lt;p&gt;If you've used DMX to generate predictions from a data mining model you will be familiar with the singleton query. This is where you obtain a prediction for a particular set of input attributes; either within a case table or in a nested table. There was an example of one of these in a previous post.&lt;/p&gt; &lt;p&gt;Now the form of that query was:&lt;/p&gt; &lt;p&gt;select prediction &lt;br&gt;from data mining model&lt;br&gt;prediction join&lt;br&gt;(select (select something as nested row&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;union select somethingelse as nested row etc) as nestedtable)&lt;br&gt;as t&lt;/p&gt; &lt;p&gt;Now, what I wanted to do was using openquery() to return all the nested rows, but I did not have an explicit case. How do you make it work?&lt;/p&gt; &lt;p&gt;After bugging the team on the &lt;a href="http://www.sqlserverdatamining.com"&gt;www.sqlserverdatamining.com&lt;/a&gt; web site in the newsgroup section the answer was obvious. Just go ahead and create a dummy case. A sample query that works for one of my models follows.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;SELECT&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Predict([Model_NaiveBayes].[Bucket]),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PredictProbability([Model_NaiveBayes].[Bucket])&lt;br&gt;From [Model_NaiveBayes]&lt;br&gt;NATURAL PREDICTION JOIN&lt;br&gt;SHAPE { OPENQUERY(Test, 'SELECT 1 as CaseKey') }&lt;br&gt;APPEND ( &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { OPENQUERY(Test,'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select 1 as ForeignKey, Term&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from Terms &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cross apply Matches('some long&amp;nbsp;discourse containing many terms that I want to characterise'',''\b('' + Term + '')\b'')')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } RELATE [CaseKey] TO [ForeignKey] &lt;br&gt;) AS [Msg Term Vectors]&lt;br&gt;AS T&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;In this case it uses the Matches TVF which I describe in a &lt;a href="http://bohdanszymanik.blogspot.com/2007/04/exposing-regular-expression-match.html"&gt;previous post&lt;/a&gt; to identify the terms in the text.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3297760461165537235?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3297760461165537235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3297760461165537235&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3297760461165537235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3297760461165537235'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/singleton-dmx.html' title='Singleton DMX'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-665529526278334121</id><published>2007-04-18T08:28:00.001+12:00</published><updated>2007-04-19T20:50:08.667+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Exposing the Regular Expression Match Collection to SQL Server as a Table-Value Function</title><content type='html'>&lt;p&gt;For a recent pet project I've been attempting to create a text mining model in SQL Server 2005 to analyse incoming messages and automatically bucket them into one of a number of categories. This follows straight on from the text mining example contained in the SQL Server tutorials. &lt;/p&gt; &lt;p&gt;With the model implemented (using Decision Trees, Naive Bayes etc) it's easy to create a singleton query by hand that has the following form:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;SELECT&lt;br&gt;[Model_NB].[Bucket], &lt;br&gt;TopCount(PredictHistogram([Bucket]), $AdjustedProbability, 3)&lt;br&gt;From&lt;br&gt;[Model_NB]&lt;br&gt;NATURAL PREDICTION JOIN&lt;br&gt;(SELECT (SELECT 'some defining term' AS [Term]&lt;br&gt;UNION SELECT 'another identifying noun or phrase' AS [Term]) AS [Msg Term Vectors]) AS t&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;But I still needed to extract the identifying noun phrases that make up the terms. Given a dictionary of terms and a length of freeform text how do you find all the term occurences?  &lt;p&gt;Using the SQL Server string functions is painful so I thought I'd try the Match Collection object in the CLR. To expose this you need to perform the following operations.  &lt;p&gt;Firstly, enable CLR integration with &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;EXEC sp_configure 'clr enabled' , '1'&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Then create a SqlServer&amp;nbsp;function in .net to expose the MatchCollection eg&lt;/p&gt; &lt;blockquote&gt;using System;&lt;br&gt;using System.Data;&lt;br&gt;using System.Data.SqlClient;&lt;br&gt;using System.Data.SqlTypes;&lt;br&gt;using Microsoft.SqlServer.Server;&lt;br&gt;using System.Text.RegularExpressions;&lt;br&gt;using System.Collections;&lt;br&gt;public partial class UserDefinedFunctions&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Microsoft.SqlServer.Server.SqlFunction (FillRowMethodName="RowFiller", TableDefinition="Match NVARCHAR(MAX)")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IEnumerable Matches(String text, String pattern)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MatchCollection mc = Regex.Matches(text, pattern);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mc;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // this gets called once each time the framework calls the iterator on the underlying matchcollection&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void RowFiller(object row, out string MatchTerm) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Match m1 = (Match)row;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MatchTerm = m1.Value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}; &lt;/blockquote&gt; &lt;p&gt;Then deploy using Visual Studio, or if you want to do it manually try:  &lt;blockquote&gt; &lt;p&gt;CREATE ASSEMBLY MatchesAssembly FROM 'c:\somewhere\some.dll' WITH PERMISSION_SET = SAFE&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;CREATE FUNCTION Matches(@text NVARCHAR(MAX), @term NVARCHAR(MAX)) &lt;br&gt;RETURNS TABLE &lt;br&gt;(Matches NVARCHAR(MAX))&lt;br&gt;AS&lt;br&gt;EXTERNAL NAME TextTools.UserDefinedFunctions.Matches&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And voila, you can do the following...  &lt;blockquote&gt; &lt;p&gt;select *  &lt;p&gt;from terms cross apply Matches(@text,'\b(' + terms.term + ')\b') &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Where terms is a table of noun phrases you're searching for in the variable @text that contains the message text.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-665529526278334121?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/665529526278334121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=665529526278334121&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/665529526278334121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/665529526278334121'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/exposing-regular-expression-match.html' title='Exposing the Regular Expression Match Collection to SQL Server as a Table-Value Function'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5970863464488452426</id><published>2007-04-10T16:55:00.000+12:00</published><updated>2007-04-10T20:15:02.242+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>Measuring how quickly we learn from our mistakes</title><content type='html'>For 10 years I've heard how you need to learn from your mistakes and it seems quite a reasonable mantra. But the problem I've got with learning from mistakes is how quickly do you learn.&lt;br /&gt;&lt;br /&gt;Some people and some organisations seem to learn really quickly, others, more like myself, take a while longer, others take the whole of their existence.&lt;br /&gt;&lt;br /&gt;So the question I've got is how do measure the responsiveness of someone, some organisation, to learning from their mistakes?&lt;br /&gt;&lt;br /&gt;What metric could we use to tune performance?&lt;br /&gt;&lt;br /&gt;Not sure, but maybe we can think something up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5970863464488452426?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5970863464488452426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5970863464488452426&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5970863464488452426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5970863464488452426'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/measuring-how-quickly-we-learn-from-our.html' title='Measuring how quickly we learn from our mistakes'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4850018877127136651</id><published>2007-04-08T20:44:00.001+12:00</published><updated>2007-04-10T16:55:28.508+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unusual'/><title type='text'>Whales off the Beach</title><content type='html'>&lt;p&gt;Wonderful sight - whales off the beach, maybe 300m from shore on a beautiful still, sunny day. Not sure what type, but I don't think they were Orcas - they didn't seem large enough. The shame of it is that if it weren't for the cold I've had for the last few days, my plan was to be out kayaking this morning. Wouldn't that have been amazing!&lt;/p&gt;&lt;p&gt;Oh, perhaps a bigger shame, especially from the point of view of the whales, was the idiot out there going round and round in circles on a jetski. Confirms every opinion I've ever had of them.&lt;/p&gt;&lt;p&gt;Update: Talking to someone this morning I found out they were indeed Orcas. Now I really wish I'd been up to going out on the kayak.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4850018877127136651?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4850018877127136651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4850018877127136651&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4850018877127136651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4850018877127136651'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/whales-off-beach.html' title='Whales off the Beach'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-472869948127549478</id><published>2007-04-06T10:04:00.000+12:00</published><updated>2007-04-10T19:37:05.606+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>The value of a demonstrable prototype</title><content type='html'>I've just been reading an interview by Ron Jacobs with Scott Guthrie; it's up on The Microsoft Architect Journal (&lt;a href="http://msdn2.microsoft.com/en-us/library/bb266332.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb266332.aspx&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;What's caught my attention is the importance Scott put on having a demonstrable prototype of their ASP.Net technology early in the development. "&lt;em&gt;There were three or four of us&lt;/em&gt;" and yet they managed to create one of the key product offerings of one of the world's largest companies. A truly remarkable outcome.&lt;br /&gt;&lt;br /&gt;Now I'm sure that the team itself was extraordinary, but still I bet in many companies they would have been driven into the ground under the weight of the stakeholders. The more people involved, the more diluted the good ideas become and the greater effort needs to be put into selling ideas and managing the stakeholders. The processes companies typically put into place to manage new delivery put a stranglehold on true innovation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;'...&lt;em&gt;That's one of the successful things that we did with ASP.NET. We said that we're&lt;br /&gt;going to throw away every line of code we're going to write for the next couple&lt;br /&gt;of months. Let's all agree on that. We're not going to say, "Oh let's take this&lt;br /&gt;and adapt it; we can clean it up." No. We're going to throw it away. We're going&lt;br /&gt;to "deltree" this subdirectory at some point, and that way we can be more&lt;br /&gt;adventurous about trying new things. We don't have to worry about making sure&lt;br /&gt;that everything's robust because it's going to be in the final version. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;br /&gt;We actually did that for a few months and said, "We're done, delete it; let's start&lt;br /&gt;over from scratch; now let's write the full production code and make sure we&lt;br /&gt;bake in quality at the time." I think a lot of teams could benefit from that.&lt;br /&gt;The hardest thing is making sure you delete the prototype code. Too often,&lt;br /&gt;projects develop with "Well, it's kind of close." It's very difficult to start&lt;br /&gt;with a prototype and make it robust. I'm a firm believer in starting with a&lt;br /&gt;prototype phase and then deleting it.&lt;/em&gt;'&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The typical corporate company approach would not have sustained this type of development. &lt;/p&gt;&lt;p&gt;It would be an incredibly gifted individual that could convince a steering committee to support expenditure on experimentation when little or no artifacts could be easily capitalised at the end of a 3 month development. Most companies want functional delivery early with a clear line of connection from end user requirements to final deliverable.&lt;/p&gt;&lt;p&gt;Scott talks specifically about the value of a prototype to help sell the idea.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;"&lt;em&gt;We certainly had to persuade a number of people along the way. One thing we&lt;br /&gt;did early in the project was get running code in prototypes that we could show&lt;br /&gt;people. Often when you're working on a project that's new or something that&lt;br /&gt;hasn't been done before, it's easy to put together a bunch of PowerPoint slides&lt;br /&gt;that sound good, but it's especially valuable to actually show code and walk&lt;br /&gt;people through code that's running. Not only does the prototype prove that it's&lt;br /&gt;real, but also you just learn a terrific amount by doing it.&lt;/em&gt;"&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Perhaps their greatest achievement was the successful marketing of the development from initial concept through to the current deliverables. The early prototyping and demonstrations were obviously a critical part of this achievement.&lt;/p&gt;&lt;p&gt;At the end of the day all of this makes great fodder for the creation of a myth list: the My Myth List. My first two myths are going to be:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;End users know what they require&lt;/li&gt;&lt;li&gt;Product delivery is a linear process&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Because it's apparent that people don't know what they want. It's the visualisation of what is possible that provides a basis for requirements. And product delivery is never linear.&lt;/p&gt;&lt;p&gt;I'm sure I'll think of more over the next few weeks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-472869948127549478?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/472869948127549478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=472869948127549478&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/472869948127549478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/472869948127549478'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/value-of-demonstrable-prototype.html' title='The value of a demonstrable prototype'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4457255644716607312</id><published>2007-04-01T22:10:00.001+12:00</published><updated>2007-04-10T19:39:19.470+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Commentary'/><title type='text'>21C in the pool on April 1st</title><content type='html'>&lt;p&gt;Global warming? Well it was a late start to summer...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4457255644716607312?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4457255644716607312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4457255644716607312&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4457255644716607312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4457255644716607312'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/21c-in-pool-on-april-1st.html' title='21C in the pool on April 1st'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-234238899476655487</id><published>2007-04-01T22:09:00.001+12:00</published><updated>2007-04-10T19:39:19.471+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Commentary'/><title type='text'>Commotion at the beach</title><content type='html'>&lt;p&gt;One of the Kapiti island ferrys was caught out this afternoon. I joined in a small crowd to watch as the tractor that was supposed to haul it out of the water got stuck in the sea. The engine appeared to have failed and in a scene reminescent of the Little Digger, 3 tractors lined up in a row to try and tow the stranded tractor and ferry out, without success. They temporarily gave up on the ferry, hauled out the tractor before the tide came in further, then towed the ferry onto the shore to allow the passengers out. A bit of excitment while I was down at the playground with Lil!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-234238899476655487?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/234238899476655487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=234238899476655487&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/234238899476655487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/234238899476655487'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/04/commotion-at-beach.html' title='Commotion at the beach'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-4154793586730652728</id><published>2007-03-22T21:23:00.000+12:00</published><updated>2007-04-10T19:39:32.235+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>ARCast video up for Kiwibank Case Study</title><content type='html'>I've just found out that Ron Jacobs has posted a &lt;a href="http://www.skyscrapr.net/blogs/arcasttv/archive/2007/03/13/846.aspx"&gt;video interview&lt;/a&gt; of myself and two members of my team on his &lt;a href="http://www.skyscrapr.net/blogs/arcasts/default.aspx"&gt;ARCast &lt;/a&gt;site.&lt;br /&gt;&lt;br /&gt;The interview was based on the &lt;a href="http://www.microsoft.com/casestudies/casestudy.aspx?casestudyid=200491"&gt;Kiwibank Case Study &lt;/a&gt;which we undertook last year with Microsoft. The interview takes a broad look at how Kiwibank has used technology to help it go from 0 to 12% of NZ's population in 5 years. I speak along with David Grahame and Sushil Kamanahalli. David is the client applications architect and Sushil is the service layer architect.&lt;br /&gt;&lt;br /&gt;Special thanks go out to &lt;a href="http://blogs.msdn.com/markcarroll/"&gt;Mark Carroll &lt;/a&gt;for helping to organise this and to Ron Jacobs for the interview and the work to put it together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-4154793586730652728?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/4154793586730652728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=4154793586730652728&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4154793586730652728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/4154793586730652728'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/arcast-video-up-for-kiwibank-case-study.html' title='ARCast video up for Kiwibank Case Study'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-5567610435472615414</id><published>2007-03-22T21:05:00.001+12:00</published><updated>2007-04-10T19:39:01.643+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Commentary'/><title type='text'>Fashion at Government House!</title><content type='html'>&lt;p&gt;What a fantastic night. I had the absolute pleasure of seeing my wife, &lt;a href="http://www.miriamgibson.co.nz"&gt;Miriam Gibson&lt;/a&gt;, present her winter collection womens fashion wear at a charity event held at Government House in Wellington on Tuesday night. &lt;/p&gt;&lt;p&gt;It was magnificent. The show was held in the &lt;a href="http://www.gg.govt.nz/house/ballroom.htm"&gt;Ballroom&lt;/a&gt; with the Governer General, His Excellency The Honorable Anand Satyanand, and his wife, Her Excellency Mrs Susan Satyanand, army staff in regalia, members of &lt;a href="http://www.rotary.org.nz/"&gt;Rotary&lt;/a&gt; and the charitable organisation, &lt;a href="http://www.wellington-ras.org.nz/"&gt;Refugees as Survivors&lt;/a&gt;, and over 200 guests who had come to see the launch of the 2007 winter range and support a good cause.&lt;/p&gt;&lt;p&gt;And I was very, very, very impressed. Miriam, Victoria, Sue, Sarah, Veronica, and all the models - you all did a helluva job!&lt;/p&gt;&lt;p&gt;And standing up there following up the Governor General, the local Rotary head, and representatives of the charity with a speech on the podium with microphones, photographers, and press present. Crikey - my recent speaking engagements pale into comparison. &lt;/p&gt;&lt;p&gt;The range was fantastic so I definitely recommend checking it out: head to the stores in Margaret Rd, Raumati and Hunter St, Wellington, or check out the &lt;a href="http://www.miriamgibson.co.nz"&gt;web site&lt;/a&gt; to find out more (pictures from the event are promised over the next few days). Nothing for the guys, this is ladies only. And don't forget the &lt;a href="http://www.wellington-ras.org.nz/"&gt;charity&lt;/a&gt; - they're a very worthwhile cause in this country which has been the fortunate recipient of many refugees in the past, including the Polish half of my ancestry...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-5567610435472615414?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/5567610435472615414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=5567610435472615414&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5567610435472615414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/5567610435472615414'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/fashion-at-government-house.html' title='Fashion at Government House!'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3455281945912773946</id><published>2007-03-17T17:44:00.000+13:00</published><updated>2007-04-10T19:38:36.476+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Commentary'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>Rod Drury on investment for IP</title><content type='html'>&lt;a href="http://www.drury.net.nz/2007/03/17/building-intellectual-property/"&gt;http://www.drury.net.nz/2007/03/17/building-intellectual-property/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice the graph that Rod has obtained of normalised patents per country. See how NZ sits at about 0.5 in 22nd place. Finland rides at the head on 4.5 and the OECD average sits at just under 2 which means it's closer to Finland than NZ.&lt;br /&gt;&lt;br /&gt;This is a graphic representation of the under investment in R&amp;D in NZ compared to other countries. This isn't about centralised R&amp;amp;D run out of the government, but about the failing of companies to invest in product development. Great thing that Rod pointed this measure out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3455281945912773946?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3455281945912773946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3455281945912773946&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3455281945912773946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3455281945912773946'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/rod-drury-on-investment-for-ip.html' title='Rod Drury on investment for IP'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-8480635318488475185</id><published>2007-03-17T16:36:00.001+13:00</published><updated>2007-03-17T17:02:32.608+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>The Business, You and Me; Get It Together!</title><content type='html'>&lt;p&gt;If you've read some of the previous posts you may have realised that I currently work in the IT area of a bank: the chief architect role at Kiwibank in fact (as those who attended the keynote at the recent Microsoft NZ Tech Briefings, or have read our Microsoft &lt;a href="http://www.microsoft.com/casestudies/casestudy.aspx?casestudyid=200491"&gt;case study&lt;/a&gt; will know). Prior to Kiwibank I worked for a year at ENZA, then before that a few years at Deloitte Consulting, and prior to that I undertook a physics PhD from Victoria University in association with Industrial Research Ltd, a Crown Research Institute.&lt;/p&gt;&lt;p&gt;Each of these organisations has taught me a little bit more about how people work together and what makes us succeed in delivering. It has also highlighted the precarious and unappreciated position that the shared service line holds, especially the IT shared service line.&lt;/p&gt;&lt;p&gt;ENZA was an organisation that went during the year that I was there, from an external market focussed apple and pear exporter with producer board status and mandated export control, to a grower focussed commercial entity that retreated from the political environment of Wellington to the safety and security of the grower stronghold Hastings. As a company it had two strategic directions ahead of it, either strive to become a global category specialist based perhaps in one of the major trading hubs, or become a grower focussed organisation that showed it's value at the farm gate. Retreating was certainly the less risky option and it was that path that lead to the rationalisation with Turners and Growers in a 2003 merger.&lt;/p&gt;&lt;p&gt;At ENZA the (naive) question faced in 2000 was what part of the company represented the future of the business: the export facing arm or the grower facing arm. IT at this time was treated as a cost centre run under the finance group. And seeing as the organisation ran SAP it was certainly some cost. &lt;/p&gt;&lt;p&gt;In the middle of 2000 while working at ENZA I happened to come across a chap at Turners and Growers who explained that they were running a home grown software suite that was at the end of the tether. Myself and two others actually went and visited them in Auckland and it was apparent that they had problems. The obvious thought to the three of us was imagine combining the two organisations and taking advantage of the SAP implementation at ENZA. It would be a great asset right?&lt;/p&gt;&lt;p&gt;Well, that is indeed what happened. Someone out there saw the synergy: did Tony Gibbs think about this I wonder? Whoever it was they certainly knew a thing or two about SAP and IT in general. I note that there's now a &lt;a href="http://www.sap.com/services/pdf/CS_Turners_Growers.pdf"&gt;customer success story&lt;/a&gt; about SAP and Turners and Growers on the SAP web site.&lt;/p&gt;&lt;p&gt;Prior to that experience I was at Deloitte Consulting which presented me with opportunities to work in companies and organisations across government, the health sector, and telecommunications. Now for all the minor gripes that many of us had there at the time - long hours etc etc - one thing definitely stands out: the value of good people. I did work with some very good people and while often thrown in at the deep end we did ok. A small group went on to do especially well, witness Trademe and AMR. Being a consulting group we didn't have much of an IT function. Information Technology was a core attribute of our service line and overlaid across the group was a matrix model representing sector and service advocacy. I think it worked well.&lt;/p&gt;&lt;p&gt;In comparison many of the companies we worked for had well defined structures with strong vertical focus on product delivery. You'd walk into these organisations and there were barriers everywhere. Internal development was hardly ever undertaken. Individual business units would occasionally issue RFIs, RFPs or succumb to the salesmanship of a clever vendor. Work would always proceed on the basis of a long chain approach that ensured the people that understood what was possible never had a chance to really influence the development of new ideas in the organisation. Certainly not outside of the immediate business unit.&lt;/p&gt;&lt;p&gt;In these environments you'd always here the catch phrase: "it's up to the business to decide", or often from the PMs/BAs, "we have to listen to the business", or the classic "the business wants...".&lt;/p&gt;&lt;p&gt;The depressing thing is that this is more often voiced by the staff of the IT department than the business units themselves. If people in an IT department don't think they're value contributing then they deserve to be treated as a cost centre and outsourced to the likes of EDS or IBM.&lt;/p&gt;&lt;p&gt;It's a personal mission of mine that my application delivery group does not come out with the same nonsense. It's the innovation that comes from those that know what's possible combined with the people that can advocate for a customer, and those that know the financial constraints and tools, and those that can market the products that creates value contribution in a company. Any organisation that forgets the value of the combined talent of all its resources deserves to lose market value.&lt;/p&gt;&lt;p&gt;Oh, and Industrial Research? A depressing environment of disillusioned scientists with ideas but no knowledge of how to commercialise them...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-8480635318488475185?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/8480635318488475185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=8480635318488475185&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8480635318488475185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/8480635318488475185'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/business-you-and-me-get-it-together.html' title='The Business, You and Me; Get It Together!'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3129429922494005349</id><published>2007-03-15T22:08:00.001+13:00</published><updated>2007-04-10T19:40:06.287+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Wellington Microsoft Tech Briefing</title><content type='html'>&lt;p&gt;It was another great event yesterday and it's just fantastic to be seeing so many people. Wellington is my home town so there were plenty (plenty) of faces I recognised in the audience. A big thank you for opportunity goes out to Mark Carroll, Rebecca, Sean, Dean, Carol and all the others. Being the second time through the short speech I make in the keynote gave me a chance to think twice about the message I was trying to present.&lt;/p&gt; &lt;p&gt;And it's confirmed in my mind that the main message I want to get across to people is actively think about opportunities in their organisations, experiment with technologies and tools, and work on marketing any ideas they may come up with. It's how to make things happen and you know, life is too short to being dumb stuff when you could be doing cool stuff.&lt;/p&gt; &lt;p&gt;As a great way to finish off the day I got to attend the Microsoft Architects Council meeting at the hotel. I like to attend these events as it's a good chance to catch up with people I don't see every day.&amp;nbsp;We have an active group of people up and down the country that attend these events and the chance to explore ideas is never something to pass up.&lt;/p&gt; &lt;p&gt;Next week is the final Tech Briefing in Christchurch. I can't wait for this as I know by then I'll be wanting to tune the message once more!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3129429922494005349?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3129429922494005349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3129429922494005349&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3129429922494005349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3129429922494005349'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/wellington-microsoft-tech-briefing.html' title='Wellington Microsoft Tech Briefing'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2254247927589642474</id><published>2007-03-15T21:15:00.001+13:00</published><updated>2007-03-17T11:52:54.639+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>Prioritisation: Apples and Oranges</title><content type='html'>&lt;p&gt;Every company seems to share the ritual of the prioritisation session. It has a common format and a common process.&lt;/p&gt; &lt;p&gt;Each business head gets to voice their opinion on what's most important to them. These are dutifully collated into a master list and then a&amp;nbsp;discussion takes place to rank one above the other based upon some number of criteria; typically financial, customer experience, and compliance. Finally the agreed list is circulated for action.&lt;/p&gt; &lt;p&gt;It's value is normally limited because importance is not a good measure for prioritisation. &lt;/p&gt; &lt;p&gt;Importance is a measure of emotional conviction. It is a broad term that can mean many things depending upon the subject. The importance of a programme of work is not the same thing as the importance of an immediate fix, or the importance of a process review, or the importance of addressing a particular risk. In each case the definition of the term, importance, differs and therefore it can not be used for comparison. It is accurately a measure of emotional response, but I doubt little else.&lt;/p&gt; &lt;p&gt;What is the alternative? Perhaps it's better to ask what's the point.&lt;/p&gt; &lt;p&gt;The purpose of the prioritisation session is to allocate&amp;nbsp;scarce resources. Scarcity can only be resolved through a process of trade-off (this is text book economics). What complicates the task in an&amp;nbsp;organisation&amp;nbsp;are the differing time requirements, resource specialisations, and dependency effects.&lt;/p&gt; &lt;p&gt;We&amp;nbsp;have a&amp;nbsp;limited ability to weigh up the combination of time, resource, specialisation and dependency factors to determine how limited resources can be applied to a range of competing tasks. Our minds have to make best guess estimates and the wider the scope the greater the problem (I&amp;nbsp;bet someone out there can prove this is a power law expansion).&lt;/p&gt; &lt;p&gt;Which drives us to smaller delivery teams to reduce the scope of the problem.&lt;/p&gt; &lt;p&gt;So what should the prioritisation session be?&lt;/p&gt; &lt;p&gt;Perhaps to set areas of focus and&amp;nbsp;define the criteria for prioritisation. I doubt little more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2254247927589642474?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2254247927589642474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2254247927589642474&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2254247927589642474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2254247927589642474'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/prioritisation-apples-and-oranges.html' title='Prioritisation: Apples and Oranges'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-3957246587966115846</id><published>2007-03-13T18:32:00.001+13:00</published><updated>2007-03-17T11:52:54.640+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation'/><title type='text'>Innovation in the Corporate Environment</title><content type='html'>&lt;p&gt;This is a hot topic for me. I work in one of these environments and I'm involved in a fairly traditional (these days) role of enterprise architect: nominally responsible for the overall design of systems to ensure they meet business needs, and typically driven more from the perspective of policy and process than the introduction of new ideas. I'm afraid I'm not a very good enterprise architect. &lt;/p&gt;&lt;p&gt;Being on the back foot and not contributing to the ideas that form the basis of many of the commercial opportunities seems quite daft to me. &lt;/p&gt;&lt;p&gt;My aim in life is instead to communicate the opportunities of technology, or in fact, any thing that comes to mind actually. You know I went through university in a rather clueless manner and it's only now I see the possibilities of the methods taught to me at the time. There is just so much out there that can help give you an edge. (Wish I'd paid a bit more attention in the lecture rooms....)&lt;/p&gt;&lt;p&gt;Ensuring technology meets business needs is never going to see innovative solutions deployed, it's never going to see solutions applied when problems aren't yet realised to exist. How often have we looked around and seen only in retrospect that we missed the ball completely (trust me in my 4o years it's happened a helluva lot!).&lt;/p&gt;&lt;p&gt;So, yes, innovation is a hot topic for me.&lt;/p&gt;&lt;p&gt;Today I read an article syndicated from some offshute of &lt;em&gt;The Economist&lt;/em&gt; called, innovatively enough, &lt;em&gt;The Economist Newspaper&lt;/em&gt;, referring to the demise of traditional R&amp;D and the rise of a new form of directed innovation concentrating on the D aspect. I'm not against this, a lot of the great ideas out there (that I've missed the boat on) have typically only been a couple of years ahead of everyone else's thinking. But the fact they were ahead proved a significant advantage.&lt;/p&gt;&lt;p&gt;The article began by looking at the output of &lt;a href="http://en.wikipedia.org/wiki/Vannevar_Bush"&gt;Vannevar Bush&lt;/a&gt;, a gifted thinker in his own right, and an advisor to the Roosevelt and later administrations. It was Vannevar that spearheaded America's implementation of government and military funded R&amp;amp;D from the 1940s to the 1970s. "Industry is generally inhibited by preconceived goals, by its own clearly defined standards, and by the constant pressure of commercial necessity," he wrote in 1945. It still rings true today.&lt;/p&gt;&lt;p&gt;But, the days of the big labs are gone. Bell Labs has fallen apart, IBM's research labs are far more highly directed now, Microsoft Research nominally allow free reign but then look at the narrow range of papers on their site. Where's all the Research and what can a smaller company do?&lt;/p&gt;&lt;p&gt;It seems to me that in the mid-size corporate environment (with a few hundred staff) there is one classic failing: the creation of the product delivery chain. You know the one. It starts with the customer on the street, then there's marketing, then BAs, then project teams, and at the end of the line, the implementors.&lt;/p&gt;&lt;p&gt;Nothing driven down such a long chain will be innovative. The people at the end of the line act out a Dilbertesque cartoon living in perpetual frustration. The customers only get what they ask for; and no more. The nimble, smart companies out there create their own new niches and the slow ones are left to play catch up.&lt;/p&gt;&lt;p&gt;I think the secret to this is to keep team sizes down and allow small teams to experiment with ideas ensuring that at an overview level there is a process of nurturing and selection. Allowing failure to occur has to be an integral part. "Please fail very quickly - so that you can try again" says Eric Schmidt from Google.&lt;/p&gt;&lt;p&gt;Ground breaking products and processes are always due to the conceptual insights of individuals. So it should be the task of every innovative organisation to provide a mechanism to foster the intellectual output of their staff.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-3957246587966115846?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/3957246587966115846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=3957246587966115846&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3957246587966115846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/3957246587966115846'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/innovation-in-corporate-environment.html' title='Innovation in the Corporate Environment'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-7042647822624692200</id><published>2007-03-13T17:10:00.000+13:00</published><updated>2007-04-10T19:39:51.012+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Response Time Distributions, IIS Log Files, and the question of the Missing Events</title><content type='html'>Over the last year I've been involved in a number of investigations attempting to find bottlenecks in systems consisting of clients, web service hosts, and databases (usually containing application logic in addition to data). The details of each system's implementation is not especially important to this discussion because what I want to do here is just relate one of my recent experiences regarding measurement of response times. You might like to check if you get similar behaviour.&lt;br /&gt;&lt;br /&gt;Firstly, let's just describe the typical situation I find myself looking it. It's very generic, I'm sure the same thing will apply to you. I usually have some client systems accessing a service layer hosted in IIS6 talking to a database server (usually with significant embedded application logic).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5041258605766907442" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://1.bp.blogspot.com/_cWvIIiKNA4g/RfYl_gGeFjI/AAAAAAAAAAU/u3QY2vf8H2M/s320/Response+Time+Scenario+Description.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;br /&gt;The problem (or my lesson in this case) is how to interpret the numbers you get from the IIS log files on the web service hosts. These files give you HTTP request duration and the arrival time of the request. Now what happens when you naively plot a distribution of the the duration (ie request execution time)? You might expect a nice symmetrical peak centered on some value, or you might get something such as the following.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5041259812652717650" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://2.bp.blogspot.com/_cWvIIiKNA4g/RfYnFwGeFlI/AAAAAAAAAAk/7mduMkU7w0Q/s320/Response+Time+Distribution+Sample1.png" border="0" /&gt;&lt;br /&gt;I found that I was consistently getting this sort of shape across different types of requests. This isn't really all that unexpected. Each URI in the log file corresponds to a web service against which a number of web methods may be called. The web methods may have significantly different response times so the graph of the service call is really just a summation of all the individual web method calls. And in fact we've now implemented duration timing on each individual web method call, and in fact we get a much simplified distribution centred round one peak.&lt;br /&gt;&lt;br /&gt;Anyhow, while I was looking into the double peak I decided to look at the arrival rate and compare that to the duration of the call. Theoretically you should get a Poisson distribution for random, uncorrelated events and on those occasions when there were many simultaneous arrivals you'd also expect the response time to slow down (although whether this was linear/non-linear is another question).&lt;br /&gt;&lt;br /&gt;So, I looked for a period of time during which we have fairly constant activity and chose 2 hours in the middle of the day.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWvIIiKNA4g/RfYqqwGeFmI/AAAAAAAAAAs/j4KLHs6X3Pc/s1600-h/ArrivalRate.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_cWvIIiKNA4g/RfYqqwGeFmI/AAAAAAAAAAs/j4KLHs6X3Pc/s320/ArrivalRate.png" alt="" id="BLOGGER_PHOTO_ID_5041263746842760802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see that there's a nice distribution with the expected shape centred on 4 arrivals/second. Of course the IIS log files only record data when a request actually arrives. Looking at the bar graph you'd therefore naively expect about 300 one second intervals over the two hour period during which no requests arrived.&lt;br /&gt;&lt;br /&gt;And this is where I got a surprising result.&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cWvIIiKNA4g/RfYthgGeFnI/AAAAAAAAAA0/EIDOJ6uHGt0/s1600-h/ArrivalRateNonArrivals.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_cWvIIiKNA4g/RfYthgGeFnI/AAAAAAAAAA0/EIDOJ6uHGt0/s320/ArrivalRateNonArrivals.png" alt="" id="BLOGGER_PHOTO_ID_5041266886463854194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;So, it appears that the IIS HTTP arrival time is not accurate. I think that what I'm seeing here is that IIS is already queuing the requests up for processing - presumably because processing downstream is taking too long.&lt;br /&gt;&lt;br /&gt;If you get anything like this, have seen it before, or have a bit more knowledge of what is going on I'd love to hear about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-7042647822624692200?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/7042647822624692200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=7042647822624692200&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7042647822624692200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/7042647822624692200'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/response-time-distributions-iis-log.html' title='Response Time Distributions, IIS Log Files, and the question of the Missing Events'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cWvIIiKNA4g/RfYl_gGeFjI/AAAAAAAAAAU/u3QY2vf8H2M/s72-c/Response+Time+Scenario+Description.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-2504915293520433751</id><published>2007-03-12T21:27:00.000+13:00</published><updated>2007-09-18T15:38:35.946+12:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Powershell versus Perl</title><content type='html'>I've just been preparing some data for a post which I've been meaning to put up for a few months now. The data comes from an IIS log file and I need to pull out of it the time of the HTTP request, the HTTP service (uri-stem), and the duration of the request (time-taken). In the past I've always used Perl for this sort of task taking advantage of the regular expression syntax to extract my chosen data elements. For a 50MB sample log file (all logging options turned on) this takes approximately 12 seconds.&lt;br /&gt;&lt;br /&gt;The Perl I've just used to test this follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;use File::DosGlob 'glob';&lt;br /&gt;use File::DosGlob 'GLOBAL_glob';&lt;br /&gt;&lt;br /&gt;@logfiles = glob "ex*.log";&lt;br /&gt;&lt;br /&gt;for my $logfile (@logfiles) {&lt;br /&gt;&lt;br /&gt;  open(INFILE, "$logfile");&lt;br /&gt;  $logfile =~ s/ex//g;&lt;br /&gt;&lt;br /&gt;  open(OUTFILE, "&gt;$logfile");&lt;br /&gt;&lt;br /&gt;  while() {&lt;br /&gt;      if (m"^(\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d).*/(.*\.asmx).*\s(\d+)$") {&lt;br /&gt;          $file = lc($2);&lt;br /&gt;          print OUTFILE "$1\t$file\t$3\n";&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  close(INFILE);&lt;br /&gt;  close(OUTFILE);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, since I've started using Powershell recently to extract and manipulate data for analysis I thought I'd also try the same thing with that. Note I'm just a beginner at this so I could be doing this the wrong way but here's what I tried:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;pre face="consolas,'Courier New',courier,monospace" size="8pt" color="white" style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt;"&gt; &lt;/pre&gt;&lt;pre face="consolas,'Courier New',courier,monospace" size="8pt" style="border-style: none; margin: 0em; padding: 0px; overflow: visible; width: 100%; color: black; line-height: 12pt; background-color: rgb(244, 244, 244);"&gt;Get-Content ex070223.log | &lt;/pre&gt;&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt; &lt;/pre&gt;&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt;-object { &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; ($_ &lt;span style="color: rgb(204, 102, 51);"&gt;-match&lt;/span&gt; &lt;span style="color: rgb(0, 96, 128);"&gt;"(?^\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d).*/(?.*\.asmx).*\s(?\d+$)"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt; { &amp;amp; { $matches[&lt;span style="color: rgb(0, 96, 128);"&gt;"occured"&lt;/span&gt;] + &lt;span style="color: rgb(0, 96, 128);"&gt;","&lt;/span&gt; + $matches[&lt;span style="color: rgb(0, 96, 128);"&gt;"service"&lt;/span&gt;] + &lt;span style="color: rgb(0, 96, 128);"&gt;", "&lt;/span&gt; + $matches[&lt;span style="color: rgb(0, 96, 128);"&gt;"duration"&lt;/span&gt;] } } }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;The regular expression syntax is very powerful, I like the named matches - I guess this is a straight .net runtime feature, but I'm easily impressed. However, the time it takes to complete is abominable! It took 20 minutes to complete where the Perl program took 12 seconds.&lt;br /&gt;&lt;br /&gt;Still, the power available from the command line is impressive...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-2504915293520433751?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/2504915293520433751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=2504915293520433751&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2504915293520433751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/2504915293520433751'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/powershell-versus-perl.html' title='Powershell versus Perl'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6909964728162059018</id><published>2007-03-07T20:51:00.000+13:00</published><updated>2007-03-15T21:31:46.604+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Gadgets</title><content type='html'>I'm having a relaxing evening now after an exciting day mostly spent in Auckland at a Microsoft Tech Briefing. A great experience for me as I had the opportunity to be part of the key note speech. I happen to work for an up and coming NZ bank and I was able to present some of the experiences I've gained from my time in the bank - from being a member of a 20 something project team in 2001 - before the bank establishment - to the present day: an organisation of 700 with a 6 month profit of $11m.&lt;br /&gt;&lt;br /&gt;The experience of being part of the key note was enlighting in itself. The nervous energy beforehand, the videos, sound, lighting, the 900+ people in the room, being part of a team that consisted of some much brighter people than I, it was great. And I still have Wellington and Christchurch to come over the next 2 weeks! What a buzz! I've never spoken to so many people before. For better or worse, the nearest thing to it in my memory is being 14 and being asked to recite a poem at my uncle's funeral. He was a very popular person and the church was packed. As sad as the event was I still remember the energy of the occasion clearly.&lt;br /&gt;&lt;br /&gt;Of the event itself, and the reason for this posting, was the cementing in my mind of the importance of Vista's new gadgets. &lt;a href="http://turtle.net.nz/blog/"&gt;Jeremy Boyd&lt;/a&gt; of &lt;a href="http://www.mindscape.co.nz/"&gt;Mindscape&lt;/a&gt; demonstrated a remarkable gadget for the approval of Vista Dreamscene videos on a community site (can't find it - maybe they haven't put it live on the net?). This particular gadget used the capabilities of WCF to securely connect to a service and perform an operation. Working as enterprise architect at a bank you can imagine my interest. I've been harping on about this at work for a while now and recently noticed a &lt;a href="http://bankervision.typepad.com/bankervision/2007/03/financial_servi.html"&gt;blog post&lt;/a&gt; from someone I've met that used to work as a banking consultant at the Microsoft Sydney office, (&lt;a href="http://bankervision.typepad.com/"&gt;James Gardner&lt;/a&gt;). It's just a matter of time... will we get there first?&lt;br /&gt;&lt;br /&gt;The question of who get's there first was actually one of the main themes of my presentation. Looking at the way in which innovation can occur. Looking back on my historical work experiences I can now see how large corporates fail so often at delivering innovation. They start off so nimble and quick and then slow down to a near grinding halt. Achieving change becomes increasingly difficult because of the burden of process and competition of people. Does it have to be this way?&lt;br /&gt;&lt;br /&gt;I'm sure I'm going to post more on this but it seems to me that there's a lot to be learnt from the field of R&amp;D in traditional high risk, high reward industries and the application of R&amp;amp;D to service based industries. I know the potential margins haven't traditionally been seen as high enough to counter the cost but I think the time is right. I believe the risk reward matrix is increasingly favouring small experimental developments to highlight problem domains and visualise potential solutions. If we just manage to do those two things we'll be making downstream project delivery so much better (let alone considering the commercial benefits).&lt;br /&gt;&lt;br /&gt;I strongly feel that the opportunities for applying technology are stronger today than ever before. It's the technologists who are currently creating the business models of tomorrow, not the business school graduates.&lt;br /&gt;&lt;br /&gt;In the meantime, I recommend following JB, &lt;a href="http://blog.bluecog.co.nz/"&gt;JD&lt;/a&gt;, and Andrew at Mindscape - they are a clever bunch of guys. I'm sure they'll go far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6909964728162059018?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/6909964728162059018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=6909964728162059018&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6909964728162059018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/6909964728162059018'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2007/03/gadgets.html' title='Gadgets'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-1009693670354917778</id><published>2006-12-07T19:51:00.001+13:00</published><updated>2007-03-15T22:44:22.317+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAF'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>SAF 2006 - A Retrospective View</title><content type='html'>&lt;p&gt;It's a few days since the event now, the small details are beginning to fade away, and I can look back now and think about the overriding themes. Of these, one strikes me more than any other: a statement from Garry Flake which went roughly like "the Internet is an increasingly complete reflection of reality". &lt;/p&gt;&lt;p&gt;Garry's presentation ("How I learned to stop worrying and love the imminent Internet singularity") took a look ahead at the future. He picked up on an idea published in 1993 by Vernor Vinge: the idea that the exponential speed of technological improvements will produce super-human capabilities, making the future unknowable, an idea that I think harks back to Arther C Clarke and the concept that any sufficiently advanced technology constitutes magic. Vernor coined this occurence a singularity because we have no knowledge of the future beyond that point. This is an interesting thought, especially with respect to the Internet. Garry highlighted (as had Charles Fitzgerald in his earlier presentation, "Software and Services") that information technology is most strongly advancing in two areas: memory and networking. Both of these are improving well ahead of the rate of improvement of processing power. (But as for other areas of technology, I personally doubt we're making such significant progress. Don't you think that living from 1900 to 1970 would have been just as remarkable as living from 1940 to the present?)&lt;/p&gt;&lt;p&gt;With a near future characterised by a massive increase in easily accessible storage and network bandwidth it shouldn't be surprising that more and more information about our daily lives and the world around us will be stored and catalogued for later use. The stored information will increasingly reflect the detail of the real world and the Internet will increasingly become a reflection of reality.&lt;/p&gt;&lt;p&gt;To me this is a wonderful concept because it means that we have a representation of reality that's accessible, can be queried, and is an enabler to learn about our world and improve it. To business it should also be wonderful because it opens up opportunities in many more ways than are possible now: mining, characterising, segmenting, predicting, combining, and in general just responding better to customer needs.&lt;/p&gt;&lt;p&gt;The reflected electronic world of information and the services that operate on that information will also provide value from the integration across organisation boundaries. If you can spot the opportunity that links a group of disparate services together you could be clipping the ticket to your first billion. This is the basis of the mashup and we're sure to see making unexpected outcomes from the smart combination of diverse services and information.&lt;/p&gt;&lt;p&gt;The feflected reality was not the only nugget to come out from the SAF, there were also several other ideas that came through the presentations and roundtable workshops I attended. &lt;/p&gt;&lt;p&gt;Bill Gates highlighted the limitations and short life ahead of the existing web browser model; Ray Lane emphasized the uneconomic application development environment present in the US and the likely impact of globalisation; Norm Judah gave a great overview of how Microsoft manage their own internal services; Garry Flake presented on the Innovators Dilemma, and there was a lot of discussion across all presentations on the long tail effect.&lt;/p&gt;&lt;p&gt;Bill Gates' brief discussion of the future of the browser came up during the Q&amp;A session at the end of the SAF. He made the point that the web browser was designed in the 1990s to fulfill a need to deliver an interface to a system over a limited bandwidth link. That environment is not true now and we know it will be increasingly invalid going forward. Network bandwidth is increasing rapidily so you can envisage a future where you connect to a system on the Internet and a much more functional application interface is downloaded and run on your device using some sort of application hosting environment (perhaps based on a virtual machine created for the session, or a sandboxed machine such as you get with .NET and Java). The standards for this form of interactivity have a long way to go but the direction is clear. I wonder how long before this will impact the next generation of Internet sites?&lt;/p&gt;&lt;p&gt;Ray Lane's presentation of the economic problems of the application development market highlighted the large number of existing small development companies, the available venture funding, the commoditization occuring in the development process and as a result the market contraction we can expect (up to 70% of existing companies going). However, Ray also highlighted the new opportunities created by the long tail and networking effects hence the name of the presentation, "The Personal Enterprise".&lt;/p&gt;&lt;p&gt;Norm Judah's presentation of "The Last Architectural Mile" showed us how Microsoft run their own services. This eye opener showed them using their own toolsets to manage their data centres with millions of servers. The use of the Business Scorecard Manager to present their current status was great as was the simple idea that success of failure occurs in the last mile. Delivering into production is so important and yet, while complex IT systems are designed with great thought and effort, the human processes that operate those systems are often not.&lt;/p&gt;&lt;p&gt;Garry Flake's singularity presentation also introduced the innovator's dilemma (first coined by &lt;a title="Clayton M. Christensen" href="http://en.wikipedia.org/wiki/Clayton_M._Christensen"&gt;Clayton M. Christensen&lt;/a&gt; and described in his &lt;a title="1997" href="http://en.wikipedia.org/wiki/1997"&gt;1997&lt;/a&gt; book &lt;a title="" href="http://www.amazon.com/Innovators-Dilemma-Technologies-Management-Innovation/dp/0875845851/sr=8-2/qid=1165895782/ref=pd_bbs_2/102-3261394-8495351?ie=UTF8&amp;amp;s=books"&gt;The Innovator's Dilemma&lt;/a&gt;), that innovation comes from the bottom not the top. As companies become established new start ups innovate and then take over the entranched company's market. Companies that survive show an ability to sustain innovation by being prepared to make significant change (or destroy themselves as Garry put it). I wonder to what extent you can say that we've seen this with the likes of IBM and Microsoft? Certainly IBM have moved a long way from the days when the mainframe was their core deliverable. One thing that does mark both companies is their massive investment in R&amp;D, billions of dollars per year. Garry is an example of the impact of Microsoft Labs, his team form Live Labs, a collaboration with MS Research that is developing the functionality you can now get now through &lt;a href="http://www.live.com"&gt;www.live.com&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;The concept of an increasingly accurate reality represented on the Internet was an overriding theme throughout the event. The impacts are diverse; the wealth of information, the potential outcomes from better analysis, providing richer choice, responding better to people, clustering, trending, making decisions at the edge, networked opportunities, the long tail. I've tried to put some order to these ideas in the bullet pointed list below and in the posts under this you'll see the notes I recorded at the time of the presentations. Some of these notes I posted on the Internet as soon as I'd finished writing them in the lecture rooms, and others I posted over the last couple of days from the notes I'd taken on my laptop. Hope it's helpful.&lt;/p&gt;&lt;p&gt;Change Drivers: Opportunity Creation from Changing Technology&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Storage and networking improving much faster than local cpu &lt;li&gt;Parallel processing increasingly applied to overcome limitations in cpu speed increases &lt;li&gt;This is opening up new opportunities due to network effects &lt;ul&gt;&lt;li&gt;The long tail &lt;ul&gt;&lt;li&gt;The affect of the many in the tail can be greater than the few in the head&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The internet is increasingly mirroring the physical world&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Internet as a Mirror of Reality&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Responding to people &lt;li&gt;Understanding people &lt;li&gt;How? &lt;ul&gt;&lt;li&gt;You can't manage what you can't measure&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Analytics &lt;ul&gt;&lt;li&gt;Application to numerous areas &lt;ul&gt;&lt;li&gt;Process improvement &lt;li&gt;Understanding and responding to human behaviours &lt;li&gt;Processing of different data types &lt;ul&gt;&lt;li&gt;Text &lt;li&gt;Numeric &lt;li&gt;Image data &lt;li&gt;Sound&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The internet increasingly mirrors real life - the data on the net is becoming an increasingly complete representation of real life &lt;ul&gt;&lt;li&gt;Brute force statistical analysis &lt;ul&gt;&lt;li&gt;Trending &lt;li&gt;Clustering&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Personal choice &lt;ul&gt;&lt;li&gt;Make options available &lt;li&gt;Natural selection and evolution &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Beware human faults &lt;ul&gt;&lt;li&gt;The Innovators Dilemma &lt;ul&gt;&lt;li&gt;Look down as well as up&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Take advantage of the masses - the long tail &lt;ul&gt;&lt;li&gt;Opportunities exist due to the accessibility of the many&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Decision making at the edge &lt;ul&gt;&lt;li&gt;Responding to your customers at the edge of your organisation &lt;em&gt;versus&lt;/em&gt; centralised product development &lt;li&gt;Responding at the edge is equivalent to greater customer focus &lt;li&gt;Create networked opportunities &lt;ul&gt;&lt;li&gt;Connect individual to individual&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Great local example - Seattle traffic reporting via the internet&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-1009693670354917778?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bohdanszymanik.blogspot.com/feeds/1009693670354917778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17672034&amp;postID=1009693670354917778&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1009693670354917778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17672034/posts/default/1009693670354917778'/><link rel='alternate' type='text/html' href='http://bohdanszymanik.blogspot.com/2006/12/saf-2006-retrospective-view.html' title='SAF 2006 - A Retrospective View'/><author><name>Bohdan Szymanik</name><uri>http://www.blogger.com/profile/13123728021973733938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17672034.post-6902267869474027278</id><published>2006-12-07T19:45:00.001+13:00</published><updated>2007-03-15T22:44:22.318+13:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAF'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>SAF06 - The Personal Enterprise</title><content type='html'>Ray Lane  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Commoditisation&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Cost of software reducing  &lt;li&gt;Costs for software 10% of current  &lt;li&gt;70% of companies will go  &lt;li&gt;$4.7 billion going in as venture capital in US market  &lt;li&gt;Nicolas Carr – IT doesn’t matter...&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Globalisation  &lt;ul&gt; &lt;li&gt;US market leadership lost  &lt;li&gt;Existing model uneconomic  &lt;ul&gt; &lt;li&gt;Too many competitors within a limited region&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Market Demand  &lt;ul&gt; &lt;li&gt;SMB market growth strong  &lt;li&gt;Enterprise market limited&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Future&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Leverage community power  &lt;ul&gt; &lt;li&gt;Mash ups etc&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Enabling user generated content  &lt;li&gt;Apps from services  &lt;li&gt;Personal history  &lt;ul&gt; &lt;li&gt;Activity  &lt;li&gt;Alive&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Context  &lt;li&gt;Relationship status and value and history&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Seven Laws for Success in the Personal Enterprise&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Serves individual need  &lt;li&gt;Viral adoption  &lt;li&gt;Contextual and personal  &lt;li&gt;No train  &lt;li&gt;Delivers instantaneous value  &lt;li&gt;Utilises social networks  &lt;li&gt;No IT&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Examples&lt;/p&gt; &lt;ul&gt; &lt;li&gt;WebEx  &lt;li&gt;Skype  &lt;li&gt;IM  &lt;li&gt;SuiteTwo  &lt;li&gt;Google desktop  &lt;li&gt;SFDC  &lt;li&gt;Monster&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17672034-6902267869474027278?l=bohdanszymanik.blogspot.com' alt='' /&gt;&lt;/div&gt;<
