<?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-10236702</id><updated>2011-04-21T22:43:15.091+01:00</updated><category term='csharp'/><category term='requirements'/><category term='dotnet'/><category term='usecases'/><category term='software'/><title type='text'>The blog of Tobin</title><subtitle type='html'>Tobins nerd blog on .NET, Software, Tech and Nice Shiny Gadgets.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10236702.post-9184231475711544480</id><published>2006-11-21T23:43:00.000Z</published><updated>2006-11-22T00:14:09.082Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='usecases'/><title type='text'>Use Cases Anyone?...</title><content type='html'>I've been doing sofware commercially since I graduated in the year 2000, and I've never lost my admiration of Use Cases.&lt;br /&gt;&lt;br /&gt;The Sofware Engineering course showed me a lot of doors: UML, MDA, SSADM, DFDs, ERDs, you name it... At one point I remember reading Alistair Cockburns book "Writing Effective Use Cases". It opened my eyes. I thought use cases were little pictures in a UML diagram, and he taught me that there was much more to them than that.&lt;br /&gt;&lt;br /&gt;If you've not got into Use Cases, I suggest you take a good look (or a peek, at least).&lt;br /&gt;&lt;br /&gt;What they effectively give you is a method for gathering requirements. They encourage you to approach the system from the viewpoint of those people that will interact with your software. They give you a way of organising your requirements in a fashion that suits you - as loose, rigid, simple or detailed as you like. I shouldn't underestimate the word &lt;span style="font-style: italic;"&gt;simple&lt;/span&gt; there, use cases can be extremely bare-bones (1-2 lines of text) if you wish and still provide much value.&lt;br /&gt;&lt;br /&gt;By the end of a very brief use case iteration you should have ring-fenced exactly what capabilities your software will and will not provide. You'll also know every job-role that's gonna be using the solution, what other external systems your interacting with such as ERPs, MS Office Programs, Flat Files, anything non-human basically that plays a part. Finally, if you're willing to leave the technical world you can also elicit what the executives wish to get out of it from a business perspecive (actually, this is crucial IMHO). A brief use case iteration can certainly reveal a lot of things you might not have thought to ask.&lt;br /&gt;&lt;br /&gt;This brief iteration might leave you with a use case specification with many many gaping holes. You'll be thinking "I wander what &lt;span style="font-style: italic;"&gt;exactly &lt;/span&gt;this bit of the software needs to do", Now that you can see these holes you can make sensible decision as to whether the you need to warrant spending more inception time working out the muddy details. After all, hopefully the client is a phone call away... This is a good position to be in.&lt;br /&gt;&lt;br /&gt;Despite my like for use cases, I don't come across too many folk in the industry that use them. I'm all for wireframes, site-maps, CRUD matrices and "the software is the specification", but it's weird how so many seem to have missed out.&lt;br /&gt;&lt;br /&gt;Is anyone out there using Use Cases? Anyone moved on to better things?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;SHAMELESS PLUG - I was considering publishing or selling a variety of example &lt;/span&gt;&lt;span style="font-style: italic;"&gt;use case &lt;/span&gt;&lt;span style="font-style: italic;"&gt;documents, which would be based on those that were developed for real projects of budget s ranging from £1K to £50K. The idea being that, if anyone is intersted in learning from real working use cases for real projects, then these would be ideal. If anyone is interested let me know. My plan would be to carefully doctor the real use cases so that they still retain that real feel, but are based on ficticious requirements.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-9184231475711544480?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/9184231475711544480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=9184231475711544480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/9184231475711544480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/9184231475711544480'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/11/use-cases-anyone.html' title='Use Cases Anyone?...'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-3952693570063631387</id><published>2006-11-21T22:59:00.000Z</published><updated>2006-11-21T23:37:15.970Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>.NET 2.0 Got Better with Dynamic Dispatching</title><content type='html'>Ok, I'm behind the times. Despite using .NET 2.0 on a few small projects, I've not fully got into  all the c# language improvements for .NET 2.0 yet.&lt;br /&gt;&lt;br /&gt;However, today I was very pleasantly surprised to find that this works...&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;public void SayIt(String aString)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Console.WriteLine("I got a string {0}", aString);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void SayIt(int anInt)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Console.WriteLine("I got a interesting int {0}", anInt);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void SayIt(object anObject)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Console.WriteLine("I didn't get anything in particular, but it looks like this: {0}", anObject.ToString() );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SayIt("Hello"); &lt;span style="color: rgb(0, 102, 0);"&gt;// outputs "I got a string Hello"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SayIt(2); &lt;span style="color: rgb(0, 102, 0);"&gt;//outputs "I got an interesting int 2"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SayIt(new System.Net.Cookie("lastLoggedIn","01-Jan-2006"));&lt;span style="color: rgb(0, 102, 0);"&gt;// outputs "I didn't get anything in particular, but it looks like this: lastLoggedIn=01-Jan-2006"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is cool stuff - it's called &lt;a href="http://en.wikipedia.org/wiki/Dynamic_dispatch"&gt;Dynamic Dispatching&lt;/a&gt;, and it makes solving certain problems much easier. For example, if you've ever tried to use the &lt;a href="http://c2.com/cgi/wiki?VisitorPattern"&gt;Visitor pattern&lt;/a&gt; in .NET, you'll know what I mean: dynamic dispatching lets you set up handlers for each node type in the heirarchy without using statements such as &lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;if(node is string){...}else if(node is Cookie){...}&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Similarly, I recall trying to set up some kind of &lt;a href="http://www.research.ibm.com/designpatterns/pubs/typed-msg.html"&gt;multicast pattern&lt;/a&gt; in .NET, but being stumped (I learnt about this in the &lt;a href="http://www.amazon.co.uk/Pattern-Hatching-Patterns-Applied-Software/dp/0201432935"&gt;Pattern Hatching book&lt;/a&gt;). The new addition of Dynamic Dispatching should allow recievers to be set up quite easily, interesting stuff indeed!...&lt;br /&gt;&lt;br /&gt;This is all good, I'm looking forward to checking out c# v2 a little more.&lt;br /&gt;&lt;br /&gt;If anyone knows any good books/sites that hightlight all the new language features, then I'm all ears! For anyone who's interested, I found the &lt;a href="http://www.dotnetcat.com/news/C-sharp/"&gt;dotnetcat.com&lt;/a&gt; site seemed to show a few cool new capabilities in concise format.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-3952693570063631387?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/3952693570063631387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=3952693570063631387' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/3952693570063631387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/3952693570063631387'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/11/net-20-got-better-with-dynamic.html' title='.NET 2.0 Got Better with Dynamic Dispatching'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115943515437797395</id><published>2006-09-28T10:08:00.000+01:00</published><updated>2006-09-28T10:42:48.470+01:00</updated><title type='text'>Jason Fried on Browsers</title><content type='html'>&lt;a href="http://www.computerworld.com/blogs/node/3595"&gt;Jason Fried's comments&lt;/a&gt; at the MIT Emerging Techologies Conference make a fair point. The browser &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; a good platform as long as browser manufacturers don't keep making life hard for web app publishers.&lt;br /&gt;&lt;br /&gt;From a user perspective it's desirable not to have to install separate applications for apps such as Flickr and Basecamp.&lt;br /&gt;&lt;br /&gt;I still think things will get a lot better as browsers improve and creating richer GUIs gets easier for the developer.&lt;br /&gt;&lt;br /&gt;One thing I was thinking is that it would be handy to have a single point of sign on when you  open the browser. The browser then passes relevant username/passwords to any sites that require them. Having to remember usernames/logins for every site is still an obstacle that hinders the simplicity of browser based applications. If a single mechanism could address the problem in one sweep, it would make life easier for users.&lt;br /&gt;&lt;br /&gt;Microsoft Passport and "remember me" cookies are a step forward, but I think things could be improved if there were a standard that the browser inherently supported.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115943515437797395?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115943515437797395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115943515437797395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115943515437797395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115943515437797395'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/09/jason-fried-on-browsers.html' title='Jason Fried on Browsers'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115831804832395017</id><published>2006-09-15T11:50:00.000+01:00</published><updated>2006-09-15T12:02:18.230+01:00</updated><title type='text'>Parsing HTML and XHTML in .NET</title><content type='html'>&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;Bear™ says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;know of any good .NET xhtml parsers that are free?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;Bear™ says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;something that will correct tags on the fly&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;Bear™ says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;like;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;myString = HTMLParser.Parse ( mySource )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;Tobelerone says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;SgmlReader - use it alot and is good. &lt;/span&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=B90FDDCE-E60D-43F8-A5C4-C3BD760564BC"&gt;http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=B90FDDCE-E60D-43F8-A5C4-C3BD760564BC&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Html Agility Pack - is good too&lt;/span&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://sharptoolbox.com/tools/html-agility-pack"&gt;http://sharptoolbox.com/tools/html-agility-pack&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Devcomponents HtmlDocument - very good (I use it too) but costs $99&lt;/span&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.devcomponents.com/htmldoc/download.html"&gt;http://www.devcomponents.com/htmldoc/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Chilkat HtmlToXml - haven't used but buying soon!&lt;/span&gt;&lt;br /&gt;&lt;a style="color: rgb(0, 0, 153);" href="http://www.chilkatsoft.com/HtmlToXmlDotNet.asp"&gt;http://www.chilkatsoft.com/HtmlToXmlDotNet.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Bear™ says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;wow&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Bear™ says:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;thanks! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using components that convert HTML to XHTML/XML is a great way to go if you need to mine information from web documents.&lt;br /&gt;&lt;br /&gt;The best part of these converters is that they take badly written HTML (with broken tags etc) and fix it up as best they can, so you get a well formed XML document which you can work with.&lt;br /&gt;This then lets you do lovely things such as:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;//find all link tags on a web page&lt;br /&gt;XmlNodeList linkNodes = xmlDoc.SelectNodes("//a[@href]"); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;&lt;br /&gt;//find all heading tags on a page&lt;br /&gt;XmlNodeList headingNodes = xmlDoc.SelectNodes("//h1 or h2 or h3 or h4"); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Good eh!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115831804832395017?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115831804832395017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115831804832395017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115831804832395017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115831804832395017'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/09/parsing-html-and-xhtml-in-net.html' title='Parsing HTML and XHTML in .NET'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115533665415683178</id><published>2006-08-11T23:17:00.000+01:00</published><updated>2006-08-11T23:50:54.753+01:00</updated><title type='text'>200Mbs Network Through Your Mains Sockets</title><content type='html'>I'm one of the unfortunate people who is useless at D.I.Y. I'm also unfortunate because my ADSL line was installed in the most useless place in the house and I'm incapable of sorting it out. (think hallway, near none of the rooms where I use a computer).&lt;br /&gt;&lt;br /&gt;Rather than rip up floors, drill holes, or trail CAT5 cables throughout the house, I decided to invest in WiFi gear. It's pretty good, I just keep my router/wifi bridge and NAS gear in a small cabinet near the ADSL point. Then, all my PCs etc are wi-fi enabled, so no wires needed.&lt;br /&gt;&lt;br /&gt;However, sometimes the WiFi is a bit slow, and I was thinking that I'd like my office computers to at least be able to talk to each other very quickly, rather than having to bounce singals through the WiFi access point.&lt;br /&gt;&lt;br /&gt;My first thought was to stick another hub in the office, and have all the computers wired through the hub in that room. That way they can all talk to each other quickly. However, they'd be iscolated from the WiFi network, so to get around this I could also plug a WiFi bridge into the hub to relay the signal from the main WiFi access point. Would this work? Can't see why not, but then 4 computers in my office would be sharing one 54Mbs WiFi link.&lt;br /&gt;&lt;br /&gt;I was reading around, and stumbled upon an option I'd not considered. Basically, technology exists that allows you to use your mains electricity wiring for network traffic. This stuff isn't new, but it looks like the manufacturers have been busy and started to really make the technology usable. Apparently you can get a 200Mbs unit these days, which is fairly fantastico! Actually, these things only realistically transfer around 60Mbs, but this is still a tad faster than your average WiFi network according to &lt;a href="http://www.avsforum.com/avs-vb/showthread.php?t=698489"&gt;some folk&lt;/a&gt; and &lt;a href="http://www.adslguide.org.uk/hardware/reviews/2005/q3/devolo85.asp"&gt;a review&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;If you ever trust Amazon.co.uk reviews,  &lt;a href="http://www.amazon.co.uk/gp/product/B000A7IE7Y/sr=8-1/qid=1155335606/ref=sr_1_1/026-3884420-0477243?ie=UTF8&amp;amp;s=gateway"&gt;these products&lt;/a&gt; got 5 stars from all users!&lt;br /&gt;&lt;br /&gt;In case you want to look further into these products, try googling for BPL or Broadband over Power Line products.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netgear.com/Products/BridgesAccessPointsandExtenders/PowerlineWallPluggedExtenders/HDXB101.aspx"&gt;Netgear claim to have one&lt;/a&gt; that gives a whopping 200Mbs! I think I might have to invest, sounds great...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115533665415683178?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115533665415683178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115533665415683178' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115533665415683178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115533665415683178'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/08/200mbs-network-through-your-mains.html' title='200Mbs Network Through Your Mains Sockets'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115487205853396064</id><published>2006-08-06T14:18:00.000+01:00</published><updated>2006-08-06T14:47:38.603+01:00</updated><title type='text'>Write Cleaner and Clearer ASP.NET Session Code</title><content type='html'>I recently worked on an ASP.NET project where the original developer had made quite a lot of use of the session. There was lots of code like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if not Session("userid") is nothing then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if not Session("userid") = "" then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if Session("customertype") = 2 then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;    discountedPrice = price - (price * Session("discount")/100)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;end if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The project was reasonably small and I wasn't hired to clean code. However, there's a number of problems with this code that make life difficult, so I wanted to improve things a little. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Don't Repeat Yourself&lt;/span&gt;&lt;br /&gt;Firstly, we've got some business logic repeated all over the site. The developer is using the&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-family: courier new;"&gt;if Session("userid") = "" then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;to check to see if the user is logged in. He's also used different variations of this rule on different pages, such as&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if Session("userid") is Nothing then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is messy, inconsistant, and in violation of the great Don't Repeat Yourself (DRY) principle. A better way is this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if not SessionHelper.IsUserLoggedIn then ....&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To make this work you need to make a class called SessionHelper that contains static methods for all the logic you need.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;''' &lt;summary&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;''' Creates a handy wrapper for accessing session variables in a clear way.&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;''' &lt;/summary&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;Public Class SessionHelper&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;    public shared readonly property get IsLoggedIn as Boolean&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;        get&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;            if Session("userid") is nothing&lt;br /&gt;                return false&lt;br /&gt;            else if Session("userid") = String.Empty&lt;br /&gt;                    return false&lt;br /&gt;                end if&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;        end get&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;    end property&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;End Class &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think that it's much clearer, and if we want to change our "IsLoggedIn" rule, we only have to do it in one place.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;You may be wandering why the developer didn't use .NETs Forms Authentication for this application, rather than the session. I'm not quite sure why to be honest!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Purpose of Code is Not Clear&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consider this line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if Session("customertype") = 2 then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We've got a couple of problems here. The first is a &lt;span style="font-style: italic;"&gt;magic number&lt;/span&gt; - 2. Any new developer to the project will have to dig around to find out what "2" means, which wastes his or her time. A cleaner way is this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;Dim TRADE_CUSTOMER as long = 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if Session("customertype") = TRADE_CUSTOMER then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You could even define it as a &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;const&lt;/span&gt; somewhere so that it's available to all pages and code-behinds.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note that in the Refactoring book (Martin Fowler), this refactoring is called "Introduce Explaining Variable".  In case you've not come across refactorings, they're basically little rules you can use to clean up smelly code.  See  &lt;a href="http://www.refactoring.com"&gt;www.refactoring.com&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An further improvement to that might be this&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if Session("customertype") = CustomerTypes.TradeCustomer then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here an Enum is used to represent customer types:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;Public Enum CustomerTypes&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;    UnknownCustomer = 0&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;    RetailCustomer = 1&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;    TradeCustomer = 2    &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;End Enum&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using the SessionHelper, we could do one final improvement which is this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;if SessionHelper.CustomerType = CustomerTypes.TradeCustomer then ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which is clearer still.&lt;br /&gt;&lt;br /&gt;You may have guessed that I subscribe to the belief that code is something that should usually be expressive and clear. I've not come across many projects where the code doesn't require modifying and changing over time, therefore clarity can drastically affect how easy it is to change.&lt;br /&gt;&lt;br /&gt;Think of it this way, every time you write some code you can chose how much time and money it should cost to maintain. If the block of code is going to be thrown away soon, then it may make sense not to invest too much time making it maintainable. However, if you anticipate returning to a block of code a lot then it would save you much time to make it highly maintainable. Also, once you practice writing cleaner code it tends to come more naturally (that said, I still make the odd dogs dinner despite best intentions!)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: rgb(0, 0, 102);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some other thoughts&lt;br /&gt;&lt;/span&gt;One thing I considered when working on this project was weather to stop storing so much stuff in the session. The session is great because it's easy to access, but there are a couple of downfalls.&lt;br /&gt;&lt;br /&gt;The longer some data is in the session, the more stale it gets.  If some back office staff update the customer record whilst the customer is browsing the site, the customer won't see these changes until he next logs in. Not the end of the world, but I'd be inclined to work around these problems by default.&lt;br /&gt;&lt;br /&gt;One such work around would be to only load the customer data from the database when it's needed. It means more database hits, but that's better than some of the hazards that can arise by having stale data sat around. The principle of caching also states that you should cached data to get cheap access to data that requires frequent access. If we needed to show a username on every page, then caching it in the session may make more sense than pulling it out of the database on every page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115487205853396064?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115487205853396064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115487205853396064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115487205853396064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115487205853396064'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/08/write-cleaner-and-clearer-aspnet.html' title='Write Cleaner and Clearer ASP.NET Session Code'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115480870054365328</id><published>2006-08-05T20:30:00.000+01:00</published><updated>2006-08-05T21:11:40.606+01:00</updated><title type='text'>A Year with the iMate Jam (or MDA Compact)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tobinharris.com/blog/uploaded_images/P1000038-799984.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.tobinharris.com/blog/uploaded_images/P1000038-792699.JPG" alt="" border="0" /&gt;&lt;/a&gt;My MDA Compact (iMate Jam) is beaten, bashed, scratched and dog-eared. The reflective surface of the self-portrait mirror and the flawless shiny paint have faded away through 18 months of constant use. This has been a brilliant PDA phone.&lt;br /&gt;&lt;br /&gt;I'm now on the market for a new one, so I thought I'd share my opinion of this thing before it get's retired.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Good&lt;/span&gt;&lt;br /&gt;Small Size - It's just about small enough to go anywhere. I routinely take it to the pub in my jeans pocket, and have never felt like it's a real burdon. However, as I mention in "The Bad", I'd love em to shave .5 cm off it's dimenions.&lt;br /&gt;&lt;br /&gt;Runs Great Applications - I've installed all sorts on it over the last year, from Guitar Tuning software to Tom Tom GPS software. The fact that I can use it with a GPS receive and Tom Tom is simply &lt;span style="font-style: italic;"&gt;fantastic.&lt;/span&gt; This is one of my primary uses for the phone. I've even got the Lanzarote maps so I could get to my dads house from the airport.&lt;br /&gt;&lt;br /&gt;Touch Screen - Love it, wish that all phones had one.&lt;br /&gt;&lt;br /&gt;Synchronises with Exchange - I host my email with &lt;a href="http://www.1and1.co.uk"&gt;1and1.co.uk&lt;/a&gt;,  using their £5 a month Exchange hosting that means all my contacts and calendar are backed up constantly. The fact that my Jam connects to this is great. The other day I dropped my Jam and the battery disconnected. By the time I'd put it back in, the memory was totally reset meaning all my contacts and stuff had been lost. No problemo. I just turned the phone on, entered the Exchange server details, and it was all synced back up in no time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The Bad&lt;/span&gt;&lt;br /&gt;Size - It needs to be a tiny tiny bit smaller. 0.5 cm would do of width, height and length. I find that my jeans pockets are slightly full when going out with a packet of ciggies, some keys, card wallet and the Jam. That said, the sensible thing to do would be to give up the smokes to make more room for technology.&lt;br /&gt;&lt;br /&gt;Small Screen - I think that the screen size needs to be bigger to make it better or reading documents and stuff. One day they'll be able to lose the "border" around the screen and give it an extra 1cm in width and height, that would be great. An improved screen res would also solve this problem.&lt;br /&gt;&lt;br /&gt;Camera - Ask anyone, the Jam camera is a bit sucky, and there's no flash.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Failed Trials&lt;/span&gt;&lt;br /&gt;When I first bought the phone I also bought some accessories. None of them got used for more than a month.&lt;br /&gt;&lt;br /&gt;The first was one of those skins to protect the phone. Despite being very snug, it just attracted pocket fuzz and kept falling off. I decided the phone was gonna get beaten up in the long run, therefore gave in to it and threw the skin away.&lt;br /&gt;&lt;br /&gt;The 2nd was the Sandisk WiFi card. It was too much of a faff carrying it around, mainly because it protrueded out of the top of the phone. And besides, the phone didn't make a great web browser in my opinion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;This phone is  5 things to me, in this order. It does all of them &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; well.&lt;br /&gt;&lt;br /&gt;#1 - A phone&lt;br /&gt;#2 - A contact &amp; calendar database&lt;br /&gt;#3 - A list of reference material (I keep all my reference data in Outlook/Exchange Notes)&lt;br /&gt;#4 - A GPS navigator&lt;br /&gt;&lt;br /&gt;I occassionaly use the other features, such as web browser and document reader, but I still find the thing to small to be or real use in these areas.&lt;br /&gt;&lt;br /&gt;I think that I'll replace it with 3 devices. The first will be a nice small smart phone with Exchange capabilities, possibly the &lt;a href="http://shop.orange.co.uk/shop/show/handset/orange_spv_c600/detail/pay_monthly"&gt;Orange SPV C600&lt;/a&gt; (another HTC model), and I'll get one that comes with a free NavMan or something to get the GPS functionality. The 2nd will be an UltraMobile Tablet PC such as Samsung Q1 or the Sony &lt;a href="http://www.techeblog.com/index.php/tech-gadget/sony-vaio-ux180p-reviewed"&gt;UX180P&lt;/a&gt;.   Ideally there'd be a cheap one of these that I could use simply as a portable web browser/document reader for under £200, we'll see what I find...&lt;br /&gt;&lt;br /&gt;Note that I had considered the Jamin and the Orange SPV M3600i, however, having looked at how I've used the Jam over the last year, the features that I like the most are available on a smartphone (except the touch screen :-( )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115480870054365328?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115480870054365328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115480870054365328' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115480870054365328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115480870054365328'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/08/year-with-imate-jam-or-mda-compact.html' title='A Year with the iMate Jam (or MDA Compact)'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115421230292280208</id><published>2006-07-29T23:12:00.000+01:00</published><updated>2006-07-29T23:40:50.620+01:00</updated><title type='text'>SQL Tricks</title><content type='html'>There's a lot you can do with SQL that some developers don't realise. Here's a few things you might not have thought of...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Changing Text Columns en Mass&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example. You have a column that contains file names so that an application can find them on the disk. You want to move the files to a different drive and path, and that would mean updating 1000's of rows to set the new one. You can use SQL to do this nicely much of the time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;update projects set file_output_folder = replace(file_output_folder,'D:\\Data','C:\\DDrive\\Data');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generating DOS/Linux Batch Files using SQL&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Say you need to now create the folders on the disk, cause they don't exist yet. You can use the SQL to generate a DOS batch file like this...&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;select distinct&lt;br /&gt;    concat(&lt;br /&gt;        replace(&lt;br /&gt;            file_output_folder,&lt;br /&gt;            'D:\\Data','mkdir "C:\\DDrive\\Data'&lt;br /&gt;        ),&lt;br /&gt;        '"'&lt;br /&gt;    )&lt;br /&gt;from projects;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sample of Output &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; mkdir "C:\DDrive\Data\Database\Indexer Output\&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Blah&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;\XmlToUpload"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; mkdir "C:\DDrive\Data\Database\Indexer Output\XML for Transfer"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mkdir "C:\DDrive\Data\Database\Indexer Output\XML for DB Import" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mkdir "C:\DDrive\Data\Database\Indexer Output\test"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;Using SQL to generate files like this can save you lots of time! &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Using SQL to create more SQL&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Example: Someone has written 100 stored procedures that bulk load some data from tables in another database. Rather than painfully triggering them one-by-one, you want to write a new stored procedure that runs them all at once.&lt;br /&gt;&lt;br /&gt;You can use an SQL statement to generate another one that you can run. This kind of trick can save you lots of typing!&lt;br /&gt;&lt;br /&gt;Some SQL like this will do it...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/* Assumes that the 100 sprocs someone made all start with spLoadTable */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select 'create procedure spLoadAllData as'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select concat(concat('exec ', routine_name),';')&lt;br /&gt;from information_schema.routines&lt;br /&gt;where routine_name like 'spLoadTable%'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The output might be something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create procedure spLoadAllData as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec spLoadTableCustomers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec spLoadTableOrders;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec spLoadTableLineItems;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...96 more!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can then copy and paste into a new SQL window, tweak it as you see fit, and then run it. You don't really need the union statement at the top, but it does demonstrate how you can add lines to a query.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115421230292280208?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115421230292280208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115421230292280208' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115421230292280208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115421230292280208'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/07/sql-tricks.html' title='SQL Tricks'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115324466558389230</id><published>2006-07-18T18:15:00.000+01:00</published><updated>2006-07-18T18:44:25.646+01:00</updated><title type='text'>Amazon Queue Service</title><content type='html'>&lt;a href="http://www.amazon.com/gp/browse.html/ref=sc_fe_l_2/103-7691946-5431053?redirect=true&amp;_encoding=UTF8&amp;amp;ie=UTF8&amp;node=13584001&amp;amp;no=3435361&amp;me=A36L942TSJ2AJA"&gt;Amazons Message Queue&lt;/a&gt; Service looks very interesting? I'm not that clued up on all this stuff, but there's definately a trend appearing - we can already rent processing power through hosted grid computing networks, so why not rent the computing power to handle messaging?&lt;br /&gt;&lt;br /&gt;In case you've not come across the concept of message queues, they're basically a tool to assist distributed computing. This is an area that is interesting me and more these days. I've been working on projects recently where two or three machines aren't really enough, and the prospect of being able to simply add more commodity machines to do more work is an extremely attractive one. Message queues are one technology that can play a big part in this kind of system since they allow separate programs running on separate machines to collaborate without worrying about all the communications overheads (working out which node should receive the message, waiting for responses, detecting ports being blocked, etc). The queue abstracts all that stuff, and more.&lt;br /&gt;&lt;br /&gt;You can take your pick of vendor provided message queue implementations (MSMQ, OSMQ etc), but it's really interesting to see someone like Amazon offering a service to do this out of the box, no hardware puchases required.&lt;br /&gt;&lt;br /&gt;Amazon's implementation looks nice and simple - just four methods! I guess there will be limits to the application of this service though. Firstly, using machines on an external network could present complications with both security and performance. Is HTTPS available? Would this slow things down even more? Sending messages over the web will be slower than to local networks, so I guess this technology is suited to problems that involve several disconnected networks.  The 256K per-message limit might rule out some kinds of application also, such as web spiders and multimedia applications.&lt;br /&gt;&lt;br /&gt;Still,  and good to see Amazon do something cool with all that infrastructure!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115324466558389230?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115324466558389230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115324466558389230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115324466558389230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115324466558389230'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/07/amazon-queue-service.html' title='Amazon Queue Service'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-115073658730581578</id><published>2006-06-19T17:44:00.000+01:00</published><updated>2006-06-19T18:03:07.323+01:00</updated><title type='text'>Scary Gross Tree</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tobinharris.com/blog/uploaded_images/PICT0674-746933.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.tobinharris.com/blog/uploaded_images/PICT0674-728072.JPG" alt="" border="0" /&gt;&lt;/a&gt;A Swedish freind of mine, Maria, said that this tree was perhaps the grossest thing she's ever seen. She saw it whilst walking in Nässjö, Sweden.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tobinharris.com/blog/uploaded_images/PICT0675-707517.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.tobinharris.com/blog/uploaded_images/PICT0675-784742.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tobinharris.com/blog/uploaded_images/PICT0676-762509.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.tobinharris.com/blog/uploaded_images/PICT0676-725473.JPG" alt="" border="0" /&gt;&lt;/a&gt;Basically, it's been infested with insects and turned into some kind of lavae plant!&lt;br /&gt;&lt;br /&gt;The tree appears rather white I'd say, if you look at the other piccies you can see why! Grimness!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-115073658730581578?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/115073658730581578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=115073658730581578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115073658730581578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/115073658730581578'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/06/scary-gross-tree.html' title='Scary Gross Tree'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-114613828090677735</id><published>2006-04-27T12:27:00.000+01:00</published><updated>2006-04-28T14:38:52.503+01:00</updated><title type='text'>Adopting the Kensington Expert Mouse</title><content type='html'>&lt;a href="http://www.tobinharris.com/media/photos/KensingtonExpertMouse025.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand" alt="" src="http://www.tobinharris.com/media/photos/KensingtonExpertMouse025.jpg" border="0" /&gt;&lt;/a&gt;Last week I purchased a Kensignton Expert Mouse (which is actually a trackball). Finding information online about it wasn't easy, so I thought I'd share my thoughts on the accessory and what it's like adapting to a trackball after a lifetime of regular mouse use.&lt;br /&gt;&lt;br /&gt;The main reason I purchased this was because I get pains in my mouse hand and wrist, so decided that my regular mouse + wrist rest weren't agreeing with me. I tend to sit at a computer for 8-10 hours a day, and this must be taking it's toll!&lt;br /&gt;&lt;br /&gt;(Lol, my friends have found endless amusement speculating about what repetitive activity might actually be causing the pain, ho ho...)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Why Start with the Kensington?&lt;/strong&gt;&lt;br /&gt;Having Googled various reviews of various trackballs, I decided that this was the starting point for me. Most people who use it alot are dedicated fans, which is always a selling point. I did look at other trackballs, including the cheaper &lt;a href="http://uk.kensington.com/html/7334.html"&gt;Kensington Orbit Trackball&lt;/a&gt;, the &lt;a href="http://www.logitech.com/index.cfm/products/details/GB/EN,CRID=2150,CONTENTID=5001"&gt;Logitech Cordless Trackman&lt;/a&gt;, and many others . Eventually I decided that it would be good to start with one which has a sterling reputation and costs the most, thus increasing my chances of getting along well with it. Unfortunatley I couldn't find a model in any local shop to try, so I just had to order it from Amazon.co.uk and hope for the best.&lt;br /&gt;&lt;br /&gt;Note that I've heard great things about the Logitech Trackmans also, but I fancied trying a trackball that didn't require the use of thumb for moving the ball. I figured that if I don't get on with the "classic" kind of trackball, I'll try this next.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using a Trackball after a regular Mouse&lt;/strong&gt;&lt;br /&gt;Switching to a trackball is a bit of a challenge. For the first few days it felt wierd, and everything I was trying to do took longer. In fact, even figuring out which position and angle to put my hand and fingers was a thrash.&lt;br /&gt;&lt;br /&gt;I've had it for just over a week now, and the situation has improved tenfold, although I'd say I'm still not as comfortable with it as I am with a mouse. The good news is that my hand is falling into place nicely, and even using the thumb to left-click, and pinky to right click feels almost natural. This is pleasantly surprising having being used to a mouse for 20 years, and on day 1 of the Kensington I thought I'd never get used to it.&lt;br /&gt;&lt;br /&gt;Kensington encourage you to try the mouse both with and without the wrist-rest (see below). I started without, but after 5 days decided I still wasn't comfy enough and still had a slight wrist pain. Also, I was inclined to keep trying loads of positions because everything feels awquard, but seriously, just give it time and your hand will eventually settle in to its new resting place. Now I chose to use the wrist-rest, which instantly felt better after trying without for several days.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ugly but Comfy&lt;/strong&gt;&lt;br /&gt;One thing most people say about the mouse is how ugly it looks. My lodger - &lt;a href="http://www.johnllwellyn.com"&gt;John "the Bear" Llewellyn&lt;/a&gt; entered teh room and delicately shouted "What the fuck is that thing you crazy fool!!!!?"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tobinharris.com/media/photos/KensingtonExpertMouse025.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand" alt="" src="http://www.tobinharris.com/media/photos/KensingtonExpertMouse018.jpg" border="0" /&gt;&lt;/a&gt;As you can see from the images, with or without the wrist rest attached, this look like one ugly mo-fo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Perks&lt;/strong&gt;&lt;br /&gt;There's a few things I like about the trackball so far...&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Comfort&lt;/em&gt; - Not having to move your arm/wrist is fantastically comfortable.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Matless&lt;/em&gt; - Also, not needing a mouse mat is good too. You don't have to worry about cleaning anything, or wiping crumbs off your desk. lol.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Window Scrolling - &lt;/em&gt;Sometimes it's more convient to use the window scroll bar to scroll down, as opposed to the scroll wheel on a mouse. I find this to be the case when when quickly quickly moving up and down in a large document.&lt;br /&gt;&lt;br /&gt;Whilst the Kensington has does have a scroll wheel, I find it easier to also use the window scroll bar. With the Kensington, doing this is much easier than with a mouse. You simply left-click the scroll bar, then flick the ball up and down to move it, thus scrolling the document. It's much easier than dragging a mouse up and down on the desk.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Covering Large Distances - &lt;/em&gt;You can physically flick the ball to move the pointer across large distances very quickly.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Cons&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Accuracy &lt;/em&gt;- Quickly moving the pointer to a certain location on the screen seems more difficult. This makes selecting text and drag-drop operations a bit tricky. I hope that this will improve with time so the difference is negligible.&lt;br /&gt;&lt;br /&gt;Note: More to come soon...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tobinharris.com/media/photos/KensingtonExpertMouse023.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 10px 0px 10px 10px; WIDTH: 320px; CURSOR: hand" alt="" src="http://www.tobinharris.com/media/photos/KensingtonExpertMouse023.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tobinharris.com/media/photos/KensingtonExpertMouse020.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 10px 10px 10px 0px; WIDTH: 320px; CURSOR: hand" alt="" src="http://www.tobinharris.com/media/photos/KensingtonExpertMouse020.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-114613828090677735?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/114613828090677735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=114613828090677735' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/114613828090677735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/114613828090677735'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/04/adopting-kensington-expert-mouse.html' title='Adopting the Kensington Expert Mouse'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-113684842011411645</id><published>2006-01-09T22:45:00.000Z</published><updated>2006-01-09T23:13:40.130Z</updated><title type='text'>Windows Ruby On Rails IDEs and Text Editors</title><content type='html'>I was just&lt;a href="http://weblog.rubyonrails.org/articles/2006/01/06/textmate-v1-5-released"&gt; reading about&lt;/a&gt; how the core Rails team love their Macs and the TextMate editor. Since I personally chose M$ Windows as my developmetn platform, so was interested to read about the comments left by other Windows users who have their own favourite editors.&lt;br /&gt;&lt;br /&gt;For your pleasure, here's a summary of those Windows editors:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pspad.com/en/"&gt;PSPad&lt;/a&gt;&lt;br /&gt;Freeware. Positive feedback on this one since it can be set up to look a little like TextMate. Apparently it has a file explorer panel that will show the TortoiseSVN context menus. Light memory footprint, bags of features including file compare, code helper etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/rubyeclipse/"&gt;RubyEclipse&lt;/a&gt;&lt;br /&gt;Open Source. SVN integration. Debugger, code completion (albeit a touch buggy) and a test runner. Uses up about 51MB of ram so a touch on the heavy side.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.radrails.org/"&gt;RadRails&lt;/a&gt;&lt;br /&gt;Open Source. Promising reports from users. I've used earlier versions and it &lt;span style="font-style: italic;"&gt;was&lt;/span&gt; very good. A few bugs and the memory footprint (45MB+) caused me to stop using it, but I'll certainly try it again. Features include SVN integration, WeBrick runner, syntax highlighting, code assist etc...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xemacs.org/"&gt;XEmacs&lt;/a&gt;&lt;br /&gt;Open Source. Loads of developers love Emacs, although it comes with a steep learning curve. Apparently it does everything under the sun. I do have plans to learn this tool one day...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.textpad.com"&gt;TextPad&lt;/a&gt;&lt;br /&gt;The text editor I use the most. It's great, light weight and has tons of features. If you dig around the site you'll find some ruby syntax files (and hundrends of others)&lt;br /&gt;&lt;br /&gt;[Getting tired now!... so sorry it the descriptions start getting naff! Here's some more to check out]&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scintilla.org/SciTE.html"&gt;Scite&lt;/a&gt;&lt;br /&gt;Open Source. A small and well loved editor!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ultraedit.com/index.php?name=coppermine&amp;file=thumbnails&amp;amp;album=6"&gt;UltraEdit&lt;/a&gt;&lt;br /&gt;Commercial License, but looks good and users always give good reviews.&lt;br /&gt;&lt;br /&gt;Feel free to leave your comments or mention any I've missed...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-113684842011411645?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/113684842011411645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=113684842011411645' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113684842011411645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113684842011411645'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2006/01/windows-ruby-on-rails-ides-and-text.html' title='Windows Ruby On Rails IDEs and Text Editors'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-113509041494401256</id><published>2005-12-20T14:29:00.000Z</published><updated>2005-12-20T14:53:34.960Z</updated><title type='text'>DORO Disappointment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images-eu.amazon.com/images/P/B00096J3OE.02.LZZZZZZZ.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://images-eu.amazon.com/images/P/B00096J3OE.02.LZZZZZZZ.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ever ordered by mail and then discovered it doesn't quite look like it does in the the advert?&lt;br /&gt;&lt;br /&gt;I recently purchased a DORO 212IPC Skype Certified phone, and had exactly this experience.&lt;br /&gt;&lt;br /&gt;Consider the photo on the right. Looks like a stylish, crisp white skype phone.&lt;br /&gt;&lt;br /&gt;Unfortunately, this is not the case. The phone is a creamy off-white colour that makes it look like it's been sat in the sun for too long.&lt;br /&gt;&lt;br /&gt;Before returning the phone, I wanted to check with DORO to see if it was a manufacturing error. The staff casually replied...&lt;br /&gt;&lt;br /&gt;"No no, the DORO 21I2P isn't actually white, but rather a creamy kind of off-white colour".&lt;br /&gt;&lt;br /&gt;Great. Thanks for the honest marketing DORO and for a phone that's the colour of yellow snow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-113509041494401256?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/113509041494401256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=113509041494401256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113509041494401256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113509041494401256'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/12/doro-disappointment.html' title='DORO Disappointment'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-113267807160075066</id><published>2005-11-22T16:38:00.000Z</published><updated>2005-11-22T16:47:51.636Z</updated><title type='text'>Aarrrggghhh: "The file could not be loaded into the Web Forms designer. Please correct the following error and then try loading it again"</title><content type='html'>Darn. Darn. Darn. This error has almost cost me a whole day!&lt;br /&gt;&lt;br /&gt;If anyone gets this in VS.NET 2003 (I'm doing a VB.NET web project), then here's some solutions:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;Workaround #1&lt;/span&gt;&lt;br /&gt;Are you using page inheritance? If so, make sure none of your pages declare AND initialise attributes on the same line. So DO NOT do this:&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;private _securityGateway as Gateway = GatewayFactory.Create()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instead do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private _securityGateway as Gateway&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public sub Page_Load(...)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;  _securityGateway = GatewayFactory.Create()&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;end sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This fixed my problems, but I'd already spent all day trying other things :-( Those were...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Workaround #2&lt;br /&gt;&lt;/span&gt;Try removing (not deleting) the file from your Visual Studio Solution, and then re-add it back in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Workaround #3&lt;br /&gt;&lt;/span&gt;Delete all files from your Visual Studio web cache. E.g:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;C:\Documents and Settings\Tobin Harris\VSWebCache\TOBINSLAPTOP\SomeProject&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Workaround #4&lt;br /&gt;&lt;/span&gt;Close Visual Studio and then delete as many files as possible from your temp folder.  Eg:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;C:\Documents and Settings\Tobin Harris\Local Settings\Temp&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;Anyway, hope that saves someone a day or hair pulling! Can't believe I got so stuck on this, I've never encountered such problems with C# web solutions. Ho hum...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-113267807160075066?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/113267807160075066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=113267807160075066' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113267807160075066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/113267807160075066'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/11/aarrrggghhh-file-could-not-be-loaded.html' title='Aarrrggghhh: &quot;The file could not be loaded into the Web Forms designer. Please correct the following error and then try loading it again&quot;'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112915587055880190</id><published>2005-10-12T23:24:00.000+01:00</published><updated>2005-10-12T23:26:04.540+01:00</updated><title type='text'>The Geek Bachelor Fridge</title><content type='html'>&lt;a href="http://www.tobinharris.com/blog/hello/1166130/640/DSCF0008-2005.10.12-15.24.22.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 2px;" src="http://www.tobinharris.com/blog/hello/1166130/320/DSCF0008-2005.10.12-15.24.22.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Crikey, I just looked at the fridge and realised I'm living in Bachelor World. Shouldn't two grown men have more than this? Is it the coding that keeps us stuck to the keyboard and away from supermarket? By the way, all 8 items in this fridge are mine except for the beer, which I'm about to steal from my lodger - The Bear. Sorry John, but I think it's time you got your lazy ass down to Morrissons anyway... &lt;a href="http://picasa.google.com/blogger/" target="ext"&gt;&lt;img src="http://photos1.blogger.com/pbp.gif" alt="Posted by Picasa" style="border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;" align="middle" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112915587055880190?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112915587055880190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112915587055880190' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112915587055880190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112915587055880190'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/10/geek-bachelor-fridge.html' title='The Geek Bachelor Fridge'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112889781177116957</id><published>2005-10-09T23:25:00.000+01:00</published><updated>2005-10-09T23:43:31.776+01:00</updated><title type='text'>Open Source Web Indexing with .NET</title><content type='html'>For the last 12 months I've been working on a web indexing solution. It's for a client who is building a database of news articles and offering news alert and clipping services. We're leaning on open source software wherever possible in our application, and it occurred to me just how fantastic it is to have such an active and varied collection of tools at our disposal.&lt;br /&gt;&lt;br /&gt;For anyone who's interested in indexing, here's the lowdown of what technologies we're using.&lt;br /&gt;&lt;br /&gt;1. MySql Database. This is great, we've got it tuned to cope with millions of articles on a single modest server. The .NET db connector library is quite mature too.&lt;br /&gt;&lt;br /&gt;2. Lucene Search Engine. This gives our keyword searching capabilities. Again, we have an index of over a million articles and searches complete within .5 seconds. DotLucene certainly rocks!&lt;br /&gt;&lt;br /&gt;3. The SGML Library from GotDotNet. This allows us to convert HTML pages into an XML tree, which are then used for information extraction. We have some nifty algorithms for extracting only the body of a news article without the surrounding menus and link bars, and our application doesn't need to have site-specific rules for finding the article.&lt;br /&gt;&lt;br /&gt;We're also using other open source components for things such as FTP, emailing, PDF reports etc. And, we've written our web portal in Ruby On Rails.&lt;br /&gt;&lt;br /&gt;All this lot runs on a single modestly specified box, who's CPU humming along at about 50%.  Once we start to hit capacity, we'll be looking at the open source Grid Computing offerings to help us scale out.&lt;br /&gt;&lt;br /&gt;Anyone else doing web indexing in .NET? Got any tips or tools to share?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112889781177116957?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112889781177116957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112889781177116957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112889781177116957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112889781177116957'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/10/open-source-web-indexing-with-net.html' title='Open Source Web Indexing with .NET'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112786175926507434</id><published>2005-09-27T23:53:00.000+01:00</published><updated>2005-09-27T23:56:20.780+01:00</updated><title type='text'>RubyOnRails Meet in the North of England</title><content type='html'>It looks like there's quite a few of us folk up north who are keen to have a RubyOnRails meet-up. We're keeping &lt;a href="http://wiki.rubyonrails.com/rails/pages/Leeds+On+Rails"&gt;details on the Rails Wiki.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feel free to check it out and add your name and vote for venue and time/place!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112786175926507434?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112786175926507434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112786175926507434' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112786175926507434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112786175926507434'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/09/rubyonrails-meet-in-north-of-england.html' title='RubyOnRails Meet in the North of England'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112290939347640293</id><published>2005-08-01T15:25:00.000+01:00</published><updated>2005-08-01T16:16:33.556+01:00</updated><title type='text'>MySql Pleasantness</title><content type='html'>I've recently embarked on the learning curve of using MySql. The main reason for this is that a few of my clients haven't been able to justify the expense of Microsft SQL Server licences, and posed the question of "is there an open source database that can meet our demands?". I still use and love MSSQL, but not every project needs such a sophisticated database platform.&lt;br /&gt;&lt;br /&gt;MySql was our first port of call. It seems like an actively developed and sturdy database platform. I've read good reports about it being used successfully in many performance demanding applications. It's also got some nice features out-of-the-box, such as replication, unicode support and nice developer tools. MySql 5.0 will deliver even more cool features, such as views, triggers, stored procedures and functions.&lt;br /&gt;&lt;br /&gt;If you're a .NET developer who's considering getting into MySql, I'd certainly give it the thumbs up. It's been a pleasant expereince, and the community are very helpful. &lt;br /&gt;&lt;br /&gt;I'd like to offer a few hints and resources for those who are entering the MySql world, because there's a few things that took me a while to get into.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Documentation&lt;br /&gt;&lt;/span&gt;The MySql documentation is fab. I found it easy to navigate, and very usable from a developers perspective. Also, there's lots of comments provided by users that can really help you tackle tricky problems and gotchas. I wish the MS docs had this "user comments" feature. I exclusively use the &lt;a href="http://dev.mysql.com/doc/mysql/en/index.html"&gt;online reference&lt;/a&gt;, but there's also downloadable CHM files and PDFs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/mysql/en/index.html"&gt;http://dev.mysql.com/doc/mysql/en/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This was my starting point for learning MySql, and I certainly provided a nice way in.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;2. Forums&lt;/span&gt;&lt;br /&gt; Whenever I'm getting into some new component or application, I need to be able  to ask&lt;br /&gt;questions and get responses.  The best place I've found for this is  the forums. The MySql site is quite a big one, but you'll find a  great set of public forums here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.mysql.com/"&gt;http://forums.mysql.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Always search the forums first, seriously, there's a good chance you'll find a lot of people who've had similar problems. Also, once you start learning this stuff, give back by responding to other peoples issues - it's just good ettiquett.&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;3. Books&lt;br /&gt;&lt;/span&gt;So far I've only got one book - "High Performance MySql" by O'Reilly. It's full of great hints and tips, and gives good background to how MySql is structured, how it derives query plans etc. I'm actully starting to feel like I'm understanding the MySql engine, despite only having worked with it for a few months. I'm also going to buy a book called "Pro MySql", but &lt;a href="http://jpipes.com/"&gt;Jay Pipes&lt;/a&gt;. This guy has helped me out loads on the forums, and seems to really know what he's talking about. I imagine his book will be invaluable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Some things I wish were different&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The overall MySql experience has so far been a positive one, but there are a few things I miss from Sql Server.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Query Plans&lt;/span&gt;. When you explain a query in MSSQL, you get lots of data about what's going on. In MySql, you get much less. I think that, as my understanding of the database increases, I'll know what does and doesn't perform in queries, but I do wish there was a little more info in those query explanations!&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Indexes&lt;/span&gt;. Currently, MySql 4 will only allow one index to be used per query. Well, it will use different indexes for subselects and union queries, but I like the fact that MSSQL will use more than one index for a single select statement. As it happens, there's tricks which allow you to still phrase queries so they perform, but it just means you can't always apply MSSQL knowledge to MySql.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;MySql Query Browser&lt;/span&gt;.  This *is* a very nice tool. However, I'm just too used to MS Query Analyser ;-). One thing that QA users will want to do is make the query window full screen, which can be done using the F11 key. Also, I've not been able to find a way of executing just the selected text, which is a shame. Maybe I should work on an SqlBuddy for MySql :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Things I like about MySql&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;- Server Administrator.  &lt;/span&gt;This is a really good tool, and it allows you to tweak almost all settings for the server. Also, it has nice graphs showing Query Cache Usage, current conntections, and other health related issues. Editing my.ini in a text editor is quite easy too, since there's loads of comments. &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- Multiple Engines. &lt;/span&gt;MySql has many different storage engines (such as InnoDb, MyISAM etc). At first, this makes it seem a little overwhelming, but I think I like the idea. Basically, you can select the optimal storage engine for your application. For example, many standard transaction processing apps would benefit from InnoDB, which has row level locking, referential integrity etc. More OLAP type applications might benefit from the MyISAM or up and coming Archive formats. You can also create In-Memory tables for super-fast data access.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- Cross Platform. &lt;/span&gt;This is an obvious one, but it's quite handy to be able to develop a database on my local windows box and then use the same scripts to create it on a Linux box.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- Easy Backup. &lt;/span&gt;The "dump" command allows you to instantly dump an entire database structure and contents to a text file. You can also just do individual tables.&lt;br /&gt;&lt;br /&gt;Ok, I've rattled on enough here. Hopefully there's some useful insights to those developers who are considering using it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112290939347640293?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112290939347640293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112290939347640293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112290939347640293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112290939347640293'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/08/mysql-pleasantness.html' title='MySql Pleasantness'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112210974120409157</id><published>2005-07-23T09:47:00.000+01:00</published><updated>2005-07-23T10:09:01.213+01:00</updated><title type='text'>2 Pleasant NHibernate Experiences</title><content type='html'>I've been using NHibernate on a variety of projects over the last year or so, and it never fails to please...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Retrofitting NHibernate&lt;/strong&gt;&lt;br /&gt;I recently had a project that started out with simple ADO.NET/DataReader/DataSet based data access. After a while, I evolved to using objects for data-structures, and writing simple "loader" classes that took data out of the DB and mapped it into these objects. A few months later it turned out we needed to both read and write these objects to the DB, and at this point I realised my simple hand-rolled data access code had taken me as far as it could. I certainly don't need to re-invent the wheel when it comes to object relational mapping tools.&lt;br /&gt;&lt;br /&gt;The interesting thing about this project was that it started out without any need or provision for an O/R mapper: my "data aware" classes didn't even store any DB identity fields because the app never needed them. I was worried that plugging in NHibernate into this existing code base would be tricky - mainly because I hadn't designed the application with that in mind. Fortunately it was remarkably simple - thanks to NHibnerates flexibility.&lt;br /&gt;&lt;br /&gt;The grunt of the work was just setting up the mapping files for the several classes that needed reading/writing. Some tweaks to the classes were needed, such as identity fields had to be added. I think the whole process took about a day, and it really was a relatively straight forward experience. It just goes to show you can start simple and then retrofit an O/R mapper if and when you feel any data access pains!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Switching RDBMS from SqlServer to MySql&lt;/strong&gt;&lt;br /&gt;Roughly 6 months into the project we decided to switch databases from SqlServer to MySql. I'm not knocking SqlServer, it's fantastic, but we basically needed to cut costs, and MySql offered all the features we needed.&lt;br /&gt;&lt;br /&gt;When someone comes along and says "can we switch databases", it's can be quite a considerable challenge.  However, since we were using NHibernate, all the hard work had been done for us. All I had to do was enter a new connection string and tweak some configuration setttings, and "ping", everything was working against our MySql database. I do recall having to tweak one of the "forumla" fields in the hbm.xml mapping files, but that was it. Unfortunately the app also used some "raw" SQL in places - bypassing NHibnerate, and converting this ADO code + SQL proved to be much more time consuming 8-(&lt;br /&gt;&lt;br /&gt;Anyway, there's just a few of my recent but pleasant NHibernate experiences. I'm using version 8.0.4 now, and the dev team are making great progress I think. Good work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112210974120409157?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112210974120409157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112210974120409157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112210974120409157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112210974120409157'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/07/2-pleasant-nhibernate-experiences.html' title='2 Pleasant NHibernate Experiences'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-112207832538745161</id><published>2005-07-23T00:47:00.000+01:00</published><updated>2005-07-23T01:25:25.480+01:00</updated><title type='text'>Rails: Frameworks are the way forward!</title><content type='html'>A few days ago I recieved a chance phone call from a local company in Leeds.  They wanted someone to quickly fix some problems in a Rails application whilst thier main developer was on holiday. Have you ever tried to get into someone elses meaty project in just 4 hours!?&lt;br /&gt;&lt;br /&gt;This morning I jumped in the car, drove across town to their office, and within 1 hour was in the SCite editor fixing problems so they could get thier demo done. What struck me was just how easy it was to work with a brand-new code base that I've never even seen. It was like being at home inside one of my own projects. Because I know Rails, I instantly knew where to find thing - third party APIs, models, controllers, views, images etc. That's invaluable when it comes to hitting the ground running. The code &lt;em&gt;was&lt;/em&gt; very tidy too - clear, concise, well commented which helps alot of course 8-)&lt;br /&gt;&lt;br /&gt;I've often been exposed to new code-bases, and half the battle is finding things and getting an understanding of the key abstractions - the framework - that underpins the system. With Rails all this stuff was already known to me - Rails lays out a foundation that you become very familiar with. This meant that finding the appropriate files was a doddle, and I could quickly crack on with tackling the meat of the problems straight away.&lt;br /&gt;&lt;br /&gt;I imagine that many frameworks offer such advantages, and it's not just a Rails thing. However, it was a &lt;em&gt;very&lt;/em&gt; pleasant surprise to be able to settle in to a code base so easily. In contrast, I've been working on an ASP project for over a year, and even today it's just &lt;em&gt;painful&lt;/em&gt;.  This particular  project is like a "paradigm-soup" where the developer played with scores of ideas in one single project . This isn't a stab at ASP - I've had some great fun with it. Also, I've made that "paradigm-soup" mistake myself (many times). However,  I seriously think that it's much &lt;em&gt;harder&lt;/em&gt; to screw up when working within the confines of a well thought-out framework. Rails doesn't leave too much room for such amateur blunders!&lt;br /&gt;&lt;br /&gt;Anyway, enough Rails evangelism. Rails has tought me an important lesson in the value of frameworks, and I'll certainly be looking to use a framework in all future projects, whether it be based on ASP, .NET or Ruby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-112207832538745161?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/112207832538745161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=112207832538745161' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112207832538745161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/112207832538745161'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/07/rails-frameworks-are-way-forward.html' title='Rails: Frameworks are the way forward!'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111849790089901711</id><published>2005-06-11T14:06:00.000+01:00</published><updated>2005-06-11T15:00:56.000+01:00</updated><title type='text'>Should an O/R mapper be a code generator? My thoughts...</title><content type='html'>I saw this question raised on &lt;a href="http://steve.emxsoftware.com/Entity+Framework/Should+an+OR+Mapper+also+be+a+code+generator"&gt;Steve Eichart's blog&lt;/a&gt;, and some strong and well formed opinions about it all.&lt;br /&gt;&lt;br /&gt;I recall reading this discussion and thinking "I really don't care if an O/R mapper is a code generator or not. As long as the vendor communicates how their tool works so I can assess if it's suitable for my needs."&lt;br /&gt;&lt;br /&gt;Writing our own data access plumbing code is hard work, so it makes sense to find a tool that eases the pain. There's loads of tools for this job, and the whole "data access problem" can be solved in many ways.&lt;br /&gt;&lt;br /&gt;Selecting tools is a timely process, and vendors should (and do) go to great lengths to help us determine if their tool will support our project well.&lt;br /&gt;&lt;br /&gt;I personally don't really think that there is a right and wrong approach to data access. You just have to pick a tool that works for you, and that fits nicely with your project. I've only used a few tools so far, but I'm going to keep trying new ones because I learn so much from taking different appraoches.&lt;br /&gt;&lt;br /&gt;I love &lt;a href="http://www.nhibernate.org"&gt;NHibernate&lt;/a&gt; for it's flexibility. However, because NHIbernate has so many options, getting off the ground can take time.&lt;br /&gt;&lt;br /&gt;NHibernate is certainly well suited to legacy projects where I'm not in a position to change the database tables, and the more tricky situations where you might have things like composite keys, different identity schemes, and value type mappings. It can take time (and therefore money) to to learn to use these features, but if you're project needs such flexibility then it's there for you. NHibernate was built to solve certain kind of problems very well.&lt;br /&gt;&lt;br /&gt;I'll other projects I'll be considering &lt;a href="http://www.llblgen.com"&gt;LLBLGEN &lt;/a&gt;pro. I've heard great reviews, and I think there's some very valid reasoning in the approach the tool takes. Sometimes I find myself fighting NHibernate - so perhaps LLBLGen is going ease the pain more than NHibernate can in some projects. Not on all projects, just some.&lt;br /&gt;&lt;br /&gt;I've also been using &lt;a href="http://www.rubyonrails.com"&gt;Ruby on Rails &lt;/a&gt;with it's Active Record library. This is fantastic - it's so darn simple. For some projects it offers more than enough, and allows for seriously fast development speeds. However, it's limited because it relies heavily on convention. Who cares?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I used to think that I wanted tools that provide the ultimate in flexibility and features. Now my mind is changed. I just want tools that makes easy work of the problem in hand.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;If solving the problem well means that generating code is more appropraite than reflecting on types at runtime, then that's fine. Or, if it means sacrificing mapping flexibility, having to follow strict conventions, but in exchange for great development time savings, then that's great too. Finally, if it means having to read and understand lots of docmentation, but having the ability to implement very complex mappings, then that's fine too if that's what the projects needs.&lt;br /&gt;&lt;br /&gt;In my humble opinion, it's all down to what the project will benefit from most.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111849790089901711?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111849790089901711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111849790089901711' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111849790089901711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111849790089901711'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/06/should-or-mapper-be-code-generator-my.html' title='Should an O/R mapper be a code generator? My thoughts...'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111827420328642825</id><published>2005-06-08T23:37:00.000+01:00</published><updated>2005-06-09T00:49:07.350+01:00</updated><title type='text'>Why Skype won't save my mobile phone bills</title><content type='html'>I'm in the great position of being able to walk around my home making and receiving Skype calls on my mobile cell-phone for FREE (well, almost). How fantastic! I can do this because:&lt;br /&gt;&lt;br /&gt;a. Skype is available for my model of mobile phone (an iMate JAM)&lt;br /&gt;b. My mobile phone also has WiFi capabilities&lt;br /&gt;c. I have broadband internet and WiFi in my home&lt;br /&gt;&lt;br /&gt;So, the combination of a mobile phone, the internet, WiFi and Skype (or any VoIP) suddenly gives me this great ability to communicate with friends and family, using my mobile phone, but without incurring mobile phone charges. This is nice, but the potential for this combination gets much bigger when I step out of my home...&lt;br /&gt;&lt;br /&gt;WiFi hot spots are popping up all over the place in the UK. Surely I'll be able to take advantage of cheap-as-chips phone calls from Starbucks, shopping centers and many other places?&lt;br /&gt;&lt;br /&gt;Hmmm, apparently someone isn't too keen on this idea. As soon as I want to access Starbucks or an airport, I'm asked to pay BIG FEES. For example, an hour of WiFi access at Copenhagen airport cost me £5.50. £5.50! This is extortionate! My household broadband bill works out at £0.03 per hour. So, why am I being asked to pay £5.50 per hour to use the Copenhagen broadband connection?&lt;br /&gt;&lt;br /&gt;I suspect this is because the big telecomms giants have it all worked out. I think it is them who install and profit from most of the WiFi hotspots. It would seem that they've anticipated the VoIP mobile revolution, and are working hard to make sure that even if we don't pay for as many mobile phone calls, we pay equally high fees for VoIP via WiFi.&lt;br /&gt;&lt;br /&gt;Of course, this is all guesswork and suspicion talking. I had just hoped that in this age of communication, WiFi + Internet could make talking a very cheap thing. If this is to happen, I think someone has to knock the big telecomms giant out of the WiFi Hot Spot game. Otherwise buying WiFi access time is going to be just like buying Mobile Phone time. In fact, seeing the BT Openzone price list confirms this is how they want it to be!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.btopenzone.com/buy/index.jsp"&gt;http://www.btopenzone.com/buy/index.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;WiFi now has per-minute billing, vouchers, top-up accounts, monthly subscriptions... Does this sound familiar!?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111827420328642825?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111827420328642825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111827420328642825' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111827420328642825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111827420328642825'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/06/why-skype-wont-save-my-mobile-phone.html' title='Why Skype won&apos;t save my mobile phone bills'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111645641462931020</id><published>2005-05-18T23:37:00.000+01:00</published><updated>2005-05-18T23:46:54.630+01:00</updated><title type='text'>It's all going XP in Yorkshire, UK!</title><content type='html'>I couldn't belive it when I found that the &lt;a href="http://www.xp2005.org/"&gt;XP 2005&lt;/a&gt; conference is in Sheffield Uni (18th June -&gt; 23rd June)!&lt;br /&gt;&lt;br /&gt;I'm just down t' road in Leeds, and &lt;em&gt;really really really &lt;/em&gt;would like to go to listen to people such as Kent Beck, Robert C Martin, Micheal Feathers and Ian Sommerville! I'm almost embarrassed to admit I've read books by all those guys, it would be amazing to hear their wisdom in the flesh!&lt;br /&gt;&lt;br /&gt;Unfortunately I'm not sure if my fledgling business can afford the fees and time off work, so I'll be sat at home crying on those days!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111645641462931020?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111645641462931020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111645641462931020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111645641462931020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111645641462931020'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/its-all-going-xp-in-yorkshire-uk.html' title='It&apos;s all going XP in Yorkshire, UK!'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111645586033154645</id><published>2005-05-18T23:22:00.000+01:00</published><updated>2005-05-18T23:37:40.336+01:00</updated><title type='text'>It's all going down in Copenhagen</title><content type='html'>On Monday I fly off to Scandinavia, and will be getting down to &lt;strong&gt;Copenhagen&lt;/strong&gt; on the 9th of June. There's some interesting events going on for those who are there...&lt;br /&gt;&lt;br /&gt;1.  &lt;a href="http://reboot.dk/reboot7/show/HomePage"&gt;Reboot 7&lt;/a&gt;  (10th/11th June) - This is the main reason I'm going 8-) Hoping to meet some interesting folk and learn a bit. Also, listening to some knowledgeable people will be fun (Robert Scoble (Microsoft), David Heinemeier Hansson (37Signals), Skype, Nokia, BBC etc)!&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://www.umbraco.org/frontpage/about/codegarden05.aspx"&gt;Codegarden&lt;/a&gt; (8th/9th June) - The guys at Umbraco are offering a FREE 2 day workshop that should be fun for anyone into .NET &amp; CMS, and of course, the Umbraco system!&lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://www.37signals.com/workshop/"&gt;37Signals Basecamp Workshop&lt;/a&gt; (9th June) - Commercial workshop for Basecamp. Looks like a fantastic line up of topics.&lt;br /&gt;&lt;br /&gt;Unfortunately I don't get down to Copenhagen till the afternoon/evening on the 9th, so can't do the latter two 8-(&lt;br /&gt;&lt;br /&gt;Anyone around to hook up for beers on Thursday night 8-)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111645586033154645?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111645586033154645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111645586033154645' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111645586033154645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111645586033154645'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/its-all-going-down-in-copenhagen.html' title='It&apos;s all going down in Copenhagen'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111521889766058701</id><published>2005-05-04T16:10:00.000+01:00</published><updated>2005-05-04T16:08:14.910+01:00</updated><title type='text'>Skype really is revolutionary</title><content type='html'>Yesterday I made my first Skype phone call. I just happened to be messaging another developer in Denmark (&lt;a href="http://olle.1av10.nu/"&gt;Olle&lt;/a&gt;), when he asked if my Skype was set up. I said sure. Within minutes we were chatting away over the "phone". I'd only set the mic up that morning, but not used my Skype set up yet.&lt;br /&gt;&lt;br /&gt;Lol, as an aside, you should see my Mic setup (see previous 2 blog posts). It needs sorting. I've plugged in an SM58 vocal mic into a JoeMeek VC3Q compressor/exciter/equaliser. Then this whole lot gets fed into my laptop mic input. I need to buy a bluetoothe headset - but until then this will have to do 8-)&lt;br /&gt;&lt;br /&gt;The quality was *ace*, with no lag at all. I noticed that if I distracted my CPU with GUI tasks, then things could slow a bit, but this was to be expected.&lt;br /&gt;&lt;br /&gt;There was something a little odd about talking to Olle via phone. We'd been chatting about random nerdy topics via messanger for only about 3 days - and you really get used to a certain anonymity that a text medium gives.&lt;br /&gt;&lt;br /&gt;Suddenly switching to voice mode with a virtual stranger makes things very different. Olle certainly doesn't feel like a stranger at all anymore! We also covered a lot of ground in our 20 minute chat. The first thing I discovered is that I'd pronounced his name wrong!...&lt;br /&gt;&lt;br /&gt;To me this new medium is big. I realise that other messangers have had the ability to do voice channel also, but I've found them jerky and not that user friendly. Skype seems to be totally focused on voice communications, and that makes the difference.&lt;br /&gt;&lt;br /&gt;IRC, MSN, AIM etc have all been great ways of networking and discussing issues with other folk around the globe. I think Skype has taken this to a new level by giving us reliable voice communications delivered with the ease and FREEdom of a messaging client. I wonder if the internet community is ready to really "talk" to each other!?...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111521889766058701?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111521889766058701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111521889766058701' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521889766058701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521889766058701'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/skype-really-is-revolutionary.html' title='Skype really is revolutionary'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111521917652986140</id><published>2005-05-04T16:06:00.000+01:00</published><updated>2005-05-04T16:06:16.560+01:00</updated><title type='text'></title><content type='html'>&lt;a href='http://www.tobinharris.com/blog/hello/1166130/640/DSCF0002-2005.05.04-08.06.08.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://www.tobinharris.com/blog/hello/1166130/320/DSCF0002-2005.05.04-08.06.08.jpg'&gt;&lt;/a&gt;&lt;br /&gt;My Desk with "Skype Phone" (TM) at the far end&amp;nbsp;&lt;a href='http://www.hello.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbh.gif' alt='Posted by Hello' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111521917652986140?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111521917652986140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111521917652986140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521917652986140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521917652986140'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/my-desk-with-skype-phone-tm-at-far-end.html' title=''/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111521905211050056</id><published>2005-05-04T16:04:00.000+01:00</published><updated>2005-05-04T16:04:12.136+01:00</updated><title type='text'></title><content type='html'>&lt;a href='http://www.tobinharris.com/blog/hello/1166130/640/DSCF0001-2005.05.04-08.04.06.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://www.tobinharris.com/blog/hello/1166130/320/DSCF0001-2005.05.04-08.04.06.jpg'&gt;&lt;/a&gt;&lt;br /&gt;SM58 + JoeMeekVC3Q. My Skype Phone 8-)&amp;nbsp;&lt;a href='http://www.hello.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbh.gif' alt='Posted by Hello' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111521905211050056?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111521905211050056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111521905211050056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521905211050056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521905211050056'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/sm58-joemeekvc3q.html' title=''/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111521699218274190</id><published>2005-05-04T15:21:00.000+01:00</published><updated>2005-05-04T15:29:52.190+01:00</updated><title type='text'>Sexy Ruby Rails Revision Control</title><content type='html'>Rails keeps me in awe. I recently stumbled across the Rails "Source" section. From my 10 minute visit I found some amazing stuff in there (for me, at least!). There revision control tools look like the dogs bollocks, much prettier than the SourceForge/CVS/Subversion stuff I've seen to date.&lt;br /&gt;&lt;br /&gt;Each time someone update the code, you can see a "changeset" or that update (&lt;a href="http://dev.rubyonrails.com/log/trunk/activesupport/"&gt;example&lt;/a&gt;). This shows a list of atomic change sets.&lt;br /&gt;&lt;br /&gt;You can view then go and view each change set, which reveals a really neat way of showing the files affected and the individual changes to the files &lt;a href="http://dev.rubyonrails.com/changeset/371"&gt;like this&lt;/a&gt;. It's fantastic! I want it for my own development environment!&lt;br /&gt;&lt;br /&gt;It's nice to see that a typical change-set includes an update to a unit test script, a change to the class itself, and then a change to the CHANGELOG file. &lt;br /&gt;&lt;br /&gt;There's also a funky timeline showing change tickets coming in, being resolved and change sets being added.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111521699218274190?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111521699218274190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111521699218274190' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521699218274190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521699218274190'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/sexy-ruby-rails-revision-control.html' title='Sexy Ruby Rails Revision Control'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111521646720457627</id><published>2005-05-04T14:50:00.000+01:00</published><updated>2005-05-04T15:21:07.276+01:00</updated><title type='text'>Extending Ruby Types (as seen in Rails)</title><content type='html'>I was looking through some of the Rails source code today, and saw something that I simply love.  "David" had added some nifty features to the number class. For example, with these extensions you can now write super-verbose code such as:&lt;br /&gt;&lt;br /&gt;puts 1.hour.from_now &lt;em&gt;&lt;br /&gt;&lt;/em&gt;&gt;&lt;em&gt;Wed May 04 15:15:53 GMT Daylight Time 2005&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;puts 2.weeks.from_now&lt;br /&gt;&lt;em&gt;&gt;Wed May 18 15:15:53 GMT Daylight Time 2005&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;puts 10.minutes.ago&lt;br /&gt;&lt;em&gt;&gt;Wed May 04 15:05:53 GMT Daylight Time 2005&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This stuff is great! It's easily achieved too, in fact, you can even open up the interactive shell and extend classes right there. It just involves redefining the class with the extra functions you want. See the &lt;a href="http://dev.rubyonrails.com/file/trunk/activesupport/lib/core_ext/fixnum_ext.rb?rev=371"&gt;Rails Fixnum example &lt;/a&gt;I was looking at, which show how the above examples work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111521646720457627?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111521646720457627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111521646720457627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521646720457627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111521646720457627'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/extending-ruby-types-as-seen-in-rails.html' title='Extending Ruby Types (as seen in Rails)'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111516294456749056</id><published>2005-05-03T23:55:00.000+01:00</published><updated>2005-05-04T08:22:42.246+01:00</updated><title type='text'>Killer Sun Gosling Quote</title><content type='html'>&lt;p&gt;"The average software developer spends more on lattes than they do on tools."&lt;br /&gt;&lt;em&gt;Gosling, Sun Microsystems [taken from &lt;a href="http://insight.zdnet.co.uk/software/linuxunix/0,39020472,39146186-5,00.htm"&gt;this &lt;/a&gt;&lt;/em&gt;&lt;em&gt;&lt;a href="http://insight.zdnet.co.uk/software/linuxunix/0,39020472,39146186-5,00.htm"&gt;great article&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;I thought this was brilliant 8-)&lt;/p&gt;&lt;p&gt;I've just done my first years accounts and I'm ashamed to admit that, for me at least, Goslings statement holds true! It's amazing how I expect so many "bread and butter" tools to be available for free. What? Pay for an enterprise class database management system? You must be kidding. Surely they should be available for FREE! Hehe, it's really screwed up, but it's the way I think. And that's the way things are going.&lt;/p&gt;&lt;p&gt;I like the idea of comparing these software tools to supermarkets and utility companies. Having a database server for a business application is a bit like having electricity for your home. It's mandatory, but it's also a pain to buy, if not mundane. You just want to find a cheap provider and get on with the interesting stuff. From where I'm sitting it looks like a lot of software is falling into this category. &lt;/p&gt;&lt;p&gt;I'm currently a solo contractor who often thinks about launching a product or getting into something with more leverage than my hourly rate. Staying on the right side of the commodotisation line seems like *really* good advice. It seems like bespoke and custom software is a safe place to be these days. If I read &lt;a href="http://www.softwareceo.com/discussions/enterprise_software_vs_desktop_software_sales.php"&gt;this post&lt;/a&gt; (#11) correctly then I think Database engines, email clients, web browsers, CRMs, CMSs etc simply don't provide enough competitive advantage to justify huge expendature. &lt;/p&gt;&lt;p&gt;On a complete tangent, I think about Resharper (&lt;a href="http://www.jetbrains.com/resharper"&gt;www.jetbrains.com/resharper&lt;/a&gt;). This is a tool I love, it offers so many great features for refactoring in Visual Studio.NET. But, I wonder if this class of tool is becoming commoditised? Will I expect to be paying for .NET refactoring tools in 2 years time? How will JetBrains be able to convince people to buy their products when refactoring utilities are built right into the IDE? What happens when a good Open Source refactoring tool emerges for .NET?&lt;/p&gt;&lt;p&gt;Ok, enough mindless rambling for one day!...&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/10236702-111516294456749056?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111516294456749056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111516294456749056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111516294456749056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111516294456749056'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/05/killer-sun-gosling-quote.html' title='Killer Sun Gosling Quote'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111152642347823637</id><published>2005-03-22T20:46:00.000Z</published><updated>2005-03-22T22:54:30.316Z</updated><title type='text'>Ruby On Rails - random thoughts from a .NET perspective - Part 1</title><content type='html'>I recently started playing with Ruby On Rails (&lt;a href="http://www.rubyonrails.org"&gt;www.rubyonrails.org&lt;/a&gt;). What can I say, so far I think it's beautiful! Hehe, I don't say such things very often, but the darn thing just seem so simple! And, every time I want to do something, I find the perfect solution.&lt;br /&gt;&lt;br /&gt;In case you haven't heard, RubyOnRails is a web framework that offers a very quick route for implementing web applications. If you have heard of &lt;a href="http://www.deklarit.com/"&gt;Deklarit&lt;/a&gt; for .NET then Rails is similar in that it offers tools to assist in n-tier development from data source to business object to GUI.&lt;br /&gt;&lt;br /&gt;And, in case you haven't heard of Ruby, &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; is a fairly new language which has borrowed the nice bits from a myriad of other languages, and then added a few nice things itself. It's known to be highly expressive, simple and powerful.&lt;br /&gt;&lt;br /&gt;This has all been a new adventure for me since I spend most of my day in Visual Studio .NET. I've grown to love .NET (and c# in particular), but seeing new tools and languages is certainly a good thing to do in my book. I'd recommend it to anyone if you get the chance, just to give yourself a new perspective. If you don't believe me, check out &lt;a href="http://www.themedicieffect.com/"&gt;The Medici Effect&lt;/a&gt;, which talks alot about giving yourself new perspectives in life! The author, Frans Johansson, even understands the brilliance of &lt;a href="http://themedicieffect.typepad.com/stories/2005/01/the_case_of_the.html"&gt;swedish pizza &lt;/a&gt;8-)&lt;br /&gt;&lt;br /&gt;Once I've finished a project in rails, I'll probably write about how it compares to my own .NET experiences. To give you a taster of why I'm buzzing about Rails, consider the following things I've found out (I've only been using it for 4 days!).&lt;br /&gt;&lt;br /&gt;I'm not slagging off .NET by the way, I'm just excited by finding a new "toy"! I'm looking foward to taking my experiences of Rails back into my .NET work. This is &lt;strong&gt;NOT&lt;/strong&gt; a comparison of which tool is best, I'm just rambling about Rails from the point of view of someone who does a lot of .NET coding.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Object Persistance&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It has built in object persistence using the ActiveRecord pattern (see &lt;a href="http://www.martinfowler.com"&gt;www.martinfowler.com&lt;/a&gt; ). I can do something nice like this to load some customers:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#006600;"&gt;customers = Customers.find_all ["where company_name like ? and date_created &gt; ?",'SoftNet.com','01-Mar-2005']&lt;br /&gt;&lt;br /&gt;customers.each{ customer&lt;br /&gt;customer.destroy unless customer.is_nice?&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once nice thing about Rails is that it gives you a great deal for free. For example, see the &lt;span style="font-family:courier new;color:#006600;"&gt;is_nice&lt;/span&gt; field on the customer class? Well, I didn't code that. That got added at runtime because there is a column in my database by the same name. Because Ruby is dynamic it can do stuff like that. I was initially worried about rails being too constrining by having a lot of "conventions", but there always seems to be ways around these if you need it.&lt;br /&gt;&lt;br /&gt;I've used &lt;a href="http://www.nhibernate.org"&gt;NHibernate &lt;/a&gt;quite a lot for .NET, which is an amazing tool I think. The ActiveRecord approach that Rails offers *is* simpler IMHO, but less flexible and may not appeal to those who want true independence between object model and database schema. The benefits that rails gives me is that I don't have to set up any mapping files, and I can still do inheritance and components, which is nice. I seiously doubt it's as flexible as good ol NHibernate, but then again I can map that Customer class in 3 lines of Rails code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#006600;"&gt;&lt;br /&gt;&lt;br /&gt;def class Customer &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many: orders&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another thing I like about ActiveRecord is that it is in keeping with the &lt;a href="http://www.domaindrivendesign.org"&gt;DDD&lt;/a&gt; concept of Ubiquotous language - since the language of the database and the source code are constantly synchronised.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Model-View-Controller (MVC)&lt;/strong&gt;&lt;br /&gt;When you look at a rails application, you'll instantly see evidence of MVC going on. Folder names such as "controllers" and "models" and "views" kind of give it away. Model View Controller is a well known framework for cleanly coding stuff. It basically allows us to separate concerns. Ever heard someone say "Your business classes shouldn't talk to your web pages", well, MVC provides a way of separating things to achieve such rules. Lol, I shouldn't even try to explain this stuff, if you google the term you can find out why it's good. Anyway, Rails gives us a neat toolkit for defining model elements (business classes), views upon those elements (web pages), and controllers that handle requests and perform actions. It's all very clean, structured and methodical I think!&lt;br /&gt;&lt;br /&gt;It looks like someone wants to bring this into the .NET world - since there is already a &lt;a href="http://www.castleproject.org/castle/show/castleonrails"&gt;CastleOnRails.NET&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Page Layout&lt;/strong&gt;&lt;br /&gt;Rails comes with a really nice set of layout libraries that allow you to make sites with minimal duplication. Have you heard of MasterPages for .NET (I mean the external .NET 1.1 components that MS will be building into 2.0)? Well, Rails has simple some tools that give similar functionality. Check out Layouts and Partials if your interested. The main thing that I liked about these is just how easy it was to get going with them.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ajax&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;Ajax &lt;/a&gt;is a big buzzword that I keep hearing but don't know much about. You may have heard the hype about googles intelligent search box that can tell you how many matches there are for the word your typing? Well, that's an example of the Ajax philosophy in action. From what I can see, Rails is seriously trying to make this stuff easy for the developer in building web applications in this way. Read about the &lt;a href="http://weblog.rubyonrails.com/archives/2005/03/22/rails-0110-ajax-pagination-non-vhost-incoming-mail/"&gt;0.11 release&lt;/a&gt; of Rails to get a feel for what's going on in this area.&lt;br /&gt;&lt;br /&gt;Ok, my fingers are tired now. Was that at all interesting!? Lol, I'll hopefully write some more after I've spent a bit more time in Rails. Any comments welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111152642347823637?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111152642347823637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111152642347823637' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111152642347823637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111152642347823637'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/03/ruby-on-rails-random-thoughts-from-net.html' title='Ruby On Rails - random thoughts from a .NET perspective - Part 1'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-111152435288834579</id><published>2005-03-22T20:28:00.000Z</published><updated>2005-03-24T19:39:22.933Z</updated><title type='text'>Desperate students request quote for homework</title><content type='html'>As a freelancer I use agencies such as guru.com to find new projects. These tend to bring me a steady stream of project invitations of all kinds. Lol, and then today I got an especially interesting one that started with...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;"Description&lt;br /&gt;------------------------------&lt;br /&gt;Pointers and dynamic memory space allocation&lt;br /&gt;Strings and string functions&lt;br /&gt;Multi-dimensional arrays&lt;br /&gt;Arrays of pointers&lt;br /&gt;More control structures&lt;br /&gt;Sorting&lt;br /&gt;Functions, parameter passing, side effects&lt;br /&gt;Modular design&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;Now that Spring Break is almost here, you are getting very specific with your vacation choices. You are ready to create and print up possible itineraries of your vacation plans. You are going to be using the same type of data as for the previous lab with some additional information to be input and different types of output. You will be accepting data for 3 to 5 vacations.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#006600;"&gt;First you will be taking in the same data as in the first lab but instead of storing it in six separate arrays you will store it in one multi-dimensional array that can hold all six types of values (note that this means that all the data must be stored as the same type of numbers.) You comments should indicate which dimension of the array represents which piece of data...&lt;/span&gt; "&lt;br /&gt;&lt;span style="color:#006600;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;It goes on for about another page, but you get the idea. They had basically cut and paste their entire university assignment description, and asked me to bid. Lol. I've seen students post assignments on newsgroups, but never on a commercial project bidding site. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;The most facinating things about all this is that they're willing to pay between $41 and $60 per hour! Of course, I didn't bid. It's very sad though, whoever posted this should drop the course and find something they're interested in. Even better, their tutors will probably instantly detect something fishy about their assignment, and boot them off the course! &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-111152435288834579?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/111152435288834579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=111152435288834579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111152435288834579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/111152435288834579'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/03/desperate-students-request-quote-for.html' title='Desperate students request quote for homework'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110909064727841111</id><published>2005-02-22T16:21:00.000Z</published><updated>2005-02-22T23:21:42.563Z</updated><title type='text'>Object Relational Mapping can help Domain Driven Design</title><content type='html'>In the book &lt;a href="http://domaindrivendesign.org/book/"&gt;Domain Driven Design&lt;/a&gt;, Eric Evans promotes something called a &lt;em&gt;ubiquitous language&lt;/em&gt;. The idea behind a ubiquitous language is that you have a consistent terminology that is used &lt;em&gt;everywhere.&lt;/em&gt; Both business and technical experts should find and use this terminology in their conversations, and the terminology should appear directly in the source code, the database schema and also any written documentation. I guess he's basically saying that the language of the domain should be present and consistent throughout the entire "problem and solution space". This means that we don't have to work hard to translate between mental models.&lt;br /&gt;&lt;br /&gt;I like this idea. It seems to eliminate redundent and duplicated terminology therefore making things simpler and less ambiguous. If you think about it, the language directly represents the concepts of the problem, so it makes sense to nail it down and use it consistently.&lt;br /&gt;&lt;br /&gt;I'm striving to adopt this approach. One of my first problems is that I've been a little bit slack in keeping my database schema in check with the my domain objects. &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; doesn't automagically refactor my table names when I rename classes, so getting ubiquitous with my language requires more discipline 8-) So far I've tended to put this kind of thing off for a "rainy day". This is a bad habbit because rainy days don't seem to happen in my job. To make matters worse, it's going to be &lt;strong&gt;really&lt;/strong&gt; tedious looking through all the classes and all the tables and columns working out where the language used is "out of date" or inconsistent. Or is it?&lt;br /&gt;&lt;br /&gt;Today I realised something that's going to help me. I'm currently using NHibernate to map between by domain objects and my database. It occurred to me that the mapping files make a great single place to check that the language used in the database and objects is consistent. I reckon I can put a few hours aside to scan through the mapping files making note of any columns and tables that are named incorrectly. I can then simaltaneously write database update scripts and tweak the mapping files so that the database schema is corrected. How's that for getting a little leverage out of those hbm.xml files? 8-)&lt;br /&gt;&lt;br /&gt;I guess this idea might be obvious to some, but I think it *is* going to be a useful when it comes to checking that language truly is consistent across databas objects and domain classes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110909064727841111?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110909064727841111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110909064727841111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110909064727841111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110909064727841111'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/02/object-relational-mapping-can-help.html' title='Object Relational Mapping can help Domain Driven Design'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110901036523135300</id><published>2005-02-21T17:55:00.000Z</published><updated>2005-02-21T18:26:05.233Z</updated><title type='text'>Business Objects to DataSets and XML</title><content type='html'>If you use business objects in your .NET applications, you may find yourself in situations where you need to extract data from these into another representation. One example might be if you use some reporting software that expects to bind to datasets rather than business objects. I've been looking around for solutions to this problem, and here's what I've found so far. Please feel free to give any comments/success stories or alternatives if you know of them.&lt;br /&gt;&lt;br /&gt;Option 1)&lt;br /&gt;Rockford Lhotkas &lt;a href="http://www.lhotka.net/Articles.aspx?id=bd7a0904-e76d-48c3-a3ab-a8e9d9645c91"&gt;CLSA library&lt;/a&gt; has a class called ObjectAdapter. This flattens an object into a dataset. It doesn't follow relationships, and I think it's read only. But, it's a good start from the looks of things. I took the code out of his book, but if you google it I'm sure you can come find something downloadable.&lt;br /&gt;&lt;br /&gt;Option 2)&lt;br /&gt;There's a few folk talking about something called UI Mapping (a term coined by &lt;a href="http://weblogs.asp.net/pwilson/"&gt;Paul Wilson &lt;/a&gt;who makes &lt;a href="http://www.ormapper.net/"&gt;WilsonORMapper &lt;/a&gt;and soon the &lt;a href="http://weblogs.asp.net/pwilson/archive/2005/02/03/366258.aspx"&gt;WilsonUIMapper&lt;/a&gt;). This is basically taking objects and mapping them to UI widgets. Whilst a UI mapper won't necessarily help you get objects into datasets, it has caused people to think about this kind of problem. One project that I think looks promising is NView (&lt;a href="http://blogs.wdevs.com/phirephly/"&gt;http://blogs.wdevs.com/phirephly/&lt;/a&gt;). This is not a UI Mapper as such, but a tool to allow you to map from one conceptual view to another. You can easily map from an object graph to a dataset, for example. Also, the view can be bi-directional, which means that 2-way databinding is possible. I tweaked the example source code and was generating heirarchial datasets from objects in 7 lines of code.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Option 3)&lt;br /&gt;What I've been doing in the past is using some home grown code to convert an object graph into XML. I then use this to create reports using XSLT. It might not be great for all needs, but so far it's been handy for web based invoices, purchase orders, letters and that kind of thing.  The code works using reflection to walk an object graph and write out XML. It also allows you to specify a fetch plan so that it doesn't export the entire object graph. I can't share this code, but it wasn't too hard to write based on the power of reflection. You may wonder why I didn't use just make my objects XML Serializable - personally I find this tricky in many cases because you have to do a bit of tayloring to make your classes suitable.&lt;/p&gt;&lt;p&gt;I've not tried the above approaches in a commerical project yet, although I especially like the look of #2. A while back I was talking to Thomas Tomiczek who works on Thonas &lt;a href="http://www.thona-consulting.com/content/products/entitybroker.aspx"&gt;EntityBroker&lt;/a&gt; product. If I remember correctly their product also uses a kind of ObjectAdapter/ObjectView to allow mapping of objects to grids/GUI. Has anyone used this, any opionions to report back?&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110901036523135300?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110901036523135300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110901036523135300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110901036523135300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110901036523135300'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/02/business-objects-to-datasets-and-xml.html' title='Business Objects to DataSets and XML'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799744359990484</id><published>2005-02-10T01:02:00.000Z</published><updated>2005-02-16T17:40:50.076Z</updated><title type='text'>Blog Moved!</title><content type='html'>I'm now using Blogger.com to host my blog. I decided that I don't have time to continue my own blog engine. I've basically swiped all the content over manually, so sorry if things look a bit messy! You shouldn't need to update your RSS client, since I've just had the old page output the new feed! Does that make any sense!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799744359990484?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799744359990484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799744359990484' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799744359990484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799744359990484'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/02/blog-moved.html' title='Blog Moved!'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110607396414184034</id><published>2005-01-10T22:45:00.000Z</published><updated>2005-02-09T21:34:45.550Z</updated><title type='text'>Technorati Blog Watch Service</title><content type='html'>&lt;a href="http://www.technorati.com"&gt;Technorati&lt;/a&gt; are offering a cool looking blog watch service. This offers quick searching of blogs and the ability to set up watches (a little like googles web/news service). Try going on and doing a search for NHibernate or something.&lt;br /&gt;&lt;br /&gt;Click to see my &lt;a href="http://www.technorati.com/claim/di7g7qu2n4"&gt;Technorati Profile&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110607396414184034?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110607396414184034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110607396414184034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110607396414184034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110607396414184034'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/01/technorati-blog-watch-service.html' title='Technorati Blog Watch Service'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110798495006016580</id><published>2005-01-04T21:35:00.000Z</published><updated>2005-02-09T21:35:50.060Z</updated><title type='text'>Read other peoples code</title><content type='html'>&lt;p&gt;&lt;br /&gt;Today I was looking at the &lt;a href="http://www.martijnboland.com/cuyahoga"&gt;Cuyahoga&lt;/a&gt; project to see how it made use of NHibernate (comments &lt;a href="http://sourceforge.net/forum/message.php?msg_id=2922067"&gt;here&lt;/a&gt;). I'm currently on the NHibernate learning curve and it's good to see how other people do stuff. This reminded me that it's always nice to look through other peoples code. Since I'm a lone contractor, I don't have the great luxury of working with/learning from a team, so it's nice to soak up any external experience possible.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Another great resource for code browsing is the &lt;a href="http://www.koders.com/info.aspx?c=ProjectInfo&amp;pid=jwWH1iectmca7SU7g-CH2Q__&amp;amp;fld=nhibernate%5cnhibernate%5cnhibernate%5csrc%5cnhibernate%5c"&gt;koders open source project browser&lt;/a&gt;. This makes source browsing really easy! The link I gave gives the source for NHibernate, but it can show loads of projects. For example, a few months back I wanted to look at how different projects handled the command pattern. A search on koders for "Command" or "Action" revealed a whole host of projects that use this pattern. It was really interesting to see the different approaches used. So, this kind of thing can be a real learning tool.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Whilst on the subject of soaking up knowledge... I think another good way for us loners to get new knowldege is to talk to other developers via MSN/email. Yesterday I was talking to Thomas, and he was giving me some tips about mobile development. Also, I've been talking to a guy called Inderpal about NHibername and LLBLGEN, and he was telling me about his chosen architecture and project. Of course, I love my books/magazines/websites too, but live interactive communication just can't be beaten sometimes!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Starting my pet project, &lt;a href="http://sqlbuddy.sourceforge.net"&gt;SqlBuddy&lt;/a&gt; was a really good networking tool I thought, since it helped me get to know quite a few new developers (Thomas included, as his company worked on SqlBuddy for a while). Also, it was great fun working with developers all over the world on a shared (albeit small) code base. For any developer wanting to meet other developers and expand their knowledge, I would seriously recommend getting involved with an Open Source project if you have time.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I must admit, personally I would like to continue to communicate more with my fellow developers to share knowledge and get new ideas. I reckon it would be ace to hold weekly 30 minute MSN conference calls on a given subject, where each member can listen, ask questions and contribute. Any takers? Subjects could be ".NET Data Access Strategies", "NHibernate", "Small Enterprise Development Projects" etc... Even better, anyone know of any tools out there to help host such discussions?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110798495006016580?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110798495006016580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110798495006016580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110798495006016580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110798495006016580'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/01/read-other-peoples-code.html' title='Read other peoples code'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799629245571258</id><published>2005-01-03T01:42:00.000Z</published><updated>2005-02-10T00:45:07.050Z</updated><title type='text'>Loving the Pocket PC Gadgets...</title><content type='html'>&lt;p&gt;&lt;br /&gt;I've been chatting to Thomas Hansen this morning, and we've been talking about mobile devices and stuff. Actually, to be honest, Thomas has been telling me lots of things and I've been dribbling at the technology and possibilities. Thomas has been working on an &lt;a href="http://www.frostinnovation.com/"&gt;enterprise ERP system&lt;/a&gt; in .NET which includes support for the Pocket PC, so he seems very up to date on all this stuff.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I must admit, I'm becoming more and more excited as the mobile world starts to get better and better. For example, Thomas reckons that the best mobile device around these days is the &lt;a href="http://www.mobile-review.com/pda/review/htc-magician-en.shtml"&gt;i-mate JAM phone&lt;/a&gt;. It's much smaller than a conventional PDA, has loads of nice features and is more advanced than the usual smart phones. If only it had WiFi I'd buy it in an instant! But other than that it does have loads of nice features. I'm now hoping that I can find a .NET project that gives me a good reason to buy one of these things 8-) &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Thomas also pointed out was stuff like this &lt;a href="http://www.makayama.com/dvdtopocketpc.html"&gt;DVD to PocketPC Software&lt;/a&gt; which really starts to open up the options! Oh yes!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Finally there's nice add-ons such as the&lt;br /&gt;&lt;a href="http://www.coolsmartphone.com/index.php?option=articles&amp;task=viewarticle&amp;artid=376"&gt;TomTom GPS system&lt;/a&gt; that can be purchased stand alone or just plug into a mobile phone.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799629245571258?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799629245571258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799629245571258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799629245571258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799629245571258'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2005/01/loving-pocket-pc-gadgets.html' title='Loving the Pocket PC Gadgets...'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799634948927964</id><published>2004-12-31T01:45:00.000Z</published><updated>2005-02-10T00:45:49.490Z</updated><title type='text'>Hello Podcasting</title><content type='html'>&lt;p&gt;&lt;br /&gt;After buying myself a nice 1GB MP3 Player for christmas, I've decided to poke my nose into the world of podcasting. This is great stuff! I can basically add informative and interesting broadcasts to my MP3 Player for listening to on the move. Of course, I can also just listen to the shows in Windows Media Player without leaving my desk!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;The nice thing about this technology is that you can chose what you want to listen to by subscribing to your chosen feeds, and then listen to it when you want to. &lt;br /&gt;I'm using &lt;a href="http://www.dopplerradio.net/"&gt;Doppler&lt;/a&gt; to automatically pull down the feeds I'm interested. This is written in .NET, and is a nice and tidy piece of software.&lt;/p&gt;&lt;p&gt;Doppler has a built in feed search, but in my view it doesn't give enough information about the feed. so, I'm using &lt;a href="http://www.podcastalley.com"&gt;http://www.podcastalley.com&lt;/a&gt; for finding feeds of interest. This place has handy "Top 50" and "Top 10" lists, and also user reviews etc.&lt;br /&gt;&lt;p&gt;So far I've subscribed to the Dot Net Rocks show (which I love), the "engadget" feed, and "Software as she's developed". I've yet to listen to the latter two.&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So far I'm loving this podcasting stuff, it's really neat. In fact, it actually makes me *want* to just go our for walks whilst listening to stuff, so I could argue that podcasting is even good for the health! Ok, I'm currently in Nassjo, Sweden, so it could also be the beautiful scenery that makes me want to walk 8-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799634948927964?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799634948927964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799634948927964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799634948927964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799634948927964'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/hello-podcasting.html' title='Hello Podcasting'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799638468108539</id><published>2004-12-29T01:46:00.000Z</published><updated>2005-02-10T01:00:51.476Z</updated><title type='text'>.NET Code Generators (2)</title><content type='html'>&lt;p&gt;&lt;br /&gt;Unfortunately the project requiring a code generator went on hold!  But, I did manage to try out Deklarit before this happened. Deklarit seems like a very sexy piece of software, but unfortunately it just didn't do the business for me. I was most upset about it wanting me to use certain naming conventions so that it could derive relationships between entities using thier field names. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;On one side there is a beautiful simplicity to this approach in that less meta information has to be maintained. On the other side, I think the Deklarit team have created an unnatural dependency between to orthagonal issues. This has made working with legacy schemas a pain in the rear! I do know that Deklarit offer a reasonable approach to circumnavigating this problem, but to be honest I didn't have time to understand it. Furthermore, I had other problems too, and couldn't work out if they were down to me being a muppet or problems with the tool. Probably the former. To be fair, there are lots of great things said about Deklarit (clarity in documentation, snazzy look and feel, clever schema migration etc), and perhaps I'll try it again in the future. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In my virtual travels I still keep hearing good things about &lt;a href="http://www.llblgen.com/"&gt;LLBLGEN Pro&lt;/a&gt;. Many people seem to love this tool, and I'm definately going to give it a trial. I'll admit that I have installed it already, but not used it. That said, I did read some of help documentation, and this alone worth the install without even loading the program up! I spoke to one guy who said this:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;I conducted a very detailed research looking for a powerful, easy to use, flexible, configurable and near perfect data layer. I compared the following -&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;1. Wilson OR Mapper&lt;br /&gt;&lt;br&gt;2. Entity-Broker&lt;br /&gt;&lt;br&gt;3. LLBL Gen Pro&lt;br /&gt;&lt;br&gt;4. Custom code generation template&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;Of all I ended up selecting LLBL Gen Pro. This is the only one that is easy to use, comes with amazing support and documentation and is configurable to support a lot of corner cases, like supporting an ASP hosting with multiple database instances with similar schema; changing connection string at run time; providing complex joins for views, drop downs etc right as part of the application design. The learning curve is a about a week but worth the buck!!&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;My second favourite is the Wilson OR Mapper but they need to improve the following&lt;br /&gt;&lt;br&gt;- documentation&lt;br /&gt;&lt;br&gt;- cover corner cases for real projects with decently large budgets&lt;br /&gt;&lt;br&gt;- prepare the code generation wizard to handle more than simple OR Mapping between directly related tables; provide the concept of LLBL Gen Pro's TypedList.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799638468108539?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799638468108539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799638468108539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799638468108539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799638468108539'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/net-code-generators-2.html' title='.NET Code Generators (2)'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799642983121998</id><published>2004-12-28T01:46:00.000Z</published><updated>2005-02-10T01:01:07.170Z</updated><title type='text'>Cuyahoga .NET Web Framework (using NHibernate)</title><content type='html'>&lt;p&gt;&lt;br /&gt;I haven't looked at this in detail, but this CMS looks tidy I thought.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.martijnboland.com/cuyahoga/1/view.aspx"&gt;http://www.martijnboland.com/cuyahoga/1/view.aspx&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In particular, if you look at the admin screens in the &lt;a href="http://www.martijnboland.com/cuyahoga/home/features/screenshots.aspx"&gt;screenshots section&lt;/a&gt; you'll see what I mean. As a bonus, this also uses NHibernate to manage it's persistance, so could be a good reference application for best practices? I'm going to take a closer look and publish my findings... &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799642983121998?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799642983121998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799642983121998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799642983121998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799642983121998'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/cuyahoga-net-web-framework-using.html' title='Cuyahoga .NET Web Framework (using NHibernate)'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799646320327682</id><published>2004-12-21T01:47:00.000Z</published><updated>2005-02-10T00:47:43.203Z</updated><title type='text'>Domain Driven Development</title><content type='html'>&lt;p&gt;&lt;br /&gt;I've recently been reading Domain Driven Development (by Eric Evans). This is an excellent book I think, there's some really good advice to those looking for good techiniques to deriving their object models. In fact, I'm wondering if it's the best book I've read on the subject!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Eric recommends focusing on communications, and developing a single, consistent and ubiqoutous set of terminology with which all team players can talk about the business and the software. Furthermore, this language should be used in the code also, so that the domain model completely mirrors terminology that appears in business conversations. This sounds simple, but how many times do you find yourself naming classes in such a way that don't really reflect anything that's come up in conversation? &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Today I started applying this technique on an existing code base, and the results are quite startling. Suddenly my domain model is looking much more understandable, because it completely reflects the concepts that myself and the client have been discussing and exploring. I can also see where my code is straying from the "real" business model, which tells me I have some work to do to bring it on track.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Another nice aspect of the book is that it describes a system of names for software designers. Eric talks about the different types of classes that can appear in and around your domain model. He gives us a set of object "types" that broadly abstract the roles your classes play inside a software system. Examples are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;ENTITIES: These are usually long lived objects that have an identity. They are usually persisted in a database of some kind.&lt;br /&gt;&lt;li&gt;VALUES: These are value objects that don't really have an identity, may be immutable, and are used for messaging or to describe aspects of ENTITIES.&lt;br /&gt;&lt;li&gt;FACTORIES: Rather than having complex initialisation logic inside ENTITIES, Eric recommends using factories to create them instead. This is basically the Factory pattern.&lt;br /&gt;&lt;li&gt;AGGREGATES: This one is a great idea. Eric recommends distingushing between entities that are "root" and those that are not. &lt;br /&gt;&lt;li&gt;REPOSITORIES: These represent root collections of ENTITIES. Basically save and load points.&lt;br /&gt;&lt;li&gt;SERVICES: Behaviours that do not belong in any IDENTITIES can be packed into services. He also talks about the difference between application and domain services.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Anyway, I won't waffle on. I thought this is a great book and would recommend it to all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799646320327682?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799646320327682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799646320327682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799646320327682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799646320327682'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/domain-driven-development.html' title='Domain Driven Development'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799650132178396</id><published>2004-12-15T01:48:00.000Z</published><updated>2005-02-10T01:01:26.786Z</updated><title type='text'>FOP FOP FOP!!!</title><content type='html'>&lt;p&gt;&lt;br /&gt;A new project has got me lookign into the world of XSL-FO and FOP for .NET based PDF generation. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Things didn't look to good to start with, and I was having problems finding an XSL-FO engine. More specifically, I was having troubles finding a &lt;b&gt;FREE&lt;/b&gt; one! 8-) This isn't me being a skin-flint: basically, my client had manually achieved what they needed using the Java based Apache FOP. We need to use it within a .NET environment, which either means calling it externally or sourcing a good, FREE .NET component for the job. I haven't started the evaluations yet, but here is a list of candidate .NET components&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;FREE/Open Source XSL-FO&lt;/h3&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://nfop.sourceforge.net/"&gt;nFOP&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Looking promising. It relies on referncing the Java dll in VS.NET (vjslib) wheras pure c# would have been nice.  Then again, I shouldn't be so picky, this is a good java port, and I'd much rather have that than nothing! The forum has had some activity, and some posts show examples of usage which is handy. The real problem we've hit is that it only supports .jpg images, and we need gifs. This is a shame because it was looking promising. Also, it hasn't been developed for ages by the looks of things, so it's falling behind the Apache FOP from which it was ported.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://fop-dotnet.sourceforge.net/"&gt;dotnet-fop&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Dead in the water by the looks of things&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://opensource.bureau-cornavin.com/xsl-fo/"&gt;Dandy (aka xslfoproc)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;works on mono too. lots of documentation. However, couldn't get a build working (its written in c   and c#)!&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://xml.apache.org/fop/index.html"&gt;Apache FOP&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Ok, this is a Java thing, not a .NET thing. However, it's open source and it is a really good FOP which has matured over the years. We're considering bundling this along with our .NET app and then calling it from the command line (using the Process class in .NET). &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Commercial XSL-FO&lt;/h3&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;Chive Apoc&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;This one is good and works straight out of the can. However, no price info available yet, so don't know if it's a winner!&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;I'll post up my findings once I've finished the reviews!&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799650132178396?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799650132178396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799650132178396' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799650132178396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799650132178396'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/fop-fop-fop.html' title='FOP FOP FOP!!!'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799653383190373</id><published>2004-12-10T01:48:00.000Z</published><updated>2005-02-10T01:01:40.233Z</updated><title type='text'>Change your Passwords!</title><content type='html'>&lt;p&gt;Wow, sometimes I learn something great that's so simple, it makes me feel stupid for not having thought of it before. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;This time it's something written in a &lt;a href="http://www.theserverside.net/blogs/showblog.tss?id=StopUsingPasswords"&gt;blog post&lt;/a&gt; by Robert Hensing about how you should &lt;b&gt;not&lt;/b&gt; use passwords. Instead, he says use PASSPHRASES! A typical &lt;b&gt;password&lt;/b&gt; for your windows/email/blah login might be "t0b1n996", but apparently this is very easily cracked by brute force despite being hard to remember and looking complicated! &lt;p&gt;A typical &lt;b&gt;passphrase&lt;/b&gt; is virtually uncrackable by brute force and is much easier to remember. An good example might be "And she's buying a stairway to heaven", which is longer than the recommended 14 characters.&lt;p&gt;So, the general idea is to use long passphrases rather than short complex passwords. Simple eh!? I'm off to go and uypgrade all my passwords!... And, I'm off to update all my login forms/pages columns to say "Please enter your passphrase", rather than "Please enter your password". Then I'm gonna get out more 8-)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;As an aside, this approach reminded me of how I need to apply lateral thinking techniques more often. I'm pretty sure that the label "password" is responsible for ones tendency to chose single words over long phrases. I should have challenged that lable a long time ago! &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/10236702-110799653383190373?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799653383190373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799653383190373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799653383190373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799653383190373'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/change-your-passwords.html' title='Change your Passwords!'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799656809298897</id><published>2004-12-01T01:49:00.000Z</published><updated>2005-02-10T01:01:51.596Z</updated><title type='text'>TextBox Auto Fit to Size</title><content type='html'>I was recently trying to get a textbox to grow depending on how much text there was in it. This is quite simple if you're NOT using word wrap - but if you are it's a real pain in the arse!&lt;br /&gt;&lt;p&gt;The basic approach is to capture the TextChanged event, and then work out how many lines there are, and then how high each line is. This is all really easy, except working out how many lines there are. The textbox has a .Lines.Length property, but this won't be adjusted if you have word wrap on. &lt;br /&gt;&lt;p&gt;&lt;br /&gt;Anyway, after ages of searching and trying out different things, I stumbled across the most simple thing that just seems to work! &lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here it is...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public static int GetLineCount( TextBoxBase textbox )&lt;br /&gt;		{&lt;br /&gt;			const int EM_GETLINECOUNT = 186;&lt;br /&gt;			return SendMessage( &lt;br /&gt;				textbox.Handle, EM_GETLINECOUNT, 0, 0 );&lt;br /&gt;		}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Once you have this, you can do something like this to get make your text box grow to the correct size.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Graphics g = _textBox.CreateGraphics();&lt;br /&gt;&lt;br /&gt;float size = _textBox.Font.GetHeight(&lt;br /&gt;	_textBox.CreateGraphics()&lt;br /&gt;	) * (float) 1.075; &lt;br /&gt;&lt;br /&gt;_textBox.Height  = Convert.ToInt32( &lt;br /&gt;	(	TextBoxMeasure.GetLineCount( &lt;br /&gt;		_textBox )   1) * size&lt;br /&gt;	);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799656809298897?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799656809298897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799656809298897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799656809298897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799656809298897'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/12/textbox-auto-fit-to-size.html' title='TextBox Auto Fit to Size'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10236702.post-110799667076162039</id><published>2004-09-14T01:50:00.000+01:00</published><updated>2005-02-10T00:51:10.760Z</updated><title type='text'>.NET Code Generators</title><content type='html'>&lt;p&gt;&lt;br /&gt;I'm currently in the market for a n-Tier code generator, to help me to RAD some business applications. It would appear that things are moving along nicely in the .NET world. However, there are just *soooo* many to chose from! &lt;a href="http://www.codegeneration.net/generators-by-language.php?language=3" target="_blank"&gt;Codegeneration.net&lt;/a&gt; seems to keep a fairly exhaustive list, as does &lt;a href="http://sharptoolbox.madgeek.com" target="_blank"&gt;SharpToolBox&lt;/a&gt;. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My main problem is in evaluation and selection process. I reckon I could download and test about 10 different tools, taking 4 hours for each to get a feel for them, and there goes my week 8-) Lol, and my Start Menu would gain another 3 inches in breadth too 8-)&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If anyone wants to send me any success/failure stories for .NET code generators then please do, I'd be extremely appreciative. I'll gladly put your thoughts up here too for the world to share!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ideally I'd like to wittle this list down to as few options as possible:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;ArcStyler&lt;br /&gt;&lt;li&gt;CompileX&lt;br /&gt;&lt;li&gt;Constructor()&lt;br /&gt;&lt;li&gt;DeKlarit&lt;br /&gt;&lt;li&gt;Iron Speed Designer&lt;br /&gt;&lt;li&gt;IronWorks&lt;br /&gt;&lt;li&gt;LLBLGen&lt;br /&gt;&lt;li&gt;nTierGen.NET&lt;br /&gt;&lt;li&gt;OlyMars&lt;br /&gt;&lt;li&gt;QuickAdmin&lt;br /&gt;&lt;li&gt;RapTier&lt;br /&gt;&lt;li&gt;Tangible Architect&lt;br /&gt;&lt;li&gt;Visible Developer&lt;br /&gt;&lt;li&gt;XCoder&lt;br /&gt;&lt;li&gt;TierDeveloper&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Of course my choise is driven by a few factors, these are:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Must be C# .NET Generator&lt;br /&gt;&lt;li&gt;Must generate ASPX AND Winforms Apps&lt;br /&gt;&lt;li&gt;Must have some reverse engineering from DB options&lt;br /&gt;&lt;li&gt;Apps must visually look decent out of the box - no grotty generated UIs.&lt;br /&gt;&lt;li&gt;Must allow me to customise certain forms, without killing my changes on the next gen.&lt;br /&gt;&lt;li&gt;Must be supported, either by active community forums and/or vendor.&lt;br /&gt;&lt;li&gt;Be nice if it works with many database engines (Postgres, SQL Server, Access, Oracle etc)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I'm wondering what the world thinks are the best RAD/Generation tools for .NET business applications? &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A brief browse has got me some interesting and invredibly encouraging &lt;a href="http://msmvps.com/williamryan/articles/6268.aspx" target="_blank"&gt;opinions on both DeKlarit and LLBLGen &lt;/a&gt;. That's a good blog! &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;From what I've found so far, the world *is* raving about both of these products, especially DeKlarit! I'm going to download the demo and have a play...&lt;br /&gt;&lt;p&gt;P.S - If you're working for TierDeveloper you'll be glad to see I've added you to my list. However, your marketing bods are just a little aggressive for my liking, they just don't give up pestering me. Anyway, it worked, and your product is now mentioned here. Well done.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10236702-110799667076162039?l=tobinharris.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tobinharris.blogspot.com/feeds/110799667076162039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10236702&amp;postID=110799667076162039' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799667076162039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10236702/posts/default/110799667076162039'/><link rel='alternate' type='text/html' href='http://tobinharris.blogspot.com/2004/09/net-code-generators.html' title='.NET Code Generators'/><author><name>Tobin Harris</name><uri>http://www.blogger.com/profile/02203581553681366247</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_XCZWg0tDZP4/SM-K7fwOv1I/AAAAAAAAAA4/Xycsfr-M0cM/S220/tobin.jpg'/></author><thr:total>2</thr:total></entry></feed>
