<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title>tobin harris</title>
  <id>http://www.tobinharris.com/</id>
  <updated>2009-11-07T08:00:00+00:00</updated>
  <author>
    <name>Tobin Harris</name>
  </author>
  <link rel="self" href="http://www.tobinharris.com/blog/atom.xml" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><title type="text">Links for 2009-11-06 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/CYmfEFLqlPc/tobinharris" /><updated>2009-11-07T00:00:00-08:00</updated><id>http://del.icio.us/tobinharris#2009-11-06</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.specflow.org/specflow/workflow.aspx"&gt;SpecFlow - workflow&lt;/a&gt;&lt;br/&gt;
Pretty cool .NET testing stuff. Works with Resharper.&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-11-06</feedburner:origLink></entry><entry><title type="text">Links for 2009-11-04 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/_V28vCoYAm4/tobinharris" /><updated>2009-11-05T00:00:00-08:00</updated><id>http://del.icio.us/tobinharris#2009-11-04</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen.html"&gt;Hans Rosling shows the best stats you've ever seen | Video on TED.com&lt;/a&gt;&lt;br/&gt;
Cool data visualisation talk showing stuff that Google bought&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-11-04</feedburner:origLink></entry><entry><title type="text">Links for 2009-10-28 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/QmAc8VZm-_g/tobinharris" /><updated>2009-10-29T00:00:00-07:00</updated><id>http://del.icio.us/tobinharris#2009-10-28</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://venturehacks.com/articles/minimum-viable-product-examples"&gt;10 examples of minimum viable products  &amp;amp;#45;  Venture Hacks&lt;/a&gt;&lt;br/&gt;
Minimal Viable Products - really interesting.&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-10-28</feedburner:origLink></entry><entry><title type="text">Links for 2009-10-26 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/iVWyTvU_YQA/tobinharris" /><updated>2009-10-27T00:00:00-07:00</updated><id>http://del.icio.us/tobinharris#2009-10-26</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nonspeaking.blogspot.com/2009/04/google-reader-mobile-client-with-rhodes.html"&gt;nonspeaking: Google Reader mobile client with Rhodes&lt;/a&gt;&lt;br/&gt;
Rhodes RSS reader&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-10-26</feedburner:origLink></entry><entry><title type="text">Links for 2009-10-25 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/iErI6hGG1OI/tobinharris" /><updated>2009-10-26T00:00:00-07:00</updated><id>http://del.icio.us/tobinharris#2009-10-25</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dsl.org/cookbook/cookbook_16.html#SEC231"&gt;The Linux Cookbook: Tips and Techniques for Everyday Use - Analyzing Text&lt;/a&gt;&lt;br/&gt;
Linux command cook book, pretty awesome.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/stateless/"&gt;stateless -    Project Hosting on Google Code&lt;/a&gt;&lt;br/&gt;
Interesting state machine implementation&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.styleshout.com/"&gt;Styleshout.com | Free CSS Website Templates, Webdesign &amp;amp; CSS Resources&lt;/a&gt;&lt;br/&gt;
Free CSS templates&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-10-25</feedburner:origLink></entry><entry><title type="text">Links for 2009-10-21 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/5kVCTCKACnY/tobinharris" /><updated>2009-10-22T00:00:00-07:00</updated><id>http://del.icio.us/tobinharris#2009-10-21</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.xero.com/pricing/"&gt;Xero&lt;/a&gt;&lt;br/&gt;
online accounting solution&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spanningsync.com/"&gt;Spanning Sync 3 - Sync iCal with Google Calendar, Sync Address Book with Google Contacts&lt;/a&gt;&lt;br/&gt;
Syncing google with mac.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webdesignerwall.com/trends/iphone-app-site-design-trends/"&gt;iPhone App Site Design Trends&lt;/a&gt;&lt;br/&gt;
Nice&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.queness.com/post/204/25-jquery-plugins-that-enhance-and-beautify-html-form-elements"&gt;25+ jQuery Plugins that enhance and beautify HTML form elements | Queness&lt;/a&gt;&lt;br/&gt;
Lots of nice jQuery ui elements&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-10-21</feedburner:origLink></entry><entry><title type="text">Links for 2009-10-20 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog_of_tobin/~3/2ByVWm1UoKw/tobinharris" /><updated>2009-10-21T00:00:00-07:00</updated><id>http://del.icio.us/tobinharris#2009-10-20</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://grasshopper.com/"&gt;Virtual Phone System, Toll Free Numbers and Voicemail &amp;ndash; Grasshopper&lt;/a&gt;&lt;br/&gt;
Have a phone number that follows you. 37 Signals are trying it out.&lt;/li&gt;
&lt;/ul&gt;</content><feedburner:origLink>http://del.icio.us/tobinharris#2009-10-20</feedburner:origLink></entry><entry>
    <title>One Liner: Email A Web Page To Yourself On OSX or Linux</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/wxzW06-nhIA/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-09-30T06:36:58-07:00</id>
    <published>2009-09-30T06:36:58-07:00</published>
    <updated>2009-09-30T06:36:58-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I found an easy way to email a web page to myself from the OSX command line using echo, curl, and sendmail.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I found an easy way to email a web page to myself from the OSX command line using echo, curl, and sendmail.&lt;/p&gt;

&lt;p&gt;This is handy if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a status page online that you want sending to you every day&lt;/li&gt;

&lt;li&gt;You have a business report online that you want sent to you every week/day etc.&lt;/li&gt;

&lt;li&gt;You want a quick backup of an online document&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note, this is simple stuff for anyone who&amp;#8217;s used Linux for more than a few months I bet!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here it is on separate lines first&amp;#8230;&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;echo &amp;#39;Subject: Document Backup&amp;#39; &amp;gt; tmp.txt 
echo &amp;#39;Content-type: text/html&amp;#39; &amp;gt;&amp;gt; tmp.txt 
curl http://docs.socena.com/document/test/readme &amp;gt;&amp;gt; tmp.txt  
sendmail -v tobin@tobinharris.com &amp;lt; tmp.txt 
rm tmp.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or, I can do it in one line like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;echo &amp;#39;Subject: Document Backup&amp;#39; &amp;gt; tmp.txt &amp;amp;&amp;amp;  echo &amp;#39;Content-type: text/html&amp;#39; &amp;gt;&amp;gt; tmp.txt &amp;amp;&amp;amp; curl http://docs.socena.com/document/test/readme &amp;gt;&amp;gt; tmp.txt &amp;amp;&amp;amp; sendmail -v tobin@tobinharris.com &amp;lt; tmp.txt &amp;amp;&amp;amp; rm tmp.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just copy and paste that into your OSX Terminal (please replace the email address and http:// to your own though!)&lt;/p&gt;

&lt;p&gt;You could then create a cron job to have this line executed once a day.&lt;/p&gt;

&lt;p&gt;In case your wondering, &lt;code class='prettyprint'&gt;echo&lt;/code&gt; is just like a &lt;code class='prettyprint'&gt;print&lt;/code&gt; statement. The &lt;code class='prettyprint'&gt;&gt;&lt;/code&gt; pipes it to a text file, creating a new file each time. The &lt;code class='prettyprint'&gt;&gt;&gt;&lt;/code&gt; appends to the file.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/9/30/one-liner-email-a-web-page-to-yourself-on-osx-or-linux/</feedburner:origLink></entry>
  <entry>
    <title>7 Tips For Perfect Coffee</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/93c0psOopaA/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-09-13T03:58:22-07:00</id>
    <published>2009-09-13T03:58:22-07:00</published>
    <updated>2009-09-13T03:58:22-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;My friends often tell me I make a great coffee. I&amp;#8217;m a big coffee fan, so I&amp;#8217;ve put quite a bit of research into getting it right. Here&amp;#8217;s my tips:&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;My friends often tell me I make a great coffee. I&amp;#8217;m a big coffee fan, so I&amp;#8217;ve put quite a bit of research into getting it right. Here&amp;#8217;s my tips:&lt;/p&gt;

&lt;h3 id='tip_a_machine_with_9_bars_or_more'&gt; Tip: A Machine With 9 Bars Or More&lt;/h3&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090913-qywbsr5idbhq1puw9y2aqy2sgq.png' alt='Gaggia 16109 Evolution' /&gt;&lt;/p&gt;

&lt;p&gt;This is a bit obvious, but you need a machine that has a enough pressure (9 bar minimum, and 19 bar is optimal). We have a Gaggia 16109 Evolution at home. It costs about £150 ($200), so not the most expensive, but it certainly gets the job done.&lt;/p&gt;

&lt;h3 id='tip_clean_the_machine_really_well_before_use'&gt;Tip: Clean The Machine REALLY WELL Before Use&lt;/h3&gt;

&lt;p&gt;This is essential for getting a great coffee flavour. You don&amp;#8217;t want any dull or stale flavours in your coffee, which is what happens when you don&amp;#8217;t clean it properly. Think &lt;em&gt;signal vs noise&lt;/em&gt;. The signal is the fresh coffee and the milk, you don&amp;#8217;t want anything else in there. I&amp;#8217;m happy to spend 5-10 minutes cleaning the coffee machine beforehand.&lt;/p&gt;

&lt;p&gt;To clean the machine, I just make coffee without coffee! This flushes out old water and any old bits of coffee in the machine.&lt;/p&gt;

&lt;p&gt;I clean the milk wand by using it to steam a cup of boiling water.&lt;/p&gt;

&lt;h3 id='tip_buy_great_coffee'&gt;Tip: Buy Great Coffee&lt;/h3&gt;

&lt;p&gt;Right now, &lt;a href='http://www.surlatable.com/product/id/151827.do?mr:trackingCode=D466AEDC-D781-DE11-B7F3-0019B9C043EB'&gt;Illy&lt;/a&gt; is my favourite. We get the ready-ground MOKA stuff, it&amp;#8217;s awesome. We also have our own bean grinder, but I&amp;#8217;m yet to find fresh beans that match the Illy. One thing about the tins of Illy is that you need to use them within 2-3 weeks, I find the quality drops off after that.&lt;/p&gt;

&lt;h3 id='tip_let_the_machine_warm_up'&gt;Tip: Let The Machine Warm Up&lt;/h3&gt;

&lt;p&gt;I let the machine and coffee holder warm up before I make the first coffee. This can take 5-10 minutes. If you clean the machine by flushing it through once or twice, you&amp;#8217;ll find everything gets hot during that time.&lt;/p&gt;

&lt;p&gt;When I don&amp;#8217;t do this the coffee seems to come out bitter and watery. So it&amp;#8217;s well worth the wait.&lt;/p&gt;

&lt;h3 id='tip_aim_for_a_crema_layer'&gt;Tip: Aim For A Crema Layer&lt;/h3&gt;

&lt;p&gt;The crema layer is that lovely layer of oil that floats on top of an espresso coffee. You need to have a good crema layer on your coffee, to me this is a signal that everything has gone right. This usually means buying great coffee and getting the temperature right.&lt;/p&gt;

&lt;h3 id='tip_warm_the_milk_before_frothing'&gt;Tip: Warm The Milk Before Frothing&lt;/h3&gt;

&lt;p&gt;I find that scorching hot milk ruins coffee. I usually warm the milk in the microwave, and then use the steam wand quickly to add a little extra heat and get the desired amount of froth.&lt;/p&gt;

&lt;h3 id='tip_consider_an_external_frother'&gt;Tip: Consider An External Frother&lt;/h3&gt;

&lt;p&gt;Our machine has a steam wand built in for frothing milk, but I&amp;#8217;d prefer a separate unit. Basically, with a built in steam wand you risk getting the machine to hot that it scorches the coffee. I haven&amp;#8217;t bought a separate frother, but I will soon. Something &lt;a href='http://www.amazon.com/Froth-Au-Lait-FAL-B-Frothing/dp/B00005O0LK/ref=pd_sbs_k_2'&gt;like this&lt;/a&gt; looks good.&lt;/p&gt;

&lt;h3 id='bean_to_cup_or_not'&gt;Bean To Cup Or Not?&lt;/h3&gt;

&lt;p&gt;I enjoy the ritual of preparing the machine and making the coffee, so I stay away from bean-to-cup machines.&lt;/p&gt;

&lt;p&gt;In all fairness, those machines do make great coffee, and they&amp;#8217;re really convenient. On the down-side, they&amp;#8217;re as big as a laser printer, and there&amp;#8217;s plenty to go wrong.&lt;/p&gt;

&lt;p&gt;Keep it simple and use traditional a espresso machine with separate frother. Next time I&amp;#8217;ve got £1500 ($2000) to spare I&amp;#8217;ll be looking at the &lt;a href='http://stores.channeladvisor.com/newsound/Items/1921_215'&gt;Gaggia TS&lt;/a&gt; or similar.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/9/13/7-tips-for-perfect-coffee/</feedburner:origLink></entry>
  <entry>
    <title>iPhone: 1, NASA Phoenix Mars Lander: 0</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/Z3b7WxJlpqk/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-09-03T16:14:35-07:00</id>
    <published>2009-09-03T16:14:35-07:00</published>
    <updated>2009-09-03T16:14:35-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m reading a book called &lt;a href='http://www.amazon.co.uk/gp/product/0596157118?ie=UTF8&amp;amp;tag=tobinharrisho-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0596157118'&gt;Beautiful Data&lt;/a&gt;, where there are various people talking about how they&amp;#8217;ve worked with data sets. These include interesting stories from NASA, Yahoo!, the guys that made a RadioHead video, and tons more.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;&lt;img src='http://www.foxnews.com/images/299501/0_21_mars_phoenix_touchdown.jpg' alt='Mars Lander' /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m reading a book called &lt;a href='http://www.amazon.co.uk/gp/product/0596157118?ie=UTF8&amp;amp;tag=tobinharrisho-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0596157118'&gt;Beautiful Data&lt;/a&gt;, where there are various people talking about how they&amp;#8217;ve worked with data sets. These include interesting stories from NASA, Yahoo!, the guys that made a RadioHead video, and tons more.&lt;/p&gt;

&lt;p&gt;The book is very interesting, in fact, I think it should be called &lt;em&gt;Interesting Data&lt;/em&gt; since it&amp;#8217;s not all about how the data is displayed.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m still reading, but the NASA Phoenix Mars Lander story is particularly interesting; It talks in depth about the hardware and software of the lander craft.&lt;/p&gt;

&lt;p&gt;I expected some pretty hefty hardware in a ultra-high-tech, 2008 mars lander. Wouldn&amp;#8217;t you? But no no no. Apparently the Phoenix has only &lt;strong&gt;10MB or RAM&lt;/strong&gt;, and a lowly &lt;strong&gt;20Mhz CPU&lt;/strong&gt;. WTF!?!? This is a craft sent to Mars to help us understand if the planet might have been capable of sustaining life, and all NASA could do was send up something with less processing grunt than a shitty mobile phone!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apple iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;400Mhz CPU&lt;/li&gt;

&lt;li&gt;128MB RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Phoenix High Tech Mars Lander&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20Mhz CPU&lt;/li&gt;

&lt;li&gt;10MB RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In all fairness, the Phoenix RAM and CPU components have the edge when it comes to coping with high energy cosmic rays, crazy levels of heat, and radiation. I wouldn&amp;#8217;t bank on my iPhone making it out of the earth&amp;#8217;s atmosphere and surviving on a freezing planet surface whilst collecting and beaming data for months.&lt;/p&gt;

&lt;p&gt;Jokes aside, &lt;a href='http://www.amazon.co.uk/gp/product/0596157118?ie=UTF8&amp;amp;tag=tobinharrisho-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0596157118'&gt;the book&lt;/a&gt; is a really interesting read. Enjoy.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/9/3/iphone-1-nasa-phoenix-mars-lander-0/</feedburner:origLink></entry>
  <entry>
    <title>Want to be involved with yUML?</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/FP8ePZopQAk/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-09-01T12:25:00-07:00</id>
    <published>2009-09-01T12:25:00-07:00</published>
    <updated>2009-09-01T12:25:00-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I&amp;#8217;ve had a bit of a rest from &lt;a href='http://yuml.me'&gt;yUML&lt;/a&gt; recently, but by no means has the project stalled. Whilst I&amp;#8217;ve been focusing on earning cash to pay bills, it&amp;#8217;s been great to see a small &lt;a href='http://yuml.me/wildthing'&gt;ecosystem&lt;/a&gt; grow around yUML, and soon I&amp;#8217;ll be looking to spend time on the project again for &lt;em&gt;phase 2&lt;/em&gt;.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I&amp;#8217;ve had a bit of a rest from &lt;a href='http://yuml.me'&gt;yUML&lt;/a&gt; recently, but by no means has the project stalled. Whilst I&amp;#8217;ve been focusing on earning cash to pay bills, it&amp;#8217;s been great to see a small &lt;a href='http://yuml.me/wildthing'&gt;ecosystem&lt;/a&gt; grow around yUML, and soon I&amp;#8217;ll be looking to spend time on the project again for &lt;em&gt;phase 2&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Someone got in touch recently about getting commercially involved with yUML. Whilst I was responding, I thought I&amp;#8217;d share my response where more people can see it. It would be great if anyone has any ideas or would consider getting involved with the project.&lt;/p&gt;

&lt;h3 id='_email_'&gt;=== Email ===&lt;/h3&gt;

&lt;p&gt;Hi Mr X&lt;/p&gt;

&lt;p&gt;Thanks for the enquiry and information.&lt;/p&gt;

&lt;p&gt;About your question, yUML isn&amp;#8217;t actually making me any money right now. My plan was to build something cool, and then think of ways of getting it to cover it&amp;#8217;s own costs, or even generate an income.&lt;/p&gt;

&lt;p&gt;I think the first part of the plan is working: yUML get&amp;#8217;s several tweets a day and all are very positive. It also serves 500-1000 visitors a day, which is great for such a niche product. All in all, the site is dishing up half a million requests a month, and 10&amp;#8217;s of thousands of UML diagrams! Analog report is here: http://yuml.me/analog/Report.html&lt;/p&gt;

&lt;p&gt;I plan to keep yUML alive and kicking although right now I&amp;#8217;m focusing on paying bills. I&amp;#8217;m very interested in hearing from people who could help me satisfy the second &amp;#8220;money&amp;#8221; part of the plan.&lt;/p&gt;

&lt;h3 id='_end_'&gt;=== END ===&lt;/h3&gt;

&lt;p&gt;Would be nice to hear from people who&amp;#8217;ve been-there-done-that. Anyone ready to share the challenge of forging a new direction for yUML?&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/9/1/want-to-be-involved-with-yuml/</feedburner:origLink></entry>
  <entry>
    <title>Why Downloading Pirate eBooks Isn't That Useful</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/vcp-CZgRdPo/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-09-01T12:00:58-07:00</id>
    <published>2009-09-01T12:00:58-07:00</published>
    <updated>2009-09-01T12:00:58-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I&amp;#8217;m sad to say that I&amp;#8217;ve been guilty of downloading and reading illegal eBooks from torrent sites. I know for a fact that many software developers do this. At each place I&amp;#8217;ve consulted, I&amp;#8217;ve met developers with literally an entire Borders collection on their hard drives (excuse the pun).&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I&amp;#8217;m sad to say that I&amp;#8217;ve been guilty of downloading and reading illegal eBooks from torrent sites. I know for a fact that many software developers do this. At each place I&amp;#8217;ve consulted, I&amp;#8217;ve met developers with literally an entire Borders collection on their hard drives (excuse the pun).&lt;/p&gt;

&lt;p&gt;Being an author and a generally honest guy, so I&amp;#8217;m not very proud of this. But, it has made me realise one thing:&lt;/p&gt;

&lt;h2 id='its_not_worth_it'&gt;IT&amp;#8217;S NOT WORTH IT!&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s not worth downloading dodgy eBooks from torrent sites because you don&amp;#8217;t get the &lt;em&gt;real value&lt;/em&gt; from the book. I believe the real value of a book lies partly in it&amp;#8217;s physical form.&lt;/p&gt;

&lt;p&gt;An eBook is great for reference or high level scanning, but a paper book is far easier to actually &lt;em&gt;study&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I can leave a paper book around the office or house where I&amp;#8217;m likely to pick it up, making me more likely to read it. The book itself can become it&amp;#8217;s own bookmark in your life - a visual reminder to continue reading.&lt;/p&gt;

&lt;p&gt;e-Ink readers like the Kindle are cool (I have an IREX Illiad), but in many ways a real book still out-performs it. With a real book, the pages fit perfectly and I don&amp;#8217;t have to worry about it&amp;#8217;s batteries running out, or remembering to charge it up.&lt;/p&gt;

&lt;p&gt;I tend to read paper books two or three times, mainly because they occupy shelf space in my study, which is where I look for reading inspiration. I also frequently pull them off the shelf for looking something up. eBooks don&amp;#8217;t lure me in this way, so they get read less often.&lt;/p&gt;

&lt;p&gt;I can annotate books with a pen or sticky notes easily, without having to worry about losing my annotations or synchronising them across devices.&lt;/p&gt;

&lt;p&gt;All in all I&amp;#8217;m pretty happy with the decision that, if I want to read about something, I&amp;#8217;m happy to pay the money and buy the paper book to get the full value from it&amp;#8217;s contents. Time is valuable, and I&amp;#8217;d prefer to pay cash to increase my chances of soaking up the authors wisdom.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/9/1/why-downloading-pirate-ebooks-isnt-that-useful/</feedburner:origLink></entry>
  <entry>
    <title>Automating .NET development (and NHibernate) with IronRuby + Rake</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/f3IdGv74u5s/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-08-17T14:07:47-07:00</id>
    <published>2009-08-17T14:07:47-07:00</published>
    <updated>2009-08-17T14:07:47-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;Just the other day, I thought I&amp;#8217;d try the latest IronRuby to see if I could start using this and Rake in my .NET projects. Low and behold, it&amp;#8217;s working &lt;em&gt;great&lt;/em&gt; :)&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Just the other day, I thought I&amp;#8217;d try the latest IronRuby to see if I could start using this and Rake in my .NET projects. Low and behold, it&amp;#8217;s working &lt;em&gt;great&lt;/em&gt; :)&lt;/p&gt;

&lt;h2 id='rake__a_developers_swiss_army_knife'&gt;Rake - A Developers Swiss Army Knife&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://www.rubyrake.org/'&gt;Rake&lt;/a&gt; is like a swiss-army knife for developers. I use it to make tedious development tasks &lt;em&gt;repeatable&lt;/em&gt;. As we all know, repeatability is king.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s some examples of what I&amp;#8217;ve used Rake for during development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clearing out log files&lt;/li&gt;

&lt;li&gt;Drop/Create development database&lt;/li&gt;

&lt;li&gt;Loading up demo before a customer presentation&lt;/li&gt;

&lt;li&gt;Listing which NHibernate entities are mapped to which tables&lt;/li&gt;

&lt;li&gt;Running a particular batch of unit tests&lt;/li&gt;

&lt;li&gt;Running background tasks for a solution, like rebuilding Lucene indexes&lt;/li&gt;

&lt;li&gt;Generating reports on code statistics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, the useful thing about Rake is that doing any of these things is usually a matter of simply typing &lt;code class='prettyprint'&gt;rake logs:clear&lt;/code&gt; or similar. This saves your hours of pointing and clicking to do boring tasks.&lt;/p&gt;

&lt;p&gt;Rake also has a few tricks up it&amp;#8217;s sleeve: you can automatically chain tasks together. For example:&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;task :test =&amp;gt; [:clean, :drop_create_db, :build, :ndepend_report] do #... &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Your Rake scripts will also be able to make use of the thousands of Ruby gems out there. Well, actually, not all of them work ported to IronRuby .NET yet, but that&amp;#8217;s getting better all the time.&lt;/p&gt;

&lt;h2 id='getting_ironruby__rake_for_net'&gt;Getting IronRuby + Rake For .NET&lt;/h2&gt;

&lt;p&gt;This is a doddle.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download &lt;a href='http://www.ironruby.net/Download'&gt;IronRuby&lt;/a&gt; and unzip to &lt;code class='prettyprint'&gt;c:\IronRuby&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Add &lt;code class='prettyprint'&gt;c:\IronRuby\bin&lt;/code&gt; to your Windows PATH. Try to NOT put it in a folder with spaces in the name. &lt;em&gt;Note: We&amp;#8217;re using IronRuby on both XP and Windows Server 2008 without problems.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Install the &amp;#8216;Rake&amp;#8217; gem by opening a command prompt and typing &lt;code class='prettyprint'&gt;igem install rake&lt;/code&gt;. That&amp;#8217;s &lt;em&gt;igem&lt;/em&gt; not &lt;em&gt;gem&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='creating_a_simple_rake_script'&gt;Creating a Simple Rake Script&lt;/h2&gt;

&lt;p&gt;Using Rake only requires that you have one file called &lt;code class='prettyprint'&gt;Rakefile.rb&lt;/code&gt; in the root directory of any .NET solution. A simple Rakefile could look like this.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;# Rakefile.rb
require &amp;#39;rubygems&amp;#39;	
require &amp;#39;ftools&amp;#39;

task :default=&amp;gt;[:say_hi]

desc &amp;quot;Says Hi&amp;quot;
task :say_hi do 
	puts &amp;quot;Hi there. Rake is working.&amp;quot;
	puts &amp;quot;Type rake --tasks.&amp;quot;
end

desc &amp;quot;Count files of each type in this solution&amp;quot;
task :file_count do
   report = {}
   Dir[&amp;#39;./**/**&amp;#39;].each do |f| 
     report[File.extname(f)].nil? ? report[File.extname(f)] = 1 : report[File.extname(f)] += 1 
   end
   report.each do |type, count|
     puts &amp;quot;#{type}: #{count}&amp;quot;
   end	 
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can list available tasks in you IronRuby rake script by typing &lt;code class='prettyprint'&gt;irake --tasks&lt;/code&gt;, which would output:&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;irake say_hi      Says Hi
irake file_count  Count files of each type in this solution&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And you then can run an individual task by running &lt;code class='prettyprint'&gt;rake file_count&lt;/code&gt;. Which would run the &lt;code class='prettyprint'&gt;:file_count&lt;/code&gt; task and output the statistics.&lt;/p&gt;

&lt;p&gt;This may all seem very simple, but what we now have is a sturdy framework for automating your development tasks and saving you a ton of time. You&amp;#8217;ll think very differently about your projects once you&amp;#8217;ve used Rake for a while.&lt;/p&gt;

&lt;p&gt;As a taster of the kinds of things you might use Rake for, take a look at the &lt;a href='http://handyrailstips.com/tips/11-some-handy-rake-tasks'&gt;standard Rake tasks you get for a Ruby On Rails solution&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='using_with_your_net_solution_code'&gt;Using With Your .NET Solution Code&lt;/h2&gt;

&lt;p&gt;So far all this is very nice, but you could use standard Ruby rake to do all this stuff without the need for IronRuby. What IronRuby gives us is the ability to easily interoperate with .NET assemblies. And of course, that includes your own assemblies.&lt;/p&gt;

&lt;p&gt;What I found very intersting is that I can use Rake to &lt;em&gt;manipulate my NHibernate entities&lt;/em&gt;, and run other infrastructure code. So, if I want a script that can instantly bar all users for logging in to an intranet, that&amp;#8217;s really easy.&lt;/p&gt;

&lt;p&gt;Rather than take you through a massively detailed tutorial, I&amp;#8217;m just going to show you the main things I needed to do to get up and running with Rake in my solution.&lt;/p&gt;

&lt;h3 id='the_rake_file'&gt;The Rake File&lt;/h3&gt;

&lt;p&gt;This is very similar to the Rakefile.rb above. You can see some of the tasks that I&amp;#8217;m using on a small intranet project &lt;a href='http://engineroomapps.com'&gt;Engine Room&lt;/a&gt; are doing.&lt;/p&gt;
&lt;script src='http://gist.github.com/169332.js' /&gt;
&lt;p&gt;You might notice that I&amp;#8217;m using my standard NHibernate Unit Of Work (UoW) class here. That&amp;#8217;s fine, all of my application domain/infrastructure classes written in C# are available here now.&lt;/p&gt;

&lt;p&gt;Also note that I&amp;#8217;m leaning on Ruby naming conventions; IronRuby automatically translates .NET naming standards into Ruby naming standards, such as &lt;code class='prettyprint'&gt;session.create_query&lt;/code&gt; rather than &lt;code class='prettyprint'&gt;Session.CreateQuery&lt;/code&gt;. You can chose either, I just like to keep it Ruby stylee when using Ruby.&lt;/p&gt;

&lt;h3 id='the_all_important_setup_file'&gt;The All Important Setup File&lt;/h3&gt;

&lt;p&gt;You can see at the top of the previous Rake file I&amp;#8217;ve added &lt;code class='prettyprint'&gt;require 'rakesetup'&lt;/code&gt;. All that stuff doesn&amp;#8217;t work my magic, I needed to do some setup. I prefer to keep this out of the way - in a &amp;#8216;Rakesetup.rb&amp;#8217; file I&amp;#8217;ve created (it could be called anything really). Lets look at the setup code.&lt;/p&gt;
&lt;script src='http://gist.github.com/169362.js' /&gt;
&lt;p&gt;Some noteworthy points here are:&lt;/p&gt;

&lt;p&gt;I want to pull in the namespaces that will be available to the &lt;code class='prettyprint'&gt;Rakefile.rb&lt;/code&gt; file. I do this using lines like &lt;code class='prettyprint'&gt;include Portal::Core::Domain::Entities&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I have different settings for production and development (in production we have a shared folder where all images/documents/etc live, whereas during dev we chuck these in App&lt;em&gt;Data).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For some reason IronRuby has problems resolving my DLLs, so I make sure the app runs from the Web bin folder by doing a &lt;code class='prettyprint'&gt;Dir.chdir('Portal.Web\\bin')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The path mappings are quite simple. I only run Rake from the solution root, which keeps resolving paths simple.&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;For a Ruby fan such as myself, being able to use IronRuby + Rake with .NET assemblies is pretty damn cool.&lt;/p&gt;

&lt;p&gt;For those that love the goodness of Rake and who use .NET, this is all a &lt;em&gt;good thing&lt;/em&gt;. Some of you may remember that &lt;a href='http://blog.jagregory.com/'&gt;James Gregory&lt;/a&gt; (Fluent NHibernate Hero!) and I looked at building a C# equivalent of Rake last year. This &lt;a href='http://github.com/tobinharris/golem/tree/master'&gt;project is up on GitHub&lt;/a&gt; and is called Golem. I &lt;em&gt;think&lt;/em&gt; that having IronRuby + Rake replaces the need for such a project, as long as you&amp;#8217;re happy to learn and write Ruby code.&lt;/p&gt;

&lt;p&gt;It will be interesting to hear what the uptake on IronRuby + Rake will be, I know many .NET developers like to use traditional Ruby and Rake with their .NET projects, so there&amp;#8217;s definately an audience out there for it.&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/8/17/automating-net-development-and-nhibernate-with-ironruby-rake/</feedburner:origLink></entry>
  <entry>
    <title>Simplest User Interface Ever (humour)</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/ykLckVSHNFM/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-08-12T14:31:38-07:00</id>
    <published>2009-08-12T14:31:38-07:00</published>
    <updated>2009-08-12T14:31:38-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I got a Boss ME-50 guitar pedal yesterday, and only just noticed this bold statement:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I got a Boss ME-50 guitar pedal yesterday, and only just noticed this bold statement:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090812-md3qgypm5g87m5p8ffk3ewwr5j.png' alt='Boss ME-50 Packaging - Simplest User Interface Ever' /&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s right, this is the &lt;strong&gt;Simplest User Interface ever&lt;/strong&gt;. It really is.&lt;/p&gt;

&lt;p&gt;So, what makes this thing so simple?&lt;/p&gt;

&lt;p&gt;Is might be the 127 text labels that decorate it&amp;#8217;s 30 GUI controls, comprising of 20 rotary controls, 4 foot pedals, 4 push buttons, an LED display and 4 tuning LEDS? Or perhaps the 20 pages of usage instructions in its 35 page A4 manual?&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090812-8rj3thdjte4rqtt6snkxcbap1d.png' alt='Boss ME-50 Unit' /&gt;&lt;/p&gt;

&lt;p&gt;I bet any usability expert could have a field day with this. That said, I reckon that within about 2 hours of reading/experimenting I&amp;#8217;ll be roughly in control of this thing. It may not be a Debono-approved design, but I&amp;#8217;m still looking forward to it ;)&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/8/12/simplest-user-interface-ever-humour/</feedburner:origLink></entry>
  <entry>
    <title>Get a Rails-Stylee Interactive Shell For Your NHibernate Backed Domain Model</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/OLV6Qim02W4/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-08-10T16:01:18-07:00</id>
    <published>2009-08-10T16:01:18-07:00</published>
    <updated>2009-08-10T16:01:18-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;If you&amp;#8217;ve ever used &lt;a href='http://rubyonrails.org'&gt;Ruby on Rails&lt;/a&gt; you&amp;#8217;ll be aware of the goodness that is &lt;code class='prettyprint'&gt;script/console&lt;/code&gt;. The console lets you interact with your domain model from a terminal - no need for dedicated GUI screens or tools.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;If you&amp;#8217;ve ever used &lt;a href='http://rubyonrails.org'&gt;Ruby on Rails&lt;/a&gt; you&amp;#8217;ll be aware of the goodness that is &lt;code class='prettyprint'&gt;script/console&lt;/code&gt;. The console lets you interact with your domain model from a terminal - no need for dedicated GUI screens or tools.&lt;/p&gt;

&lt;p&gt;If you can&amp;#8217;t see the benefits, then think about this: Have you ever used SQL Server Management Studio to inspect some data in your tables, or even to tweak a value in a column? Yes? Well, imagine being able to inspect items in your &lt;em&gt;domain model&lt;/em&gt;, and even create new objects, invoke behaviours (call methods), update properties etc. It&amp;#8217;s &lt;em&gt;very handy&lt;/em&gt;, and useful for quickly checking or updating data.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve always missed having this feature during .NET development. The good news is that&amp;#8217;s it&amp;#8217;s quite easy to do using &lt;a href='http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython'&gt;IronPython&lt;/a&gt; or &lt;a href='http://www.ironruby.net'&gt;IronRuby&lt;/a&gt;. My &lt;a href='http://engineroomapps.com'&gt;EngineRoom&lt;/a&gt; partner, Chris Owen, first got this hooked up using IronPython - so credit to him! Since I&amp;#8217;m more familiar with Ruby I&amp;#8217;ll use that in this post.&lt;/p&gt;

&lt;h3 id='how_to_do_it'&gt;How To Do It&lt;/h3&gt;

&lt;h4 id='1_download_iron_ruby'&gt;1. Download Iron Ruby&lt;/h4&gt;

&lt;p&gt;It&amp;#8217;s only 4MB, so this will take you about 1 minute. You can get IronRuby from the &lt;a href='http://www.ironruby.net/Download'&gt;IronRuby site&lt;/a&gt;. I&amp;#8217;m got the latest - 0.9.0.0.&lt;/p&gt;

&lt;h4 id='2_extract_zip_to_somwhere_nice'&gt;2. Extract ZIP to Somwhere Nice&lt;/h4&gt;

&lt;p&gt;I simply extracted this to a place where I keep my 3rd party libs.&lt;/p&gt;

&lt;h4 id='3_get_your_console_on'&gt;3. Get Your Console On!&lt;/h4&gt;

&lt;p&gt;Launch the Visual Studio Command Prompt, and navigate to your solutions bin folder. I actually navigated to my ASP.NET MVC apps bin folder, but any folder with your domain logic DLLs will do.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt; cd c:\Code\Portal\Web\bin&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now launch IronRuby. You&amp;#8217;ll get an interactive console.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt; c:\CodeLibs\ironruby\bin\ir.exe

IronRuby 0.9.0.0 on .NET 2.0.50727.3053
Copyright (c) Microsoft Corporation. All rights reserved.
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we need to do something interesting. Firstly, we need to get some DLLs into scope. Lets load Portal.Core which contains my solutions business objects and data access code.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; require &amp;#39;Portal.Core&amp;#39;
=&amp;gt; true&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that the Ruby console always spits out the result of the action. In this case, it evaulated to &lt;code class='prettyprint'&gt;true&lt;/code&gt; (success!).&lt;/p&gt;

&lt;p&gt;Now I want to start &lt;code class='prettyprint'&gt;using&lt;/code&gt; a few namespaces (as you would a c# file)&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; import Portal::Core::Infrastructure::DataAccess
=&amp;gt; Object
&amp;gt;&amp;gt;&amp;gt; import Portal::Core::Domain::Entities
=&amp;gt; Object&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id='4_configure_nhibernate'&gt;4. Configure NHibernate&lt;/h4&gt;

&lt;p&gt;Now for the fun bit! I&amp;#8217;m going to first configure my NHibernate Unit of Work class so I can get a NHibernate session (the code for my class is &lt;a href='http://gist.github.com/108433'&gt;up on GitHub&lt;/a&gt;, I use it on many projects). Don&amp;#8217;t worry about this, you could also create a normal NHibernate configuration and configure the session using hibernate.cfg.xml.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; UoW.Configure(&amp;#39;data source=.\\SQLEXPRESS2008;database=TestDevelopment;trusted_connection=True&amp;#39;, UoW::Environment.Other)
=&amp;gt; nil
&amp;gt;&amp;gt;&amp;gt; UoW.Start
=&amp;gt; nil&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I now have a Unit of Work which is started and which gives me access to an NHibernate Session. Great!&lt;/p&gt;

&lt;p&gt;Now to do a query.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; query = UoW.Session.CreateQuery(&amp;quot;from Person p where p.Forename = &amp;#39;Tobin&amp;#39;&amp;quot;)
=&amp;gt; from Person p where p.Forename = &amp;#39;Tobin&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s created the query, now I need to execute it. In c# I would write &lt;code class='prettyprint'&gt;query.List&amp;lt;Person&amp;gt;()&lt;/code&gt;. IronRuby has a weird syntax for generic overloads, but they&amp;#8217;re woring on improving it I hear.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; people = query.method(:list).of(Person).call 
=&amp;gt; [Portal.Core.Domain.Entities.Person]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, I now have a list of People. I could now grab one of them and play around with it.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; people.Count
=&amp;gt; 1
&amp;gt;&amp;gt;&amp;gt; tobin = people[0]
=&amp;gt; Portal.Core.Domain.Entities.Person&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lets see what methods the &lt;code class='prettyprint'&gt;tobin&lt;/code&gt; object has.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; tobin.methods
=&amp;gt; [&amp;#39;default_group&amp;#39;, &amp;#39;email&amp;#39;, &amp;#39;email=&amp;#39; ... (truncated)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I can now delete myself. This will call some domain logic behind the scenes.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; tobin.IsActive
=&amp;gt; true
&amp;gt;&amp;gt;&amp;gt; tobin.SoftDelete
=&amp;gt; nil
&amp;gt;&amp;gt;&amp;gt; tobin.IsActive
=&amp;gt; false&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that I could also call &lt;code class='prettyprint'&gt;tobin.soft_delete&lt;/code&gt;, IronRuby is translating .NET naming conventions into Ruby naming conventions, nice!&lt;/p&gt;

&lt;p&gt;Finally, I now want to commit this unit of work, which will get NHibernate to do a Flush behind the scenes.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; UoW.Commit&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you have your NHibernate configured to spit SQL to the console, you&amp;#8217;ll see a ton of SQL being executed there.&lt;/p&gt;

&lt;h4 id='5_finally_a_bit_of_ruby_fun'&gt;5. Finally, a Bit of Ruby Fun&lt;/h4&gt;

&lt;p&gt;This one-liner loads all People and prints their names.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;&amp;gt;&amp;gt;&amp;gt; UoW.Session.CreateQuery(&amp;quot;from Person&amp;quot;).method(:list).of(Person).call.each do |person| puts &amp;quot;#{person.FullName}: #{person.Email}&amp;quot; end
=&amp;gt; Tobin Harris: tobin@engineroomapps.com
   Chris Owen: chris@engineroomapps.com&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/8/10/get-a-rails-stylee-interactive-shell-for-your-nhibernate-backed-domain-model/</feedburner:origLink></entry>
  <entry>
    <title>In Memory SQLite Testing with NHibernate</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/bWccp7_YaCY/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-08-01T08:37:52-07:00</id>
    <published>2009-08-01T08:37:52-07:00</published>
    <updated>2009-08-01T08:37:52-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;In a current solution we&amp;#8217;re testing our NHibernate app against an SQLite (in-memory) databases. The database is created from scratch before each &lt;em&gt;test&lt;/em&gt; runs. This guarantees that each individual test gets it&amp;#8217;s own fresh copy of the DB.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;In a current solution we&amp;#8217;re testing our NHibernate app against an SQLite (in-memory) databases. The database is created from scratch before each &lt;em&gt;test&lt;/em&gt; runs. This guarantees that each individual test gets it&amp;#8217;s own fresh copy of the DB.&lt;/p&gt;

&lt;p&gt;In a perfect world my tests would give me a green bar and they&amp;#8217;d do it in about 1 second flat for the whole suite :) I can&amp;#8217;t avoid failing tests every now and again, but I REALLY want to get my tests running &lt;em&gt;as fast as humanly possible&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Testing against the database is never going to be as fast as using mocks, but I just don&amp;#8217;t dig mocks right now. So, what to do?&lt;/p&gt;

&lt;h2 id='tip_1_only_create_one_session_factory_for_a_test_run'&gt;Tip 1: Only Create One Session Factory for a Test Run&lt;/h2&gt;

&lt;p&gt;I noticed that our solution was creating a new NHibernate session factory at the beginning of each test fixture. The session factory is a heavy object that takes time to create.&lt;/p&gt;

&lt;p&gt;Most test runners run tests in a single app-domain, so you can make your SessionFactory static and only initialise it once for the entire test run.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an example of our common persistent test fixture base class.&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;public abstract class TestFixtureBase
{
    [TestFixtureSetUp]
    public void Before_Testing_Begins()
    {
        //expensive operation so done once per test run
        if(UoW.SessionFactory == null)            
        	UoW.Configure(&amp;quot;&amp;quot;, UoW.Environment.Test, Configure);            
	}
} &lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='tip_2_inmemory_dropcreate_is_fastest'&gt;Tip 2: In-Memory Drop/Create is Fastest&lt;/h2&gt;

&lt;p&gt;I tried a number of different approaches to NHibernate based testing with SQLite. Here&amp;#8217;s what I found&amp;#8230;&lt;/p&gt;

&lt;h3 id='dropcreate_inmemory_before_each_test_best_approach_found_so_far'&gt;Drop/Create In-Memory Before Each Test (best approach found so far)&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s the test run results for our solution that uses a Drop/Create for each test. This is against an In-Memory SQLite database.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090801-prsmhemj7jq2xmcir5cjgyk11b.png' alt='Drop/Create Strategy' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18.71 seconds&lt;/strong&gt; for 79 tests using drop/create. Not brilliant. But the tests running in-memory SQLite are about 30% faster than the file-based alternative.&lt;/p&gt;

&lt;p&gt;I also tried using the SQLite connection-pool (&amp;#8220;Data Source=:memory:;Pooling=True;Max Pool Size=1;&amp;#8221;) but this seemed to offer no improvement (in fact I think it was worse!).&lt;/p&gt;

&lt;h3 id='deleting_data_before_each_test'&gt;Deleting Data Before Each Test&lt;/h3&gt;

&lt;p&gt;I thought I&amp;#8217;d trying something else to see if I could speed things up. Instead of drop/create, another strategy is to delete all the data in your database. Thanks to this &lt;a href='http://tobinharris.com/past/2009/7/21/nhibernate-trick/'&gt;not-so-useful NHibernate trick&lt;/a&gt;, &lt;br /&gt;my good friend Olly at &lt;a href='http://www.zolv.com'&gt;Zolv&lt;/a&gt; discovered that you can do this: &lt;code class='prettyprint'&gt;_session.Delete("from Object o")&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lets&amp;#8217;s see how that goes&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090801-nrbdt7twu14wnteh2tutjgy8gm.png' alt='Delete Strategy' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;32.69 seconds&lt;/strong&gt; for 79 tests using delete all strategy. Even worse.&lt;/p&gt;

&lt;p&gt;This also needs to use a file-based SQLite database since it is relying on an existing db to be in place at the beginning of each test (rather than drop/create which actually creates the db in memory before each test). The file-based SQLite database is much slower than the in memory one.&lt;/p&gt;

&lt;p&gt;There is a chance that NHibernate 2.1 might be faster at this (I&amp;#8217;m testing this with NHibernate 2.0 which does a SQL delete for each individual row).&lt;/p&gt;

&lt;h3 id='copying_blank_database_before_each_test'&gt;Copying Blank Database Before Each Test&lt;/h3&gt;

&lt;p&gt;Another thing I thoght I could try was to create a blank SQLite database file at the beginning of each test run, and then make a copy of it before each test, so each test starts with a blank database. My thinking was that a file-system file-copy would be that quickest way of getting a blank database.&lt;/p&gt;

&lt;p&gt;This performed better than the previous &amp;#8220;deleting data&amp;#8221; approach, but still not as fast as the in-memory database.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090801-tk1i8a22x3qyiqcnukdcsqsipt.png' alt='File Copy Strategy' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;26.13 seconds&lt;/strong&gt; for 79 tests using file-copy approach. Close, but no cigar.&lt;/p&gt;

&lt;h2 id='where_to_next'&gt;Where to Next?&lt;/h2&gt;

&lt;p&gt;Hmm, I&amp;#8217;m not really happy with my 18 second test runs, they&amp;#8217;re too slow to make me want to run them regularly. Would be interesting to hear how this compares with other peoples test times.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/8/1/in-memory-sqlite-testing-with-nhibernate/</feedburner:origLink></entry>
  <entry>
    <title>Blowing Bubbles With Twitter (And Bursting Them!)</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/b5Nz7OZfTJY/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-07-29T16:36:11-07:00</id>
    <published>2009-07-29T16:36:11-07:00</published>
    <updated>2009-07-29T16:36:11-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;a href='http://yuml.me'&gt;yUML&lt;/a&gt; was a little web app that I created a few months ago. I &lt;em&gt;tweeted&lt;/em&gt; about it on &lt;a href='http://twitter.com'&gt;Twitter&lt;/a&gt;, and the results were both amazing and confusing.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;&lt;a href='http://yuml.me'&gt;yUML&lt;/a&gt; was a little web app that I created a few months ago. I &lt;em&gt;tweeted&lt;/em&gt; about it on &lt;a href='http://twitter.com'&gt;Twitter&lt;/a&gt;, and the results were both amazing and confusing.&lt;/p&gt;

&lt;p&gt;I thought it would be fun to to share some of the statistics - good and bad.&lt;/p&gt;

&lt;h3 id='days_14_warming_up'&gt;Days 1-4: Warming Up&lt;/h3&gt;

&lt;p&gt;After putting yUML on it&amp;#8217;s server, I mentioned it to a few friends. I hadn&amp;#8217;t really mentioned it in any public forums.&lt;/p&gt;

&lt;p&gt;I first recall telling &lt;a href='http://darioquintana.com.ar/'&gt;Dario Quintana&lt;/a&gt; about it first, and I forgot to tell him that it wasn&amp;#8217;t ready for public consumption yet.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how yUML looked on the Google analytics in those first few days.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090729-1k65gjafpknukuj87xh59kaach.png' alt='yUML days 1-4' /&gt;&lt;/p&gt;

&lt;p&gt;I think you&amp;#8217;ll agree, pretty quiet&amp;#8230;&lt;/p&gt;

&lt;h3 id='days_58_eek'&gt;Days 5-8: Eek!&lt;/h3&gt;

&lt;p&gt;Once the cat was out of the bag, I decided to announce yUML on &lt;a href='http://twitter.com'&gt;twitter&lt;/a&gt;. I had less than 20 followers at the time, and didn&amp;#8217;t really use or understand twitter at all.&lt;/p&gt;

&lt;p&gt;After that initial announcement, it was awesome watching how fast the word spread. On my monitor I could see tons of tweets about twitter happening in real-time, it was great fun. (Note, I used a &lt;a href='http://tweetdeck.com/beta/'&gt;TweetDeck&lt;/a&gt; search column for monitoring twitter)&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090729-mcjxmb2bqk1a33d9dynitmcjbp.png' alt='yUML days 4-8' /&gt;&lt;/p&gt;

&lt;p&gt;To my pleasant surprise, that single tweet went on to generate over 20,000 visits to the site in the first three days. As someone who&amp;#8217;s never done this kind of thing, I was bowled over.&lt;/p&gt;

&lt;p&gt;20,000+. That&amp;#8217;s a big return on a single 140 character &lt;em&gt;tweet&lt;/em&gt; for an idea that&amp;#8217;s incredibly niche.&lt;/p&gt;

&lt;h3 id='days_9_quiet_'&gt;Days 9+: Quiet :(&lt;/h3&gt;

&lt;p&gt;After that brief period, things got &lt;em&gt;very&lt;/em&gt; quiet. It was like some crazy &lt;em&gt;Mexican wave&lt;/em&gt; where the news got around fast and everyone stood up and waved, then&amp;#8230; total inactivity.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090729-nw1j87d52iguye2q41yhturuwa.png' alt='yUML goes quiet' /&gt;&lt;/p&gt;

&lt;p&gt;Wow. Where did everyone go!? I&amp;#8217;d love to know if this is a common pattern, or if it&amp;#8217;s down to the suckyness of my project. I&amp;#8217;m sure some savvy internet marketeer out there could explain all this&amp;#8230;&lt;/p&gt;

&lt;p&gt;Anyway, it&amp;#8217;s not all bad. After a fairly long quiet spell, things are looking up.&lt;/p&gt;

&lt;h3 id='last_week_warming_up'&gt;Last Week: Warming Up&amp;#8230;&lt;/h3&gt;

&lt;p&gt;Interestingly, yUML appears to be back on the up over the last week. I can see the &lt;a href='http://search.twitter.com/search?q=yuml'&gt;tweets&lt;/a&gt; increasing daily again, and the Google stats reflect this trend too.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090729-tbwqfna7ignush4187aguqc59j.png' alt='yUML pick up pace' /&gt;&lt;/p&gt;

&lt;p&gt;Over the last few days, between 700 and 1000 UML diagrams were being generated daily. This is a 200% increase on previous weeks.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not sure why things are back on the up again. Maybe it&amp;#8217;s some of the tweaks I&amp;#8217;ve made, or maybe someone popular stumbled across it and mentioned it. Who knows.&lt;/p&gt;

&lt;p&gt;Anyway, hopefully someone will find all this interesting. I do! Would be great to hear about other peoples successes and failures with twitter as a product launchpad.&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/7/29/blowing-bubbles-with-twitter-and-bursting-them/</feedburner:origLink></entry>
  <entry>
    <title>NHibernate Trick</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/F8TAtP5lgCc/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-07-21T05:39:54-07:00</id>
    <published>2009-07-21T05:39:54-07:00</published>
    <updated>2009-07-21T05:39:54-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I recently remembered this old NHibernate query trick:&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;var found = UoW.Session.CreateQuery(&amp;quot;from Object o&amp;quot;).List();&lt;/code&gt;&lt;/pre&gt;</summary>
    <content type="html">&lt;p&gt;I recently remembered this old NHibernate query trick:&lt;/p&gt;

&lt;pre&gt;&lt;code class='prettyprint'&gt;var found = UoW.Session.CreateQuery(&amp;quot;from Object o&amp;quot;).List();
foreach (var item in found) Console.WriteLine(item.ToString());&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you might guess, this selects every instance of every mapped entity in your entire database. Useful? Probably not. Fun? Yarp!&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/7/21/nhibernate-trick/</feedburner:origLink></entry>
  <entry>
    <title>Alfa Romeo Spider For Sale</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/WHS7TfFeZwg/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-07-11T07:34:48-07:00</id>
    <published>2009-07-11T07:34:48-07:00</published>
    <updated>2009-07-11T07:34:48-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I&amp;#8217;m &lt;a href='http://tobinharris.com/alfa-romeo-spider'&gt;selling my baby&lt;/a&gt; :( Sob sob sob&amp;#8230;&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I&amp;#8217;m &lt;a href='http://tobinharris.com/alfa-romeo-spider'&gt;selling my baby&lt;/a&gt; :( Sob sob sob&amp;#8230;&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/7/11/alfa-romeo-spider-for-sale/</feedburner:origLink></entry>
  <entry>
    <title>HTTP Status Code 408 - I'm a Tea Pot :)</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/acl3maDerHE/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-07-02T04:41:25-07:00</id>
    <published>2009-07-02T04:41:25-07:00</published>
    <updated>2009-07-02T04:41:25-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I was trawling through &lt;a href='http://en.wikipedia.org/wiki/List_of_HTTP_status_codes'&gt;HTTP status codes&lt;/a&gt; today on WikiPedia and found the &lt;strong&gt;418 - I&amp;#8217;m a Tea Pot&lt;/strong&gt; status code. How amusing :)&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I was trawling through &lt;a href='http://en.wikipedia.org/wiki/List_of_HTTP_status_codes'&gt;HTTP status codes&lt;/a&gt; today on WikiPedia and found the &lt;strong&gt;418 - I&amp;#8217;m a Tea Pot&lt;/strong&gt; status code. How amusing :)&lt;/p&gt;

&lt;p&gt;Apparently it&amp;#8217;s part of the &lt;a href='http://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol'&gt;HyperText Coffee Pot Protocol&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Although this protocol is an April Fools joke, I actually think it could be useful as the standard response to send to Internet Explorer 6 ;)&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/7/2/http-status-code-408-im-a-tea-pot-/</feedburner:origLink></entry>
  <entry>
    <title>OSX MonoDevelop MVC?</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/ZGv5ZCXooSo/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-06-25T15:40:48-07:00</id>
    <published>2009-06-25T15:40:48-07:00</published>
    <updated>2009-06-25T15:40:48-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;a href='http://www.lostechies.com/blogs/scottcreynolds/archive/2009/06/24/how-i-set-up-my-mac.aspx'&gt;Scott C Reynolds blogged&lt;/a&gt; about how he&amp;#8217;s been playing with MonoDevelop on OSX. I thought I&amp;#8217;d download it, and was pleased to see this&amp;#8230;&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;&lt;a href='http://www.lostechies.com/blogs/scottcreynolds/archive/2009/06/24/how-i-set-up-my-mac.aspx'&gt;Scott C Reynolds blogged&lt;/a&gt; about how he&amp;#8217;s been playing with MonoDevelop on OSX. I thought I&amp;#8217;d download it, and was pleased to see this&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090625-ckrpdem29kh4egue5seid26ukm.png' alt='MonoDevelop MVC?' /&gt; &lt;a href='http://img.skitch.com/20090625-qae1mx8b3jth6mcnxantfjsxqj.png'&gt;Bigger Piccy&amp;#8230;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve not actually clicked beyond this point yet, but it&amp;#8217;s exciting to see that MVC is &lt;em&gt;actually hinted at&lt;/em&gt; in MonoDevelop. Can&amp;#8217;t wait to see what the support is like&amp;#8230;&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/6/25/osx-monodevelop-mvc/</feedburner:origLink></entry>
  <entry>
    <title>New App for Writing Documents Online</title>
    <link href="http://feedproxy.google.com/~r/blog_of_tobin/~3/sF4p4kah8hI/" rel="alternate" />
    <id>tag:www.tobinharris.com,2009-06-11T18:03:05-07:00</id>
    <published>2009-06-11T18:03:05-07:00</published>
    <updated>2009-06-11T18:03:05-07:00</updated>
    <author>
      <name>Tobin Harris</name>
    </author>
    <summary type="html">&lt;p&gt;I&amp;#8217;m a big fan of &lt;a href='http://www.basecamphq.com/'&gt;BaseCamp&lt;/a&gt; &amp;#8211; an online project management tool. BaseCamp also gives you &lt;a href='http://www.writeboard.com/'&gt;WriteBoards&lt;/a&gt;, which are roughly analogous to shared, online MS Word Documents.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I&amp;#8217;m a big fan of &lt;a href='http://www.basecamphq.com/'&gt;BaseCamp&lt;/a&gt; &amp;#8211; an online project management tool. BaseCamp also gives you &lt;a href='http://www.writeboard.com/'&gt;WriteBoards&lt;/a&gt;, which are roughly analogous to shared, online MS Word Documents.&lt;/p&gt;

&lt;p&gt;WriteBoards are cool, but they fall short in a few areas. Firstly, they&amp;#8217;re not pretty enough; I don&amp;#8217;t feel that I&amp;#8217;d really want to show a customer a WriteBoard document. Also, they only support TextTile, and I quite like Markdown and MultiMarkdown. Finally, WriteBoards don&amp;#8217;t have a good public API, so getting at the content and re-purposing it is a PITA.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been having fun creating various online tools this year, such as &lt;a href='http://yuml.me'&gt;yUML&lt;/a&gt;. yUML went live after only four days of development work, but seemed to hit a positive note with many users.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20090612-meuxnjbiyg8grwhtnfy8f9ai59.png' alt='myDocs, by Tobin Harris' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='http://img.skitch.com/20090612-ebe9aihfatbg674h375xigpiey.png'&gt;Enlarge Image&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The image above shows another online tool that I&amp;#8217;ve thrown together: working name is myDocs. This was another four-day project, who&amp;#8217;s goals were to help me publish &lt;em&gt;Word-Lookalike&lt;/em&gt; documents online.&lt;/p&gt;

&lt;p&gt;myDocs has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author onlnie using &lt;a href='http://hobix.com/textile/'&gt;TextTile&lt;/a&gt; or&lt;a href='http://daringfireball.net/projects/markdown/'&gt;Markdown&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Pretty to look at&lt;/li&gt;

&lt;li&gt;Pretty to print out&lt;/li&gt;

&lt;li&gt;Keeps version history&lt;/li&gt;

&lt;li&gt;Compare versions showing added and removed content&lt;/li&gt;

&lt;li&gt;Add sticky note comments to documents&lt;/li&gt;

&lt;li&gt;Review documents and comments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My company, &lt;a href='http://engineroomapps.com'&gt;Engine Room&lt;/a&gt; are benefitting from it internally, but we have yet to think of how it might be used by anyone else.&lt;/p&gt;

&lt;p&gt;This tool doesn&amp;#8217;t have a public home page yet, but there is a &lt;a href='http://docs.socena.com/document/test/readme'&gt;demo page&lt;/a&gt; available.&lt;/p&gt;

&lt;p&gt;If you like what you see, post up your thoughts and I&amp;#8217;ll think about how to release it to a wider audience!&lt;/p&gt;</content>
  <feedburner:origLink>http://www.tobinharris.com/past/2009/6/11/new-app-for-writing-documents-online/</feedburner:origLink></entry>
</feed>
