<?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-4677537836173626009</id><updated>2011-12-04T03:54:08.973-05:00</updated><category term='managed windows forms'/><category term='mono'/><category term='screenshots'/><title type='text'>Jackson's Activity Log</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2864501041695374875</id><published>2010-12-14T07:56:00.002-05:00</published><updated>2010-12-14T07:56:55.660-05:00</updated><title type='text'>New Blog Address</title><content type='html'>I've been using tumblr for a little while.  My new blog can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jacksonh.tumblr.com"&gt;Jackson Harper's blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2864501041695374875?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2864501041695374875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2864501041695374875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2864501041695374875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2864501041695374875'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/12/new-blog-address.html' title='New Blog Address'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6433936098817747812</id><published>2010-07-25T17:30:00.008-05:00</published><updated>2010-07-26T09:01:12.472-05:00</updated><title type='text'>Internet Everywhere!</title><content type='html'>I recently switched from AT&amp;T to T-Mobile.  On top of having better coverage, more features and being cheaper than AT&amp;T, they are also pretty fuzzy about the topic of tethering.  While tethering isn't officially supported its also not banned. Not only that but they even gave me some support in getting my tethering setup working.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tethering my laptop is kinda neat, but I've got some other devices I wanted to connect, and I can only do that with WIFI.  I know Android has a cool feature where you can turn your phone into a Wireless Access Point and I wanted to do the same thing with my blackberry.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After some research on &lt;a href="http://crackberry.com/"&gt;crackberry.com&lt;/a&gt; I found a pretty cool product that would do this for me.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://amzn.to/bN4NXe" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_4wtItLnZ3X0/TE2UjspVvbI/AAAAAAAAAac/79LOdILKl3s/s320/phs300.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The &lt;a href="http://amzn.to/bN4NXe"&gt;Cradlepoint PHS 300&lt;/a&gt; is a personal WIFI hotspot. It connects to my phone via USB, and lets me create a wifi network. From there I can connect my laptop, tablet, iphone, ect. &amp;nbsp;It supports WEP security and it also has its own built in DNS redirect + device password system so you can still get some security without WEP.&amp;nbsp; It can also remember mac addresses, so I don't need to retype a password every time you connect.&amp;nbsp; This is especially nice with the tablet where typing is a little cumbersome. &lt;br /&gt;&lt;br /&gt;Its worked pretty well for me so far and done exactly what its supposed to do. &amp;nbsp;So if you don't have an Android phone and still want to get some red hot&amp;nbsp;personal&amp;nbsp;wifi hotspot action, I'd definitely&amp;nbsp;recommend&amp;nbsp;this guy.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6433936098817747812?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6433936098817747812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6433936098817747812' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6433936098817747812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6433936098817747812'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/07/internet-everywhere.html' title='Internet Everywhere!'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4wtItLnZ3X0/TE2UjspVvbI/AAAAAAAAAac/79LOdILKl3s/s72-c/phs300.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2118277078671452868</id><published>2010-06-18T03:38:00.005-05:00</published><updated>2010-06-18T04:24:33.793-05:00</updated><title type='text'>MCloud - Managed library for multiple cloud providers</title><content type='html'>One of the things I worked on over hackweek was my MCloud project.  I started MCloud because I saw python had the libcloud library (&lt;a href="http://incubator.apache.org/libcloud/"&gt;http://incubator.apache.org/libcloud/&lt;/a&gt;) and I was jealous.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MCloud is a library that allows you to interact with and deploy nodes on different cloud providers.  Right now EC2 and Linode are the only providers but I should be adding more soon.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So with MCloud you can do something like this:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NodeDriver driver = new EC2Driver (id, key);&lt;/div&gt;&lt;div&gt;driver.ListNodes ().ForEach (n =&gt; n.Reboot ());&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;you can also create new nodes, delete nodes, reboot your nodes and run deployments on your nodes.  I think the deployments thing is the coolest feature because it allows you to really easily setup your app across multiple nodes like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;var deployment = new MultiStepDeployment () {&lt;/div&gt;&lt;div&gt;  new ScriptDeployment ("install_mono.sh"),&lt;/div&gt;&lt;div&gt;  new PutDirectoryDeployment ("/src/mysite/", "/srv/www/mysite"),&lt;/div&gt;&lt;div&gt;  new PutFileDeployment ("mysite.conf", "/etc/apache2/conf.d/"),&lt;/div&gt;&lt;div&gt;  new SSHDeployment ("service apache2 restart"),&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;NodeAuth auth = new NodeAuth (NodeAuthType.Password, "my password");&lt;/div&gt;&lt;div&gt;driver.ListNodes ().ForEach (n =&gt; n.Deploy (deployment, auth);&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the above example we copy over and run a local script that installs mono on the node, we copy the website directory over, copy the apache config and finally restart apache.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another cool thing you can do with MCloud is query for price plans, so if you want you could find the cheapest plan across all the node providers:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;NodeDriver driver = new LinodeDriver (linode_api_key);&lt;/div&gt;&lt;div&gt;List&lt;nodesize&gt; sizes = driver.ListSizes ();&lt;/nodesize&gt;&lt;/div&gt;&lt;div&gt;driver = new EC2Driver (ec2_id, ec2_key);&lt;/div&gt;&lt;div&gt;sizes.AddRange (driver.ListSizes);&lt;/div&gt;&lt;div&gt;NodeSize cheapest = sizes.OrderBy (s =&gt; s.Price).FirstOrDefault ();&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This feature isn't fully implemented in the EC2 driver yet, but you can see how it would be useful across multiple cloud providers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download the source to MCloud here: &lt;/div&gt;&lt;div&gt;http://github.com/jacksonh/MCloud/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or if you just want a binary, I've got a recent version available on the Download page:&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/jacksonh/MCloud/downloads"&gt;http://github.com/jacksonh/MCloud/downloads&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before you do anything you'll probably want to read the Getting Started Guide found here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/jacksonh/MCloud/blob/master/doc/getting-started.mkdn"&gt;http://github.com/jacksonh/MCloud/blob/master/doc/getting-started.mkdn&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And checkout the sample app for creating and deploying a node here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/jacksonh/MCloud/blob/master/samples/CreateLinode.cs"&gt;http://github.com/jacksonh/MCloud/blob/master/samples/CreateLinode.cs&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, questions, feedback, bug reports and trolling are welcome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2118277078671452868?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2118277078671452868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2118277078671452868' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2118277078671452868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2118277078671452868'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/06/mcloud-managed-library-for-multiple.html' title='MCloud - Managed library for multiple cloud providers'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-9029475453129119937</id><published>2010-01-19T23:58:00.003-05:00</published><updated>2010-01-20T00:23:20.480-05:00</updated><title type='text'>Linploy Getting Started Guide + Beta Invites</title><content type='html'>Here is a rough draft of the &lt;a href="http://docs.google.com/View?id=dc4h2b4d_138dkqgtkht"&gt;Linploy Getting Started Guide&lt;/a&gt;.  Having high quality documentation is pretty important to me.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All the major features I wanted to complete before sending out beta invites are now finished.  So invites will start trickling out soon.  No guarantees but everyone that has signed up for the beta should receive an invite within the next two weeks, hopefully earlier.  That's assuming nothing major goes wrong, or I don't get any feedback that leads me to a major architectural change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-9029475453129119937?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/9029475453129119937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=9029475453129119937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9029475453129119937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9029475453129119937'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/01/linploy-getting-started-guide-beta.html' title='Linploy Getting Started Guide + Beta Invites'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4820740667021403251</id><published>2010-01-18T11:37:00.015-05:00</published><updated>2010-01-18T12:25:38.407-05:00</updated><title type='text'>Setting up a Mono Powered ASP.NET Web Server with Linploy</title><content type='html'>(If you haven't heard of &lt;a href="http://www.linploy.com/"&gt;Linploy.com&lt;/a&gt; yet it is a free service I have set up for deploying servers. You can read more about it &lt;a href="http://jacksonito.blogspot.com/2010/01/linploy-really-easy-linux-deployment.html"&gt;here&lt;/a&gt;.)&lt;div&gt;&lt;br /&gt;Thanks to some of the initial Linploy.com feedback I added a new template feature.  Templates are just preconfigured images for common setups.  The first template I created is a Mono Powered ASP.NET Web Server.&lt;br /&gt;&lt;br /&gt;The Mono Powered ASP.NET Web Server is a preconfigured web server running Apache2 and Mono along with an FTP server so you can upload your ASP.NET files.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4wtItLnZ3X0/S1SYk8ZOPeI/AAAAAAAAAX8/Rs0FI9iYhdg/s1600-h/aspx-step-one.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://4.bp.blogspot.com/_4wtItLnZ3X0/S1SYk8ZOPeI/AAAAAAAAAX8/Rs0FI9iYhdg/s320/aspx-step-one.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5428131211342921186" /&gt;&lt;/a&gt;&lt;div&gt;Setting up a Mono ASP.NET Server starts out just like a normal Linploy deployment. Enter your &lt;a href="http://www.linode.com/?r=9570d35d9b1f48a5895e9eb1945cab02ba8dfbb9"&gt;Linode.com&lt;/a&gt; username/password and optionally your domain name.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the screenshot you can see there is now a drop down for selecting a disk image.  Right now there are two options: 'Mono ASP.NET Server' and 'Custom Image'.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4wtItLnZ3X0/S1SYxq_FsxI/AAAAAAAAAYE/xrXpAT8RiM4/s1600-h/aspx-step-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://2.bp.blogspot.com/_4wtItLnZ3X0/S1SYxq_FsxI/AAAAAAAAAYE/xrXpAT8RiM4/s320/aspx-step-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5428131430008206098" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;When you select 'Mono ASP.NET Server' you will get an entry box for the server's new FTP password. This password will be used with the username 'monoweb' to upload your ASP.NET files to the server.  Enter in a nice secure password and click create my node.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4wtItLnZ3X0/S1SY-ai1eEI/AAAAAAAAAYM/5F-H4lzS38s/s1600-h/step-three.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://1.bp.blogspot.com/_4wtItLnZ3X0/S1SY-ai1eEI/AAAAAAAAAYM/5F-H4lzS38s/s320/step-three.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5428131648933034050" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;About 10 minutes later you should have a ASP.NET server up and running.  Navigate to your domain (or ip address) and you should see a simple aspx page that confirms your server is up and running.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From here just log into the server with your favorite FTP tool, upload your ASP.NET website, refresh your browser and you should see your new page.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4820740667021403251?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4820740667021403251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4820740667021403251' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4820740667021403251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4820740667021403251'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/01/setting-up-mono-powered-aspnet-web.html' title='Setting up a Mono Powered ASP.NET Web Server with Linploy'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4wtItLnZ3X0/S1SYk8ZOPeI/AAAAAAAAAX8/Rs0FI9iYhdg/s72-c/aspx-step-one.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3779739262831136494</id><published>2010-01-14T18:54:00.012-05:00</published><updated>2010-01-15T12:47:42.418-05:00</updated><title type='text'>Linploy - Really easy Linux Deployment</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_4wtItLnZ3X0/S0_chEz4MXI/AAAAAAAAAXU/KUWH3TIn2yk/s1600-h/linploy-status.png"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_4wtItLnZ3X0/S0_cr6exDZI/AAAAAAAAAXc/hBVuiFgjp68/s1600-h/linploy-status.png"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4wtItLnZ3X0/S0-_Ff_Mf0I/AAAAAAAAAXM/tsMcFbRuSnw/s1600-h/linploy-create.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 219px;" src="http://3.bp.blogspot.com/_4wtItLnZ3X0/S0-_Ff_Mf0I/AAAAAAAAAXM/tsMcFbRuSnw/s320/linploy-create.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5426766177211547458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;During my Christmas break I wrote a web application that glues together two of my favorite services.   &lt;a href="http://www.susestudio.com/"&gt;SUSE Studio&lt;/a&gt; and &lt;a href="http://www.linode.com/?r=9570d35d9b1f48a5895e9eb1945cab02ba8dfbb9"&gt;Linode.com&lt;/a&gt;.  My new service is called &lt;a href="http://www.linploy.com/"&gt;Linploy.com&lt;/a&gt; and its goal is to make it really really easy to take a web application and get it up and running on the web.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Specifically I wanted to deploy &lt;a href="http://code.google.com/p/codecampserver/"&gt;Code Camp Server&lt;/a&gt; on Mono. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few months ago I co-hosted a talk with &lt;a href="http://www.lostechies.com/blogs/hex/"&gt;Eric Hexter&lt;/a&gt; at &lt;a href="http://monospace.us/"&gt;MonoSpace&lt;/a&gt; and we showed how incredibly easy it was to setup a Linux web server from scratch. Unfortunately it didn't come across as easy as I had originally intended.  So that is why I created Linploy and here is how easy it is now:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Bt3jcL8tAo0&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Bt3jcL8tAo0&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The video has been edited a bit but if you watch my clock you can see that in about 15 minutes we went from nothing to Code Camp Server running on the web using an appliance I had previously built with SUSE Studio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are interested in trying Linploy out please sign up for the beta on the front page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please post any questions, comments, criticism or suggestions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3779739262831136494?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3779739262831136494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3779739262831136494' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3779739262831136494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3779739262831136494'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2010/01/linploy-really-easy-linux-deployment.html' title='Linploy - Really easy Linux Deployment'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4wtItLnZ3X0/S0-_Ff_Mf0I/AAAAAAAAAXM/tsMcFbRuSnw/s72-c/linploy-create.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4701783375480085350</id><published>2008-10-23T11:09:00.003-05:00</published><updated>2008-10-23T11:35:06.529-05:00</updated><title type='text'>Third Party Debate 9PM EST C-SPAN2</title><content type='html'>&lt;a href="http://www.freeandequal.org/"&gt;Free and Equal&lt;/a&gt; is hosting a third party debate tonight at 9PM EST.  You can watch a stream of the debate online at &lt;a href="http://www.rtrradio.com/"&gt;Restore the Republic Radio&lt;/a&gt;  or on C-SPAN2.&lt;br /&gt;&lt;br /&gt;Spread the news:&lt;br /&gt;&lt;br /&gt;Vote up on reddit plz: &lt;a href="http://www.reddit.com/r/politics/comments/78xab/live_3rd_party_debate_tonight_on_cspan2_or_listen/"&gt; http://www.reddit.com/r/politics/comments/78xab/live_3rd_party_debate_tonight_on_cspan2_or_listen/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4701783375480085350?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4701783375480085350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4701783375480085350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4701783375480085350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4701783375480085350'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/10/third-party-debate-9pm-est-c-span2.html' title='Third Party Debate 9PM EST C-SPAN2'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4429426466031184932</id><published>2008-10-04T13:19:00.002-05:00</published><updated>2008-10-04T13:20:32.882-05:00</updated><title type='text'>Roxy</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_4wtItLnZ3X0/SOez4syDP5I/AAAAAAAAALE/bMh99pmNSpU/s1600-h/IMG_0016.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5253365277026107282" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_4wtItLnZ3X0/SOez4syDP5I/AAAAAAAAALE/bMh99pmNSpU/s320/IMG_0016.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4429426466031184932?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4429426466031184932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4429426466031184932' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4429426466031184932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4429426466031184932'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/10/roxy.html' title='Roxy'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4wtItLnZ3X0/SOez4syDP5I/AAAAAAAAALE/bMh99pmNSpU/s72-c/IMG_0016.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3708172690063106897</id><published>2008-08-18T20:04:00.007-05:00</published><updated>2008-08-18T20:29:42.810-05:00</updated><title type='text'>Red Army - 2008 Summer League Champs</title><content type='html'>(In reverse chronological order because blogger hates me)&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_4wtItLnZ3X0/SKohHSXixrI/AAAAAAAAAKg/rqSC4euPYrk/s320/n539275777_1162544_852.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5236033925845010098" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;mvp trophy&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4wtItLnZ3X0/SKogsGFx7SI/AAAAAAAAAKQ/O26I4y0BmGw/s1600-h/n539275777_1162527_4794.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4wtItLnZ3X0/SKogsGFx7SI/AAAAAAAAAKQ/O26I4y0BmGw/s320/n539275777_1162527_4794.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5236033458692812066" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;back to back champs&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4wtItLnZ3X0/SKogG-9yzcI/AAAAAAAAAJ4/IVHoz6AAX9U/s1600-h/n539275777_1162496_5543.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4wtItLnZ3X0/SKogG-9yzcI/AAAAAAAAAJ4/IVHoz6AAX9U/s320/n539275777_1162496_5543.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5236032821125107138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4wtItLnZ3X0/SKof8yL5uaI/AAAAAAAAAJw/IG9HEvSkhqc/s1600-h/n539275777_1162493_4663.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_4wtItLnZ3X0/SKof8yL5uaI/AAAAAAAAAJw/IG9HEvSkhqc/s320/n539275777_1162493_4663.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5236032645895928226" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3708172690063106897?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3708172690063106897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3708172690063106897' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3708172690063106897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3708172690063106897'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/08/red-army-2008-summer-league-champs.html' title='Red Army - 2008 Summer League Champs'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4wtItLnZ3X0/SKohHSXixrI/AAAAAAAAAKg/rqSC4euPYrk/s72-c/n539275777_1162544_852.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8831814085232115753</id><published>2008-08-16T12:58:00.003-05:00</published><updated>2008-08-16T13:00:42.868-05:00</updated><title type='text'>Attached Properties in Silverlight 2.0</title><content type='html'>To create an attached property in Silverlight 2.0 is it mandatory to create a:&lt;br /&gt;&lt;br /&gt;SetMyPropertyName (DependencyObject target, object value); method?  I can't find any other way to set an attached property.  Static properties don't work and neither do DependencyObjects.&lt;br /&gt;&lt;br /&gt;Anyone know other ways these can be set?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8831814085232115753?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8831814085232115753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8831814085232115753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8831814085232115753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8831814085232115753'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/08/attached-properties-in-silverlight-20.html' title='Attached Properties in Silverlight 2.0'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8441903583000250123</id><published>2008-08-02T13:00:00.003-05:00</published><updated>2008-08-02T13:37:02.923-05:00</updated><title type='text'>Grurrah.com: Web 2.0 isn't just for getting teenagers laid</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;After a trip to Canada last Christmas I realized I wasn’t doing enough to limit my impact on the environment.   My friends back home were reducing, recycling and reusing and all I had been doing was watching &lt;a href="http://www.vh1.com/shows/dyn/rock_of_love_2/series.jhtml"&gt;crappy reality shows on VH1&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;So I did some googling for things like “How to be more environmentally friendly” and didn’t find much.  There weren’t any &lt;a href="http://en.wikipedia.org/wiki/User_generated_content"&gt;big, long lists&lt;/a&gt; anywhere.  Just collections thrown together by editors.   Very Web 1.0, and not very useful.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The lack of useful information out there and the &lt;a href="http://ajaxwidgets.com/news_gaia_programming_contest.aa"&gt;Gaiaware Programming Contest&lt;/a&gt;, motivated me to start working on &lt;a href="http://www.grurrah.com/"&gt;Grurrah.com&lt;/a&gt;.&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What is Grurrah.com?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;It haz a cheezburger?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Grurrah is the latin name for a rare species of Giraffe that will actually attack humans.  I felt it was fitting to have an animal ‘fighting back’ against humans as the mascot for the site.&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://farm1.static.flickr.com/193/527455832_93470a55cc.jpg" border="0" alt="" /&gt;&lt;div style="text-align: center;"&gt;(I want to eat your face)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Sadly, the last paragraph is a lie.  It’s just a made up word because every domain in the world is already taken.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.grurrah.com/"&gt;Grurrah.com&lt;/a&gt; is an open repository of &lt;a href="http://www.grurrah.com/"&gt;green ideas&lt;/a&gt;.  Anyone can create, edit, tag and rate any of the ideas in the repository.   By being totally open, and allowing anyone to contribute, I hope we can come up with something more useful than the sites I encountered when searching for green resources.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;What can you do at Grurrah.com?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Meet Girls?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://farm1.static.flickr.com/12/89972945_9be9644a95.jpg?v=0" border="0" alt="" /&gt;&lt;div style="text-align: center;"&gt;(I is so confused)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Without creating an account you can create, edit and tag ideas.   However, if you create an account you can track the green things you are doing or the things you would like to do.  Eventually I would like to tie this into a facebook app, so you can display to your friends the things you would like to do and the things you are doing.  Who knows, maybe this will help someone meet girls.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Why should I Participate?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Meet Girls?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2325/1592041000_1dbddd9e8c.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://farm3.static.flickr.com/2325/1592041000_1dbddd9e8c.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;(Free Beer?)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I’m not going to bother debating the merits of being more green.  Even the staunchest anti-environmentalist can probably find something on grurrah.com that will make their life better (once we get more ideas on the site).  A lot of things that reduce our environmental impact also simplify our life.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;This is amazing, how can I help out?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Should I tell da girls?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1368/539445438_5067b65dbb.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;(Confusing Diagrams make people think you are smart)&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, the most obvious thing you could do, is register and create some green ideas.  Short of that, I could use a good google bombing campaign.  I’d really like to improve my ranking for “&lt;a href="http://www.grurrah.com"&gt;green ideas&lt;/a&gt;”.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;If you have a local green store, you could tell the owners.  Most of these stores have mailing lists and I’d love to be mentioned on their lists.&lt;br /&gt;&lt;br /&gt;If you know anyone interested in contributing ideas, send them a link.  You can send them my email address too.&lt;br /&gt;&lt;br /&gt;If you are a software developer, web designer, artist or even a sys admin, I could certainly use your help.  Grurrah.com is an OSS project, and there are lots of things I could use help with.  I’d especially like help with the opensocial and facebook integration and cleaning up my disgusting CSS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Are you going to blog about this site a lot?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;It’s not really Mono related and you are terribly boring. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4wtItLnZ3X0/SJSh7FQBOeI/AAAAAAAAAJo/ZUSP4G25wqI/s1600-h/Wolf+in+Sheep%27s+Clothing.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_4wtItLnZ3X0/SJSh7FQBOeI/AAAAAAAAAJo/ZUSP4G25wqI/s320/Wolf+in+Sheep%27s+Clothing.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5229983103677708770" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;(I is so bored I dressed as a wolf)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Yes!  But not on Monologue.  I have another &lt;a href="http://grurrah.blogspot.com/"&gt;blog specific to Grurrah development&lt;/a&gt; that I will use.  I am planning on writing another entry about how I developed the site, the architecture, the ins, the outs and the what-have-yous.  I think that entry might interest Mono devs, so that one will probably make it’s way onto Monologue.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8441903583000250123?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8441903583000250123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8441903583000250123' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8441903583000250123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8441903583000250123'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/08/grurrahcom-web-20-isnt-just-for-getting.html' title='Grurrah.com: Web 2.0 isn&apos;t just for getting teenagers laid'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/193/527455832_93470a55cc_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7333977495919462113</id><published>2008-07-28T12:50:00.000-05:00</published><updated>2008-07-28T11:52:46.736-05:00</updated><title type='text'>How is this not a bigger story?</title><content type='html'>&lt;a href="http://www.post-gazette.com/pg/08193/896353-454.stm"&gt;PA Bonusgate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My favorite part.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;State employees were routinely diverted from their jobs to provide political services and, in the case of Mr. Veon, to transport his motorcycles to South Dakota for his vacation and to provide dinners to members of Mr. Veon's informal basketball league.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7333977495919462113?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7333977495919462113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7333977495919462113' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7333977495919462113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7333977495919462113'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/07/how-is-this-not-bigger-story.html' title='How is this not a bigger story?'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7004198605959452862</id><published>2008-07-28T08:38:00.002-05:00</published><updated>2008-07-28T08:44:10.905-05:00</updated><title type='text'>Nader in Salt Lake City this Thursday</title><content type='html'>According to Google Analytics a large number of my readers are in the Utah valley.  So I thought you would all like to know that Nader will be at a rally with your &lt;a href="http://en.wikipedia.org/wiki/Rocky_Anderson"&gt;former mayor&lt;/a&gt; on thursday at the Libby Gardner Concert Hall.&lt;br /&gt;&lt;br /&gt;More info &lt;a href="http://www.votenader.org/events/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Whether you are a hard core conservative and plan on voting for McCain or just a softcore conservative and plan on voting for Obama, you should go check out Nader's talk.  Who knows, there might even be free cookies!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7004198605959452862?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7004198605959452862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7004198605959452862' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7004198605959452862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7004198605959452862'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/07/nader-in-salt-lake-city-this-thursday.html' title='Nader in Salt Lake City this Thursday'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3488308192377660339</id><published>2008-07-26T09:09:00.002-05:00</published><updated>2008-07-26T09:20:09.842-05:00</updated><title type='text'>Come Join me in Virginia</title><content type='html'>My neighbor works for Landmark Communications.  They are the guys that just sold the Weather Channel for $3.5 Billion, and they are looking for a "News Database Developer". Which I believe is a fancy term for a LAMP programmer.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://landmarkcom.ats.hrsmart.com/cgi-bin/a/highlightjob.cgi?jobid=2356"&gt;Here's the job posting.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm sure the position would require relocation to Norfolk, which isn't as terrible as most people would assume.  Norfolk has some pretty cool areas to live, and is within a half hour drive to one of the best beaches on the east coast.  There aren't nearly as many pickup trucks, confederate flags and gun racks as you would expect.  But if that's your bag of tea, you can always take a quick trip down to North Carolina for NASCAR and BBQ.  We're also within a couple hours of DC and half  a days drive away from NYC.  We've got &lt;a href="http://norfolktides.com/"&gt;triple-A baseball&lt;/a&gt; and &lt;a href="http://norfolkadmirals.com"&gt;triple-A hockey&lt;/a&gt; AND WWE even comes to town sometimes!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3488308192377660339?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3488308192377660339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3488308192377660339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3488308192377660339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3488308192377660339'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/07/come-join-me-in-virginia.html' title='Come Join me in Virginia'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8175238218039218779</id><published>2008-07-22T00:40:00.000-05:00</published><updated>2008-07-21T23:40:39.928-05:00</updated><title type='text'>Silverlight 2.0: Without Visual Studio</title><content type='html'>While visiting Thailand the authorities have discovered 50 Kilos of Heroin in your bags.   You are thrown into a crowded dark prison and forced to fend for yourself.  A fellow inmate offers you protection in exchange for a Silverlight 2.0 Beta 2 Hello World Application.  You agree to the deal and then realize....THE THAI PRISON COMPUTERS ARE RUNNING OPEN SUSE 11 (with Moonlight from SVN).  Luckily, that isn't too difficult with Moonlights toolset.&lt;br /&gt;&lt;br /&gt;First off create a directory named HelloWorld.  It's important that we name our directory the same thing as our application because some of the tools use the directory name to figure out the application name.&lt;br /&gt;&lt;br /&gt;The first thing we need to do is create the XAML for our top level Control.  In Silverlight 2 the top level element is a UserControl not a Canvas like in Silverlight 1.  A basic UserControl will have a code behind file and child controls, here's our basic UserControl:&lt;br /&gt;&lt;br /&gt;&amp;lt;UserControl x:Class="HelloWorld.Page"&lt;br /&gt;xmlns="http://schemas.microsoft.com/client/2007"&lt;br /&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;Width="400" Height="300"&amp;gt;&lt;br /&gt;&amp;lt;TextBlock Text="Hello"/&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;br /&gt;&lt;br /&gt;Pretty simple stuff here.  We've created a UserControl that we'll call Page and stuck a TextBox inside of it.&lt;br /&gt;&lt;br /&gt;Next up, we need to create some code for our Page.  The only important thing we need to do in our Page's code is call InititalizeComponent.  The InitializeComponent method will be created for us later by our tools.&lt;br /&gt;&lt;br /&gt;Here's my Page.xaml.cs code:&lt;br /&gt;using System.Windows;&lt;br /&gt;using System.Windows.Controls;&lt;br /&gt;&lt;br /&gt;namespace HelloWorld {&lt;br /&gt;public partial class Page : UserControl&lt;br /&gt;{&lt;br /&gt;public Page()&lt;br /&gt;{&lt;br /&gt;   InitializeComponent();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;We'll ignore the code behind files for now, since our tools will create that for us.  Now, all we have left is our App.  There isn't anything interesting happening in our App.xaml:&lt;br /&gt;&lt;br /&gt;&lt;application xmlns="http://schemas.microsoft.com/client/2007" x="http://schemas.microsoft.com/winfx/2006/xaml" class="HelloWorld.App"&gt;﻿&amp;lt;Application xmlns="http://schemas.microsoft.com/client/2007"&lt;br /&gt;       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;       x:Class="HelloWorld.App"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Application&amp;gt;&lt;br /&gt;&lt;/application&gt;&lt;br /&gt;&lt;br /&gt;However, App.xaml.cs is going to set the root visual of our application to our HelloWorld.Page class:&lt;br /&gt;&lt;br /&gt;﻿using System;&lt;br /&gt;using System.Windows;&lt;br /&gt;using System.Windows.Controls;&lt;br /&gt;&lt;br /&gt;namespace HelloWorld&lt;br /&gt;{&lt;br /&gt;public partial class App : Application&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public App()&lt;br /&gt;{&lt;br /&gt;   this.Startup += this.Application_Startup;&lt;br /&gt;   InitializeComponent();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void Application_Startup(object sender, StartupEventArgs e)&lt;br /&gt;{&lt;br /&gt;   this.RootVisual = new Page();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;So we've got all our files now.  We should have Page.xaml, Page.xaml.cs, App.xaml and App.xaml.cs.  Great, but now we need to make it into a .xap file.  There's a bunch of steps here, but luckily the mxap tool will handle all of this for us.  Just run mxap in your HelloWorld project's directory and it will:&lt;br /&gt;&lt;br /&gt;1. Generate an application manifest (AppManifest.xaml).&lt;br /&gt;2. Create the codebehind files for our .xaml files (Page.xaml.g.cs and App.xaml.g.cs)&lt;br /&gt;3. Create a resource file containing our .xaml files (HelloWorld.g.resource)&lt;br /&gt;4.  Compile all of our C# code&lt;br /&gt;5. Zip everything up into a .xap file&lt;br /&gt;&lt;br /&gt;You can download the source for this demo &lt;a href="http://primates.ximian.com/%7Ejackson/HelloWorld.tar.gz"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8175238218039218779?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8175238218039218779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8175238218039218779' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8175238218039218779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8175238218039218779'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/07/silverlight-20-without-visual-studio.html' title='Silverlight 2.0: Without Visual Studio'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5009281571503511146</id><published>2008-07-15T09:55:00.000-05:00</published><updated>2008-07-15T08:46:01.344-05:00</updated><title type='text'>Nader</title><content type='html'>While furniture shopping this weekend I had this conversation:&lt;br /&gt;&lt;br /&gt;salesman:  I just can't vote for Obama anymore, I'm just not going to vote.&lt;br /&gt;me: Have you looked at Nader at all?&lt;br /&gt;salesman:  Wow, he is running?&lt;br /&gt;&lt;br /&gt;Kinda sad that Nader is &lt;a href="http://www.cnn.com/2008/POLITICS/07/01/cnn.poll.matchup/"&gt;polling at 6%&lt;/a&gt; (probably higher now given Obama's recent actions) and people still don't know he is running.   The good news is, Nader's strong polling should give him an opportunity to participate in some of the debates this year.  If Nader can reach 10% by the end of the summer he should be able to participate in the Google/Youtube debates.&lt;br /&gt;&lt;br /&gt;So here are some Nader links for you:&lt;br /&gt;&lt;a href="http://www.votenader.org/"&gt;Official Nader Campaign site&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.votenader.org/blog/"&gt;Nader Campaign Blog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/ralphnader"&gt;Vote Nader Facebook Page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://myspace.com/votenader08"&gt;Vote Nader Myspace Page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://youtube.com/votenader08"&gt;Vote Nader Youtube Channel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I highly recommend watching some of the &lt;a href="http://youtube.com/view_play_list?p=ABEFFCAFCCF28E86"&gt;Matt Gonzalez videos&lt;/a&gt;, I had never seen him speak before and am impressed.&lt;br /&gt;&lt;br /&gt;You should also checkout &lt;a href="http://en.wikipedia.org/wiki/Ralph_Nader"&gt;Nader's wikipedia page&lt;/a&gt;.  Specifically the sections on &lt;a href="http://en.wikipedia.org/wiki/Ralph_Nader#Taking_on_the_automobile_industry"&gt;taking on the automobile industry&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Ralph_Nader#Activism"&gt;activism&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://whoisi.com/p/3557"&gt;whoisi page for Ralph Nader&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5009281571503511146?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5009281571503511146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5009281571503511146' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5009281571503511146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5009281571503511146'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/07/nader.html' title='Nader'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5895866351582128929</id><published>2008-06-15T03:00:00.002-05:00</published><updated>2008-06-15T03:16:36.941-05:00</updated><title type='text'>TaintedStrings (sorta) with Monorail</title><content type='html'>Around 2AM this morning I caught a tired jackson doing something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public void MyAction (string str)&lt;br /&gt;{&lt;br /&gt;      string clean_str = StringUtil.Clean (str);&lt;br /&gt;      DoStuff (str);&lt;br /&gt;      PropertyBag ["Str"] = clean_str;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Do see the problem here?  I've gone through the trouble of cleaning my input string but I accidentally passed the dirty string to my DoStuff function.   There's no warning from the compiler, because I used the clean string elsewhere.&lt;br /&gt;&lt;br /&gt;My first idea was to change my param to something like MyAction (string tainted_str).  This would probably keep you from passing that bad string around, but I don't really want my users seeing things like www.site.com/users.rails?tainted_user=jacksonh. &lt;br /&gt;&lt;br /&gt;So I looked at how Monorail matches params and found that if the action param type could be converted from whatever Monorail thought the input was (in this case a string) it would convert the param for you.&lt;br /&gt;&lt;br /&gt;So this allowed me to create a TaintedString type:&lt;br /&gt;&lt;blockquote&gt;    [TypeConverter (typeof (Grr.TaintedStringConverter))]&lt;br /&gt;    public class TaintedString&lt;br /&gt;    {&lt;br /&gt;        private string tainted;&lt;br /&gt;&lt;br /&gt;        public TaintedString(string tainted)&lt;br /&gt;        {&lt;br /&gt;            this.tainted = tainted;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool IsEmpty&lt;br /&gt;        {&lt;br /&gt;            get { return tainted == String.Empty; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Tainted&lt;br /&gt;        {&lt;br /&gt;            get { return tainted; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Clean()&lt;br /&gt;        {&lt;br /&gt;            return StringUtil.Clean(tainted);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string CleanNoPunc()&lt;br /&gt;        {&lt;br /&gt;            return StringUtil.CleanNoPunc (tainted);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/blockquote&gt;and a TypeConverter to convert strings to TaintedStrings:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class TaintedStringConverter : TypeConverter&lt;br /&gt;    {&lt;br /&gt;        public TaintedStringConverter()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)&lt;br /&gt;        {&lt;br /&gt;            if (sourceType == typeof(string))&lt;br /&gt;                return true;&lt;br /&gt;            return base.CanConvertFrom(context, sourceType);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)&lt;br /&gt;        {&lt;br /&gt;            string strvalue = value as string;&lt;br /&gt;            if (strvalue != null)&lt;br /&gt;                return ConvertFromStringInternal (strvalue);&lt;br /&gt;            return base.ConvertFrom(context, culture, value);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private TaintedString ConvertFromStringInternal (string str)&lt;br /&gt;        {&lt;br /&gt;            return new TaintedString(str);&lt;br /&gt;        }&lt;/blockquote&gt;now I can create Actions like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public void MyAction (TaintedString str)&lt;br /&gt;{&lt;br /&gt;       string clean_str = str.Clean ();&lt;br /&gt;      DoStuff (str);&lt;br /&gt;      PropertyBag ["Str"] = clean_str;&lt;br /&gt;}&lt;/blockquote&gt;and there is no chance that I'll accidently pass the dirty string to my DoStuff function.   Changing all my params to TaintedStrings actually caught another place I was passing my bad string to a View.&lt;br /&gt;&lt;br /&gt;Another place this technique might be useful is with Friendly URLs.  You could create a FriendlyUrl class that can be converted from a string and contains the logic to map urls to your objects.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5895866351582128929?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5895866351582128929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5895866351582128929' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5895866351582128929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5895866351582128929'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/06/taintedstrings-sorta-with-monorail.html' title='TaintedStrings (sorta) with Monorail'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4123400695024793961</id><published>2008-05-29T15:09:00.003-05:00</published><updated>2008-06-02T10:40:56.086-05:00</updated><title type='text'>SEO with Silverlight</title><content type='html'>Testing a Moonlight bug today I ran across &lt;a href="http://www.silverlightseo.net/"&gt;this site&lt;/a&gt;.  I thought it was a pretty cool way of using Silver/Moonlight but still getting indexed by search engines.&lt;br /&gt;&lt;br /&gt;For those that don't want to view source.  Basically the site defines all of it's content in &lt;div&gt;&lt;/div&gt;divs, then when the Silverlight control is created, it gets the content from those divs.  In a way, Silverlight is almost acting like a stylesheet for the page.&lt;br /&gt;&lt;br /&gt;Seems like this method would be useful for dynamic content with Silverlight and making content updates more manageable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4123400695024793961?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4123400695024793961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4123400695024793961' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4123400695024793961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4123400695024793961'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/05/seo-with-silverlight.html' title='SEO with Silverlight'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5369882005449140923</id><published>2008-05-09T10:22:00.003-05:00</published><updated>2008-05-09T10:26:46.631-05:00</updated><title type='text'>Inversion Tables</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4wtItLnZ3X0/SCRs5LNiUGI/AAAAAAAAAIQ/iJMkKBpRvVk/s1600-h/inversion-table.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_4wtItLnZ3X0/SCRs5LNiUGI/AAAAAAAAAIQ/iJMkKBpRvVk/s320/inversion-table.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5198399599410303074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Has anyone ever tried one of these?  My back has been totally killing me for the last couple weeks and none of the usual stuff is helping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5369882005449140923?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5369882005449140923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5369882005449140923' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5369882005449140923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5369882005449140923'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/05/inversion-tables.html' title='Inversion Tables'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4wtItLnZ3X0/SCRs5LNiUGI/AAAAAAAAAIQ/iJMkKBpRvVk/s72-c/inversion-table.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3556143754597715483</id><published>2008-04-16T11:26:00.000-05:00</published><updated>2008-04-16T11:27:09.614-05:00</updated><title type='text'>ORLY?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/SAYoy4znuVI/AAAAAAAAAII/yqJtp5DcVvk/s1600-h/gettimeofdaydocs.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_4wtItLnZ3X0/SAYoy4znuVI/AAAAAAAAAII/yqJtp5DcVvk/s320/gettimeofdaydocs.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5189880475298543954" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3556143754597715483?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3556143754597715483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3556143754597715483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3556143754597715483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3556143754597715483'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/04/orly.html' title='ORLY?'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/SAYoy4znuVI/AAAAAAAAAII/yqJtp5DcVvk/s72-c/gettimeofdaydocs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4424612528122958240</id><published>2008-04-09T16:43:00.004-05:00</published><updated>2008-04-09T16:53:32.416-05:00</updated><title type='text'>Jackson's Official Stanley Cup Playoff Picks - Rounds One</title><content type='html'>I haven't put much thought into this but the games start in an hour, so I better blog my picks now, so I can claim extreme intelligence when 5 of my 8 are correct.&lt;br /&gt;&lt;br /&gt;East:&lt;br /&gt;Montreal in 4.  Boston sucks and their announcers are annoying.&lt;br /&gt;Pittsburgh in 5.  Pens fans are annoying, but Ottawa isn't physical enough to beat the Pens right now.&lt;br /&gt;Washington in 5.  How did Philly even make the playoffs?&lt;br /&gt;New Jersey in 6.  You can't out New Jersey New Jersey.  Look for New Jersey to out New Jersey New York in this series.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;West:&lt;br /&gt;Detroit in 5.  Yay Nashville made the playoffs!  So would I if I played St Louis and Columbus every other game.&lt;br /&gt;San Jose in 6.  San Jose will implode in the playoffs, but it won't be against the Flames.&lt;br /&gt;Minnesota in 7.  I like Colorado, but I don't think they will be able to keep all their veterans on the ice for an entire series.&lt;br /&gt;Ducks in 6.  Turco.&lt;br /&gt;&lt;br /&gt;For reference, Maggie the Monkey's picks are very similar to mine:&lt;br /&gt;Maggie: mtl, pit, phl, nj, det, sj, min, ana&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4424612528122958240?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4424612528122958240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4424612528122958240' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4424612528122958240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4424612528122958240'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/04/jacksons-official-stanley-cup-playoff.html' title='Jackson&apos;s Official Stanley Cup Playoff Picks - Rounds One'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3295022561842032509</id><published>2008-04-08T16:16:00.004-05:00</published><updated>2008-04-08T16:23:24.990-05:00</updated><title type='text'>Comparison reports and graphing in the Moonlight Tests</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4wtItLnZ3X0/R_vheke2XqI/AAAAAAAAAH4/OsP326NX9_M/s1600-h/compare-report.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_4wtItLnZ3X0/R_vheke2XqI/AAAAAAAAAH4/OsP326NX9_M/s320/compare-report.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5186987311152651938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now that we are saving data from previous moonlight test runs, we can do useful stuff, like graph test run data and show regressions.&lt;br /&gt;&lt;br /&gt;The graph is a Moonlight control, the report generates a XAML graph and some JS for the mouseovers and embeds it in the html report.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3295022561842032509?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3295022561842032509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3295022561842032509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3295022561842032509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3295022561842032509'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/04/comparison-reports-and-graphing-in.html' title='Comparison reports and graphing in the Moonlight Tests'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4wtItLnZ3X0/R_vheke2XqI/AAAAAAAAAH4/OsP326NX9_M/s72-c/compare-report.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-1096206599779469940</id><published>2008-04-07T22:41:00.001-05:00</published><updated>2008-04-07T22:42:45.315-05:00</updated><title type='text'>I am a terrible blogger</title><content type='html'>But apparently &lt;a href="http://twitter.com/jacksonh"&gt;I am a voracious twitterer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-1096206599779469940?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/1096206599779469940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=1096206599779469940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1096206599779469940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1096206599779469940'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/04/i-am-terrible-blogger.html' title='I am a terrible blogger'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7799568330681922303</id><published>2008-03-17T20:09:00.002-05:00</published><updated>2008-03-17T20:13:33.049-05:00</updated><title type='text'>How to run the Moonlight tests</title><content type='html'>I've just completed my first pass at &lt;a href="http://www.mono-project.com/Moonlight_Test_Harness"&gt;documentation for the Moonlight testing harness&lt;/a&gt;.  Feedback is welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7799568330681922303?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7799568330681922303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7799568330681922303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7799568330681922303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7799568330681922303'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/03/how-to-run-moonlight-tests.html' title='How to run the Moonlight tests'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7947194719581013415</id><published>2008-02-17T22:30:00.002-05:00</published><updated>2008-02-17T22:38:38.742-05:00</updated><title type='text'>Red Army 2007-2008 Champions</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2198/2263842383_a4c900d530.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm3.static.flickr.com/2198/2263842383_a4c900d530.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Please note that I am the only one with a playoff beard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7947194719581013415?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7947194719581013415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7947194719581013415' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7947194719581013415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7947194719581013415'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/02/red-army-2007-2008-champions.html' title='Red Army 2007-2008 Champions'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2198/2263842383_a4c900d530_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8335051233061083675</id><published>2008-01-25T11:46:00.000-05:00</published><updated>2008-01-25T12:03:39.401-05:00</updated><title type='text'>End of the Regular Season</title><content type='html'>So Wednesday night, in a influenza-induced haze, I played my last hockey game of the regular season.    We won 6-0, clinching second place in the league and a spot in the playoffs (against the team we just beat).&lt;br /&gt;&lt;br /&gt;(A team picture would be more appropriate here, but the guy that took them hasn't emailed them to me yet.  Can we please get cameras that transfer images with bluetooth?)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4wtItLnZ3X0/R5oTa5ZgLLI/AAAAAAAAAGM/VfoTHpzQFdI/s1600-h/p1030456.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_4wtItLnZ3X0/R5oTa5ZgLLI/AAAAAAAAAGM/VfoTHpzQFdI/s320/p1030456.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5159457675911638194" /&gt;&lt;/a&gt;For my first season back, after three years off the ice, I'm pretty happy with things.  Here are my end of year stats:&lt;br /&gt;&lt;br /&gt;Wins:  16&lt;br /&gt;Losses: 3&lt;br /&gt;Shootout Wins:  4&lt;br /&gt;Shootout Losses: 0&lt;br /&gt;&lt;br /&gt;Goals Against Average:  1.58&lt;br /&gt;Save Percentage:  93.8%&lt;br /&gt;&lt;br /&gt;Shutouts:  6&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is also the first season that I've kept track of all my statistics.  I used &lt;a href="http://www.mygoaliestats.com"&gt;mygoaliestats.com&lt;/a&gt; for this, and it's an awesome site.  Every time I've made a feature suggestion to the owner, it's been added within days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8335051233061083675?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8335051233061083675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8335051233061083675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8335051233061083675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8335051233061083675'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/01/end-of-regular-season.html' title='End of the Regular Season'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4wtItLnZ3X0/R5oTa5ZgLLI/AAAAAAAAAGM/VfoTHpzQFdI/s72-c/p1030456.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6997738980028084421</id><published>2008-01-24T11:14:00.000-05:00</published><updated>2008-01-24T11:22:11.535-05:00</updated><title type='text'>Green Life</title><content type='html'>Just stumbled upon this site:  &lt;a href="http://www.greenlife.com/individual/site/user/site.php?module=page&amp;pageid=840&amp;module=page"&gt;GreenLife.com&lt;/a&gt;, which allows you to easily buy "offsets" for the environmental damage that you do.  &lt;br /&gt;&lt;br /&gt;So say that you have a family of six and you really need to buy an SUV, you feel guilty about it, but there isn't much you can do.  Greenlife.com allows you to buy an &lt;a href="http://www.greenlife.com/individual/site/user/site.php?module=page&amp;pageid=821&amp;module=page&amp;category=INDIV"&gt;SUV Offset&lt;/a&gt;, that eats up 7 tons of carbon credits, offsetting 12,000 miles worth of SUV driving.  Plus you get one of those silly rubber bracelets that everyone wears nowadays.&lt;br /&gt;&lt;br /&gt;They also have offsets for air travel, and homes, as well as gift packages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6997738980028084421?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6997738980028084421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6997738980028084421' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6997738980028084421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6997738980028084421'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2008/01/green-life.html' title='Green Life'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7670037480091192866</id><published>2007-12-08T22:14:00.000-05:00</published><updated>2007-12-08T22:16:34.338-05:00</updated><title type='text'>Closest I have come to achieving my childhood goals</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4wtItLnZ3X0/R1td8HB67hI/AAAAAAAAAFk/MlcpEznQBc8/s1600-h/p1030114.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_4wtItLnZ3X0/R1td8HB67hI/AAAAAAAAAFk/MlcpEznQBc8/s320/p1030114.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5141806686834191890" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7670037480091192866?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7670037480091192866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7670037480091192866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7670037480091192866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7670037480091192866'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/12/closest-i-have-come-to-achieving-my.html' title='Closest I have come to achieving my childhood goals'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4wtItLnZ3X0/R1td8HB67hI/AAAAAAAAAFk/MlcpEznQBc8/s72-c/p1030114.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2576284415505285157</id><published>2007-11-07T11:00:00.001-05:00</published><updated>2007-11-07T11:22:47.354-05:00</updated><title type='text'>Mono Summit - A couple cool new sessions</title><content type='html'>I've just added a couple of cool new sessions to the &lt;a href="http://www.mono-project.com/MonoSummit2007"&gt;Mono Summit&lt;/a&gt; session list.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://build.opensuse.org/images/common/geeko.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://build.opensuse.org/images/common/geeko.jpg" alt="" border="0" /&gt;&lt;/a&gt;First off Wade will be giving a presentation on the &lt;a href="https://build.opensuse.org/"&gt;OpenSuse Build Service&lt;/a&gt;.  Wade will teach us all the ins, outs, and what-have-yous of using the build service to create and deploy packages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/en/7/7d/Second_Life.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://upload.wikimedia.org/wikipedia/en/7/7d/Second_Life.png" alt="" border="0" /&gt;&lt;/a&gt;Jim Purbrick will be giving a talk titled "Towards A Virtual Babel: Mono In Second Life"&lt;br /&gt;&lt;br /&gt;Second Life is a large, on-line virtual world where avatars dance, fly, shop, play, meet, work, fall in love... and program. About 256k residents of Second Life have written 2.5 billion lines of code and run 30 million scripts 24/7 in a continuous 3D landscape twice the size of Montreal. This giant, collaborative development environment is run on a grid of over 12k CPUs that simulate the land of Second Life. Integrating the Mono virtual machine in to this environment has presented a huge set of challenges but also major advantages and paves the way towards a day where the Second Life software speaks as many languages as its residents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2576284415505285157?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2576284415505285157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2576284415505285157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2576284415505285157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2576284415505285157'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/11/mono-summit-couple-cool-new-sessions_07.html' title='Mono Summit - A couple cool new sessions'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6404390430377270400</id><published>2007-11-05T12:17:00.000-05:00</published><updated>2007-11-05T12:30:19.823-05:00</updated><title type='text'>Mono Summit 2007 - Session List</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mono-project.com/MonoSummit2007"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer;" src="http://www.mono-project.com/files/4/42/Summit.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is our initial proposed session list for the upcoming &lt;a href="http://www.mono-project.com/MonoSummit2007"&gt;Mono Summit in Madrid (Nov. 28-30th)&lt;/a&gt;.  Right now the session list only includes presentations that will be made by Novell employees, we are still assembling the list of outside presenters. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://primates.ximian.com/%7Ejackson/Mono_Summit_2007_Agenda.pdf"&gt;http://primates.ximian.com/~jackson/Mono_Summit_2007_Agenda.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would appreciate &lt;a href="mailto:jackson@ximian.com"&gt;everyone's feedback&lt;/a&gt;.  We'd like to know which presentations look interesting to you and if there are any interesting topics missing from the list.&lt;br /&gt;&lt;br /&gt;This list will probably change a lot over the next few weeks as we receive feedback from everyone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6404390430377270400?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6404390430377270400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6404390430377270400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6404390430377270400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6404390430377270400'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/11/mono-summit-2007-session-list.html' title='Mono Summit 2007 - Session List'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3090438639293230826</id><published>2007-11-01T11:28:00.000-05:00</published><updated>2007-11-05T12:28:14.358-05:00</updated><title type='text'>Mono Summit 2007 - Call for Presenters</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mono-project.com/MonoSummit2007"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer;" src="http://www.mono-project.com/files/4/42/Summit.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;We are in the process of putting together an agenda for the 2007 Mono Summit in Madrid.  If you are a contributor or user of Mono, and are interested in presenting, demoing or being involved in the summit in any way, please send &lt;a href="mailto:jackson@ximian.com"&gt;me&lt;/a&gt; an email with your proposal.&lt;br /&gt;&lt;br /&gt;Please include in your proposal a topic, description, and your desired presentation format (ie a Talk, Birds of a Feather, Company Sponsored outing, or just a brief demo).  We will also need to know the length of time you will need for your presentation.&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/4677537836173626009-3090438639293230826?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3090438639293230826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3090438639293230826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3090438639293230826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3090438639293230826'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/11/mono-summit-2007-call-for-presenters.html' title='Mono Summit 2007 - Call for Presenters'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-1560967736528881448</id><published>2007-10-19T13:42:00.000-05:00</published><updated>2007-10-19T13:45:18.412-05:00</updated><title type='text'>Brand new laptop</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/Rxj7DPLo_DI/AAAAAAAAAEs/MUprHxFGGR8/s1600-h/angry-p990-note.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_4wtItLnZ3X0/Rxj7DPLo_DI/AAAAAAAAAEs/MUprHxFGGR8/s320/angry-p990-note.gif" alt="" id="BLOGGER_PHOTO_ID_5123120609167473714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;and my 'C' key doesn't work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-1560967736528881448?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/1560967736528881448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=1560967736528881448' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1560967736528881448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1560967736528881448'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/10/brand-new-laptop.html' title='Brand new laptop'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/Rxj7DPLo_DI/AAAAAAAAAEs/MUprHxFGGR8/s72-c/angry-p990-note.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4029591386236267176</id><published>2007-09-10T21:09:00.000-05:00</published><updated>2007-09-10T21:37:34.600-05:00</updated><title type='text'>Windowless plugin support</title><content type='html'>If you use Flash on Linux, you are probably used to things like drop down menus showing up behind a page's Flash elements.   This is because the Flash element is an X window that is being hosted inside of Mozilla using XEmbed, unlike other HTML elements that are composited together by Mozilla.&lt;br /&gt;&lt;br /&gt;Moonlight has the same problem and it has made sites like tafiti.com, which layers html elements on top of a Moonlight control, unusable.&lt;br /&gt;&lt;br /&gt;There is support for Windowless plugins in Mozilla, but until very recently, it hasn't been available in Linux.   I've been working on making Moonlight use this new windowless plugin support and I was finally able to use tafiti.com this morning.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/RuX-5mqNfVI/AAAAAAAAAEI/b7ZRsxImpWI/s1600-h/Screenshot-tafiti+-+Minefield.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_4wtItLnZ3X0/RuX-5mqNfVI/AAAAAAAAAEI/b7ZRsxImpWI/s320/Screenshot-tafiti+-+Minefield.png" alt="" id="BLOGGER_PHOTO_ID_5108769617905286482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(The text is an HTML &amp;gt;input element on top of a Moonlight control)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4029591386236267176?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4029591386236267176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4029591386236267176' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4029591386236267176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4029591386236267176'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/09/windowless-plugin-support.html' title='Windowless plugin support'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/RuX-5mqNfVI/AAAAAAAAAEI/b7ZRsxImpWI/s72-c/Screenshot-tafiti+-+Minefield.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2595641025132372842</id><published>2007-08-16T13:16:00.000-05:00</published><updated>2007-08-16T13:25:40.435-05:00</updated><title type='text'>Sprawl running on Moonlight</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4wtItLnZ3X0/RsSVPGqNfUI/AAAAAAAAAEA/ArwuQBxCduY/s1600-h/Screenshot-Sprawl+-+Mozilla+Firefox-3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_4wtItLnZ3X0/RsSVPGqNfUI/AAAAAAAAAEA/ArwuQBxCduY/s320/Screenshot-Sprawl+-+Mozilla+Firefox-3.png" alt="" id="BLOGGER_PHOTO_ID_5099364764808478018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is the Sprawl game running on Moonlight.  Sprawl is a Silverlight 1.0 game and is a lot more fun than getting your ass kicked at chess by the computer.&lt;br /&gt;&lt;br /&gt;There is still an issue with the initial loading animation so if you really want to play (and I recommend it).  Download the demo and comment out the this.downloadAnimation.begin(); in sprawl/js/gameboard.js&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2595641025132372842?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2595641025132372842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2595641025132372842' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2595641025132372842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2595641025132372842'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/08/sprawl-running-on-moonlight.html' title='Sprawl running on Moonlight'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4wtItLnZ3X0/RsSVPGqNfUI/AAAAAAAAAEA/ArwuQBxCduY/s72-c/Screenshot-Sprawl+-+Mozilla+Firefox-3.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-9053796851842367112</id><published>2007-08-16T09:40:00.001-05:00</published><updated>2007-08-16T09:40:58.166-05:00</updated><title type='text'>This one is going to take a little more work</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/RsRh72qNfTI/AAAAAAAAAD4/CpRHhZ85Rik/s1600-h/errors.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_4wtItLnZ3X0/RsRh72qNfTI/AAAAAAAAAD4/CpRHhZ85Rik/s320/errors.png" alt="" id="BLOGGER_PHOTO_ID_5099308359002979634" 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/4677537836173626009-9053796851842367112?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/9053796851842367112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=9053796851842367112' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9053796851842367112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9053796851842367112'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/08/this-one-is-going-to-take-little-more.html' title='This one is going to take a little more work'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/RsRh72qNfTI/AAAAAAAAAD4/CpRHhZ85Rik/s72-c/errors.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7888947409578329483</id><published>2007-08-13T13:27:00.000-05:00</published><updated>2007-08-13T13:33:34.959-05:00</updated><title type='text'>Silverlight Chess Viewer running on Moonlight</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4wtItLnZ3X0/RsCjd_9ssQI/AAAAAAAAADw/moKFdXIfRrs/s1600-h/Screenshot-Silverlight+1.0+RC+Chess+Viewer+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_4wtItLnZ3X0/RsCjd_9ssQI/AAAAAAAAADw/moKFdXIfRrs/s320/Screenshot-Silverlight+1.0+RC+Chess+Viewer+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5098254513965150466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This week I've decided to focus more of my efforts on the Silverlight 1.0 demos.  Here is the Chess Viewer demo running on Moonlight.  Everything seems to work perfectly, I didn't even have to make any local changes to get this demo running.&lt;br /&gt;&lt;br /&gt;If you have an uptodate moonlight you &lt;a href="http://www.vertigo.com/downloads/SilverlightChess/10RC/"&gt;check it out&lt;/a&gt; yourself.&lt;br /&gt;&lt;br /&gt;I have to say, world class chess matches look a whole lot different than me versus the computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7888947409578329483?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7888947409578329483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7888947409578329483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7888947409578329483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7888947409578329483'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/08/silverlight-chess-viewer-running-on.html' title='Silverlight Chess Viewer running on Moonlight'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4wtItLnZ3X0/RsCjd_9ssQI/AAAAAAAAADw/moKFdXIfRrs/s72-c/Screenshot-Silverlight+1.0+RC+Chess+Viewer+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4206272717529556820</id><published>2007-08-09T11:16:00.000-05:00</published><updated>2007-08-09T11:25:43.487-05:00</updated><title type='text'>Scribbler!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4wtItLnZ3X0/Rrs-N_9ssPI/AAAAAAAAADo/3z1RbhYe8zY/s1600-h/Screenshot-Silverlight+1.1+July+2007+Preview+Samples+-+Scribbler+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_4wtItLnZ3X0/Rrs-N_9ssPI/AAAAAAAAADo/3z1RbhYe8zY/s320/Screenshot-Silverlight+1.1+July+2007+Preview+Samples+-+Scribbler+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5096735813529284850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is a screenshot of the MS scribbler demo running on moonlight.  I had to make some local changes to get around C# 3.0 features and have also ran into some issues with our mouse event handling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-4206272717529556820?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4206272717529556820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4206272717529556820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4206272717529556820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4206272717529556820'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/08/scribble.html' title='Scribbler!'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4wtItLnZ3X0/Rrs-N_9ssPI/AAAAAAAAADo/3z1RbhYe8zY/s72-c/Screenshot-Silverlight+1.1+July+2007+Preview+Samples+-+Scribbler+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5757609263791049391</id><published>2007-07-02T22:30:00.000-05:00</published><updated>2007-07-02T22:41:42.175-05:00</updated><title type='text'>XamlG in da house</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4wtItLnZ3X0/RonDKG5C6AI/AAAAAAAAADc/JoewYv-yacY/s1600-h/alig.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 117px; height: 117px;" src="http://bp1.blogger.com/_4wtItLnZ3X0/RonDKG5C6AI/AAAAAAAAADc/JoewYv-yacY/s320/alig.jpg" alt="" id="BLOGGER_PHOTO_ID_5082808232880302082" border="0" /&gt;&lt;/a&gt;I just checked in the xamlg tool, which you can use for generating the partial classes created by visual studio for silverlight projects.&lt;br /&gt;&lt;br /&gt;When you create a Silverlight project in Visual Studio, in your Default.xaml file any elements that you add a x:Name property for, will be added to a partial class that looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public partial class DefaultCanvas {&lt;br /&gt;      &lt;br /&gt;       private Rectangle rect;&lt;br /&gt;&lt;br /&gt;       private void InitializeComponent ()&lt;br /&gt;       {&lt;br /&gt;           rect = this.FindName("rect") as Rectangle;&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;which allows you to easily access your xaml elements from your .NET code.  The one gotcha is that you need to make sure InitializeComponent is called in your PageLoaded handler (the IDE will add this for you).&lt;br /&gt;&lt;br /&gt;So if you have an existing Silverlight app that you are porting to Moonlight, just run:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;xamlg Default.xaml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and add the generated Default.xaml.g.cs file to your build.&lt;br /&gt;&lt;br /&gt;Pretty soon, Monodevelop and our MSBuild will be able to handle all of this for you aswell.  I suppose we should look into how to best support other build environments, like NAnt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5757609263791049391?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5757609263791049391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5757609263791049391' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5757609263791049391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5757609263791049391'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/07/xamlg-in-da-house.html' title='XamlG in da house'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4wtItLnZ3X0/RonDKG5C6AI/AAAAAAAAADc/JoewYv-yacY/s72-c/alig.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2494878855022650505</id><published>2007-07-02T09:49:00.000-05:00</published><updated>2007-07-02T11:24:22.931-05:00</updated><title type='text'>An annoying Silverlight limitation</title><content type='html'>Right now Silverlight does not support the ContentPropertyAttribute on custom XAML types.  This means if you create a custom listbox you can't do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;my:ListBox&amp;gt;&lt;br /&gt;    &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;    &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;    &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;&amp;lt;/my:ListBox&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;instead you will have to do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;my:ListBox&amp;gt;&lt;br /&gt;    &amp;lt;my:ListBox.Items&amp;gt;&lt;br /&gt;        &amp;lt;my:ListItemCollection&amp;gt;&lt;br /&gt;            &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;            &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;            &amp;lt;my:ListItem ... /&amp;gt;&lt;br /&gt;        &amp;lt;/my:ListItemCollection&amp;gt;&lt;br /&gt;    &amp;lt;/my:ListBox.Items&amp;gt;&lt;br /&gt;&amp;lt;/my:ListBox&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I did just find a forum post on this:  &lt;a href="http://silverlight.net/forums/p/879/2236.aspx"&gt;http://silverlight.net/forums/p/879/2236.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2494878855022650505?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2494878855022650505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2494878855022650505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2494878855022650505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2494878855022650505'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/07/annoying-silverlight-limitation_02.html' title='An annoying Silverlight limitation'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7962191084291588487</id><published>2007-07-02T08:51:00.000-05:00</published><updated>2007-07-02T09:12:41.263-05:00</updated><title type='text'>Improved Moonlight Support for Monodevelop</title><content type='html'>For my hackweek project, I extended Monodevelop to work a little better with Moonlight.  In the screenshot below, you can see silverlight airlines demo loaded, and the code behind for the Default.xaml.cs page that was automatically generated. Importing existing Silverlight projects works well, but creating new Moonlight projects isn't working yet.&lt;br /&gt;&lt;br /&gt;I suffered from a laptop death this week, and spent what seemed like 1/2 the week installing packages, so everything isn't quite ready yet.  Hopefully tonight I'll have it cleaned up enough to post patches.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/RokHxW5C5_I/AAAAAAAAADU/WPHjS7oLIME/s1600-h/Screenshot-SilverlightAirlines+-+User+Interface-Default.g.cs+-+MonoDevelop-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_4wtItLnZ3X0/RokHxW5C5_I/AAAAAAAAADU/WPHjS7oLIME/s320/Screenshot-SilverlightAirlines+-+User+Interface-Default.g.cs+-+MonoDevelop-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5082602199004145650" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7962191084291588487?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7962191084291588487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7962191084291588487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7962191084291588487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7962191084291588487'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/07/improved-moonlight-support-for.html' title='Improved Moonlight Support for Monodevelop'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/RokHxW5C5_I/AAAAAAAAADU/WPHjS7oLIME/s72-c/Screenshot-SilverlightAirlines+-+User+Interface-Default.g.cs+-+MonoDevelop-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8444598767929675834</id><published>2007-06-27T09:15:00.000-05:00</published><updated>2007-06-27T09:19:15.464-05:00</updated><title type='text'>World's most useful Silverlight documentation</title><content type='html'>The &lt;a href="http://msdn2.microsoft.com/en-us/library/bb188567.aspx"&gt;Silverlight Object Model reference&lt;/a&gt; is by far the most useful Silverlight documentation on the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8444598767929675834?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8444598767929675834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8444598767929675834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8444598767929675834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8444598767929675834'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/06/worlds-most-useful-silverlight.html' title='World&apos;s most useful Silverlight documentation'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2621142347545201965</id><published>2007-06-25T11:00:00.000-05:00</published><updated>2007-06-26T17:04:05.929-05:00</updated><title type='text'>A Mono Developers Guide to writing XAML by hand.</title><content type='html'>Most UI creating markup languages do not require the developer to know very much about them. A developer rarely hand writes their Glade by hand, but the dynamic nature and lack of free tools for creating XAML, will force a lot of developers to hand write XAML code.&lt;br /&gt;&lt;br /&gt;XAML is an XML based language, but unlike many other XML based languages, which are strict and cumbersome, some effort has been made to make XAML easy to write by hand. Below, I'll try to cover everything you need to know, to write XAML code for Moonlight projects.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;What is it for?&lt;/H2&gt;&lt;br /&gt;In the context of this article XAML is used to create Silver/Moonlight applications. XAML is also used to create WPF applications, but I can't really comment on that technology (until we implement it in 28 days). A typical Moonlight XAML file will contain a root Canvas element, and a number of elements used to define the applications interface.&lt;br /&gt;&lt;br /&gt;The following example draws a line from 10, 10 to 100, 100.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;    xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Line stroke=&amp;quot;Red&amp;quot; x:Name=&amp;quot;MyLine&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the above example everything looks pretty self explanatory except for thexmlns stuff. If you aren't familiar with xml, the xmlns=&amp;quot;...&amp;quot; chunks are declaring XML namespaces. You will need to use at least the first xmlns declaration in all of your XAML files. The second namespace declaration is used so that we have access to the XAML x: namespace. This namespace is used for some special XAML features that we will talk about later.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Case Sensitivity&lt;/H2&gt;&lt;br /&gt;XAML is a XML based language, and by that nature, case-sensitive. Using &amp;lt;canvas&amp;gt; or &amp;lt;line&amp;gt; in a XAML file will raise an error in the parser. The gotcha to XAML's case sensitivity is that, properties and attribute values are often (almost always) NOT case sensitive.&amp;nbsp; So Stroke=&amp;quot;Red&amp;quot; will yield the same results as Stroke=&amp;quot;RED&amp;quot; or Stroke=&amp;quot;red&amp;quot;, stroke=&amp;quot;Red&amp;quot; will not work though. This is because property values are parsed by the elements type converters, and not by the parser.&amp;nbsp; The easy way to remember this is anything outside of &amp;quot;&amp;quot; is case sensitive, and anything inside of &amp;quot;&amp;quot; is probably not (but could be).&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Well Formedness&lt;/H2&gt;&lt;br /&gt;The XAML parser doesn't do you any favors.&amp;nbsp; You XAML code needs to be well formed XML.&amp;nbsp; You can't give the parser something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas&amp;gt;&amp;lt;Line&amp;gt; &amp;lt;/Canvas&amp;gt;&lt;br /&gt;(Note that the line is unclosed)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and expect the parser to figure things out for you.&amp;nbsp; In the words of Sam Ruby, &lt;a href="http://intertwingly.net/blog/2007/05/02/Different-Drummer#slVsSvg"&gt;Silverlight is draconian&lt;/a&gt;. Not only is Silver/Moonlight draconian about errors, but it often will swallow errors and just not display your elements. If you are using Mono's Moonlight, you can build libmoonlight with DEBUG_XAML defined and get lots of extra information about your files, which can really help with debugging your application.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Setting Properties&lt;/H2&gt;&lt;br /&gt;There are a few ways to set properties in XAML. We've already seen a property set with attribute syntax above, but attribute syntax can only be used when you are setting a property to something that can be defined with a simple string, like &amp;quot;Red&amp;quot;, &amp;quot;10&amp;quot;, or &amp;quot;MyLine&amp;quot;. If we want to set a property to something more complex, like a Gradient brush, we are going to need to use &lt;b&gt;Property Element Syntax&lt;/b&gt;. The following example sets the line's stroke brush using Property Element Syntax:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Line x:Name=&amp;quot;MyLine&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot;X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Line.Stroke&amp;gt&lt;br /&gt;        &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/Line.Stroke&amp;gt;&lt;br /&gt;&amp;lt;/Line&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the above example we declared out Line element, but we didn't close the element right away, we left it open, and then opened a property element using &amp;lt;line.stroke&amp;gt;.&amp;nbsp; Properties are declared with &amp;lt;typename&amp;gt;.&amp;lt;propertyname&amp;gt;.&amp;nbsp; Since the Line.Stroke property is a Brush, all we have to do is stick a brush inside of the property declaration, and our property will be set to that Brush.&lt;br /&gt;&lt;br /&gt;Line is defined as:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Line : Shape&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and Lines inherit the Stroke property from Shapes, so something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Line x:Name=&amp;quot;MyLine&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Shape.Stroke&amp;gt;&lt;br /&gt;        &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/Shape.Stroke&amp;gt;&lt;br /&gt;&amp;lt;/Line&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;would also work. Rectangles also have a stroke property, so would this work?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Line x:Name=&amp;quot;MyLine&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Rectangle.Stroke&amp;gt;&lt;br /&gt;        &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle.Stroke&amp;gt;&lt;br /&gt;&amp;lt;/Line&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nope. The property type name needs to be in the inheritance tree of the element we are setting the property on, otherwise the parser will fail.&lt;br /&gt;&lt;br /&gt;You might be wondering, how does the parser turn &amp;quot;Red&amp;quot; in attribute syntax into &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot;&amp;gt; in property element syntax.&amp;nbsp; Well the Stroke and Fill properties are somewhat unique.&amp;nbsp; Their type converters will take a Color in string form, and turn them into a SolidColorBrush with the color represented by that string.&amp;nbsp; You can define colors using names, like Yellow, Orange, Blue or you can use RGB.&amp;nbsp; There are &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.media.solidcolorbrush.aspx"&gt;too many ways&lt;/a&gt; of defining colors in XAML for me to describe here.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Collections&lt;/H2&gt;&lt;br /&gt;Not all properties take a single value.&amp;nbsp; XAML also supports Collections.&amp;nbsp; To set a collection in XAML, you simply open the collection element, and add a bunch of properly typed elements to it.&lt;br /&gt;&lt;br /&gt;In the following example we will create a rectangle, and fill it using a LinearGradientBrush.&amp;nbsp; The LinearGradientBrush uses a Collection for setting it's GradientStops:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/client/2007&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Rectangle Width=&amp;quot;200&amp;quot; Height=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Rectangle.Fill&amp;gt;&lt;br /&gt;            &amp;lt;LinearGradientBrush StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;LinearGradienBrush.GradientStops&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStopCollection&amp;gt;&lt;br /&gt;                        &amp;lt;GradientStop Color=&amp;quot;Red&amp;quot; Offset=&amp;quot;0.0&amp;quot; /&amp;gt;&lt;br /&gt;                        &amp;lt;GradientStop Color=&amp;quot;Green&amp;quot; Offset=&amp;quot;0.50&amp;quot; /&amp;gt;&lt;br /&gt;                        &amp;lt;GradientStop Color=&amp;quot;Blue&amp;quot; Offset=&amp;quot;1.00&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;/GradientStopCollection&amp;gt;&lt;br /&gt;                &amp;lt;/LinearGradientBrush.GradientStops&amp;gt;&lt;br /&gt;            &amp;lt;/LinearGradientBrush&amp;gt;&lt;br /&gt;        &amp;lt;/Rectangle.Fill&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The GradientStopCollection, inherits from Collection, and can therefore have collection items added to it.&amp;nbsp; There is type safety here, so you can only add GradientStops to a GradientStopCollection or you will get a nasty error.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Content Properties&lt;/H2&gt;&lt;br /&gt;You were probably reading the above example and thinking to yourself, &amp;quot;I thought he said XAML wasn't cumbersome?&amp;quot;.&amp;nbsp; The above example can be simplified using a XAML feature known as Content Properties. Content Properties allow elements to have an implicit property that can be set without defining the &amp;lt;type.property&amp;gt;.&amp;nbsp; Using Content Properties, we can simplify the above example to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/client/2007&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Rectangle Width=&amp;quot;200&amp;quot; Height=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Rectangle.Fill&amp;gt;&lt;br /&gt;            &amp;lt;LinearGradientBrush StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;GradientStop Color=&amp;quot;Red&amp;quot; Offset=&amp;quot;0.0&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;GradientStop Color=&amp;quot;Green&amp;quot; Offset=&amp;quot;0.50&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;GradientStop Color=&amp;quot;Blue&amp;quot; Offset=&amp;quot;1.00&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/LinearGradientBrush&amp;gt;&lt;br /&gt;        &amp;lt;/Rectangle.Fill&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Above we simplified the example and removed four lines of code by using a single content property. LinearGradientBrush's content property is defined as GradientStops, which is a GradientStopCollection. This means we can just add GradientStops right to the LinearGradientBrush. The following example would also be legal:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/client/2007&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Rectangle Width=&amp;quot;200&amp;quot; Height=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Rectangle.Fill&amp;gt;&lt;br /&gt;            &amp;lt;LinearGradientBrush StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;GradientStopCollection&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Red&amp;quot; Offset=&amp;quot;0.0&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Green&amp;quot; Offset=&amp;quot;0.50&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Blue&amp;quot; Offset=&amp;quot;1.00&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;/GradientStopCollection&amp;gt;&lt;br /&gt;            &amp;lt;/LinearGradientBrush&amp;gt;&lt;br /&gt;        &amp;lt;/Rectangle.Fill&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that in this example, we used the LinearGradientBrush's GradientStops content property, but we still defined the GradientStopCollection.&lt;br /&gt;&lt;br /&gt;Content Properties aren't just for collections. The Run class, takes a text content property, allowing you to define text blocks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Run Font=&amp;quot;Arial&amp;quot;&amp;gt;Hi there, I am your text&amp;lt;/Run&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However, in Silver/Moonlight, most content properties are collections.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;x:Name&lt;/H2&gt;&lt;br /&gt;x:Name allows you to name the &lt;B&gt;instance&lt;/B&gt; of an element. In the following example, we will create three Lines, and name each one individually:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Line stroke=&amp;quot;Red&amp;quot; x:Name=&amp;quot;MyLineOne&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;Line stroke=&amp;quot;Red&amp;quot; x:Name=&amp;quot;MyLineTwo&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;Line stroke=&amp;quot;Red&amp;quot; x:Name=&amp;quot;MyLineThree&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;100&amp;quot; Y2=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Naming elements allows us to easily find these elements in our C# code using the&lt;A HREF="http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.findname.aspx"&gt;FindName&lt;/A&gt;function. If you are using Visual Studio, it will also allow you to magically access your element like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;MyLineOne.X1 = 25;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;VisualStudio creates some partial classes that insert type declarations and FindName's for you.&lt;br /&gt;&lt;br /&gt;Naming elements is also necessary if you want to animate elements.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Accessing Properties&lt;/H2&gt;&lt;br /&gt;You can access properties of XAML elements using PropertyPath syntax. PropertyPath syntax is resolved at runtime, and in Silver/Moonlight is only used for animations. Here is a simple example that animates a Rectangle's Brush's color property:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Canvas.Triggers&amp;gt;&lt;br /&gt;        &amp;lt;EventTrigger RoutedEvent=&amp;quot;Canvas.Loaded&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;EventTrigger.Actions&amp;gt;&lt;br /&gt;                &amp;lt;BeginStoryboard&amp;gt;&lt;br /&gt;                    &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;                        &amp;lt;ColorAnimation Storyboard.TargetName=&amp;quot;MyRectsBrush&amp;quot;&lt;br /&gt;                                           Storyboard.TargetProperty=&amp;quot;Color&amp;quot;&lt;br /&gt;                                           From=&amp;quot;Red&amp;quot; To=&amp;quot;Blue&amp;quot;&lt;br /&gt;                                           Duration=&amp;quot;0:0:5&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;                &amp;lt;/BeginStoryboard&amp;gt;&lt;br /&gt;            &amp;lt;/EventTrigger.Actions&amp;gt;&lt;br /&gt;        &amp;lt;/EventTrigger&amp;gt;&lt;br /&gt;    &amp;lt;/Canvas.Triggers&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Rectangle x:Name=&amp;quot;MyRect&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Rectangle.Fill&amp;gt;&lt;br /&gt;            &amp;lt;SolidColorBrush x:Name=&amp;quot;MyRectsBrush&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;/Rectangle.Fill&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ignore all the Trigger, Begin and Storyboard code and focus on the ColorAnimation line.  Note that we are targetting the rectangle's brush property with Storyboard.TargetName=&amp;quot;MyRectsBrush&amp;quot; and we are targetting the Color property of that brush with Storyboard.TargetProperty=&amp;quot;Color&amp;quot;. This animation will change the color of our Rectangles Fill from Red to Blue, over a five second period.&lt;br /&gt;&lt;br /&gt;In the above example we were forced to use Property Element Syntax for setting the Brush's Color because we needed to name the Brush, so it could be animated.  The following example uses Property Paths, to access the Brush, without naming it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;Canvas.Triggers&amp;gt;&lt;br /&gt;        &amp;lt;EventTrigger RoutedEvent=&amp;quot;Canvas.Loaded&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;EventTrigger.Actions&amp;gt;&lt;br /&gt;                &amp;lt;BeginStoryboard&amp;gt;&lt;br /&gt;                    &amp;lt;Storyboard&amp;gt;&lt;br /&gt;                        &amp;lt;ColorAnimation Storyboard.TargetName=&amp;quot;MyRect&amp;quot;&lt;br /&gt;                                           Storyboard.TargetProperty=&amp;quot;(Rectangle.Fill).(SolidColorBrush.Color)&amp;quot;&lt;br /&gt;                                           From=&amp;quot;Red&amp;quot; To=&amp;quot;Blue&amp;quot; Duration=&amp;quot;0:0:5&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;                &amp;lt;/BeginStoryboard&amp;gt;&lt;br /&gt;            &amp;lt;/EventTrigger.Actions&amp;gt;&lt;br /&gt;        &amp;lt;/EventTrigger&amp;gt;&lt;br /&gt;    &amp;lt;/Canvas.Triggers&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Rectangle x:Name=&amp;quot;MyRect&amp;quot; Fill=”Red” Width=&amp;quot;100&amp;quot; Height=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We don't need to be that specific in our property path code either, this would have worked just as well:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Storyboard.TargetName=&amp;quot;(Fill).(Color)&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In property path syntax, everything within ( ) brackets resolve to a property, if we add a . after a property, we are accessing  the object value of that property.  We can also access items in collections using [ ] brackets.  In the following example, we will animate the second GradientStop of a rectangle:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Canvas.Triggers&amp;gt;&lt;br /&gt;        &amp;lt;EventTrigger RoutedEvent=&amp;quot;Canvas.Loaded&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;EventTrigger.Actions&amp;gt;&lt;br /&gt;                &amp;lt;BeginStoryboard&amp;gt;&lt;br /&gt;                    &amp;lt;Storyboard&amp;gt;&lt;br /&gt;                        &amp;lt;ColorAnimation Storyboard.TargetName=&amp;quot;MyRect&amp;quot;&lt;br /&gt;                                           Storyboard.TargetProperty=&amp;quot;(Rectangle.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)&amp;quot;&lt;br /&gt;                        From=&amp;quot;Green&amp;quot; To=&amp;quot;Yellow&amp;quot; Duration=&amp;quot;0:0:5&amp;quot; &amp;gt;&lt;br /&gt;                    &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;                &amp;lt;/BeginStoryboard&amp;gt;&lt;br /&gt;            &amp;lt;/EventTrigger.Actions&amp;gt;&lt;br /&gt;        &amp;lt;/EventTrigger&amp;gt;&lt;br /&gt;    &amp;lt;/Canvas.Triggers&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Rectangle x:Name=&amp;quot;MyRect&amp;quot; Width=&amp;quot;200&amp;quot; Height=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Rectangle.Fill&amp;gt;&lt;br /&gt;            &amp;lt;LinearGradientBrush StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;GradientStopCollection&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Red&amp;quot; Offset=&amp;quot;0.0&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Green&amp;quot; Offset=&amp;quot;0.50&amp;quot; /&amp;gt;&lt;br /&gt;                    &amp;lt;GradientStop Color=&amp;quot;Blue&amp;quot; Offset=&amp;quot;1.00&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;/GradientStopCollection&amp;gt;&lt;br /&gt;            &amp;lt;/LinearGradientBrush&amp;gt;&lt;br /&gt;        &amp;lt;/Rectangle.Fill&amp;gt;&lt;br /&gt;    &amp;lt;/Rectangle&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;x:Class&lt;/H2&gt;&lt;br /&gt;XAML is a powerful language, but it is only meant to be used for defining an application's user interface.  One method of adding application logic to a Silver/Moonlight application, is the x:Class attribute.&lt;br /&gt;&lt;br /&gt;The x:Class attribute allows you to create a custom class, that extends Canvas.  The following example creates a custom class that extends Canvas and prints the current user's name.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;      &lt;br /&gt;           x:Class=&amp;quot;Mono.UserCanvas;assembly=UserCanvas.dll&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now in C#:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;namespace Mono.Fruit {&lt;br /&gt;    public class UserCanvas : Canvas {&lt;br /&gt;&lt;br /&gt;        public UserCanvas ()&lt;br /&gt;        {&lt;br /&gt;            TextBlock user = new TextBlock ();&lt;br /&gt;            user.Text = Environment.UserName;&lt;br /&gt;            Children.Add (user);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Using x:Class you are also able to easily handle events.  You can handle mouse clicks by adding the following to your C# class:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;protected override void OnMouseLeftButtonDown (MouseButtonEventArgs e)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The one gotcha to x:Class is that you can only set the x:Class attribute on the top element of your XAML file.&lt;br /&gt;&lt;br /&gt;&lt;H2&gt;Custom Tags&lt;/H2&gt;&lt;br /&gt;Another method of adding application logic to a XAML file is to use custom tags. Custom tags allow a little more flexibility, because you can set custom properties on them from the XAML code. The following example will create a custom class and set some custom properties on it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Canvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;           xmlns:fruit=&amp;quot;clr-namespace:Mono.Fruit;assembly=Fruit.dll&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;fruit:Watermelon Height=&amp;quot;100&amp;quot; Width=&amp;quot;100&amp;quot; fruit:Weight=&amp;quot;200&amp;quot; fruit:Seedless=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Our C# code will look something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;namespace Mono {&lt;br /&gt;    public class Watermelon : Canvas {&lt;br /&gt;        private int weight;&lt;br /&gt;        private bool seedless;&lt;br /&gt;&lt;br /&gt;        public int Weight {&lt;br /&gt;            get { return weight; }&lt;br /&gt;            set { weight = value; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool Seedless {&lt;br /&gt;            get { return seedless; }&lt;br /&gt;            set { seedless = true; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the above example we created a watermelon and set the Height and Width properties on it, we got both of those properties for free because our Watermelon class extends Canvas.  We also set some custom properties, Weight and Seedless.  Setting these properties doesn't require any special markup or attributes on the properties in the C# code, but the properties must have available type converters from String.  So the simple types like int, bool, double, and obviously string will work, but a lot of the classes in agclr that don't include a type converter, like Color or KeySpline will not work.  If you want to be able to set an attribute value to a type that you created, you can define a type converter for that class.&lt;br /&gt;&lt;br /&gt;That's it!  You should now understand all the important concepts in XAML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2621142347545201965?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2621142347545201965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2621142347545201965' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2621142347545201965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2621142347545201965'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/06/mono-developers-guide-to-writing-xaml.html' title='A Mono Developers Guide to writing XAML by hand.'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6936615434886081884</id><published>2007-05-12T14:40:00.000-05:00</published><updated>2007-05-12T14:41:46.645-05:00</updated><title type='text'>XAML Love?</title><content type='html'>I've been playing with Silverlight this weekend, and I would like a good XAML editor, can anyone recommend one?  I'd be extremely interested in something that can convert SVG to XAML easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6936615434886081884?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6936615434886081884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6936615434886081884' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6936615434886081884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6936615434886081884'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/05/xaml-love.html' title='XAML Love?'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-9028753569617616146</id><published>2007-05-07T13:00:00.000-05:00</published><updated>2007-05-07T13:01:48.995-05:00</updated><title type='text'>Vile Canadian Remembrance Plot Foiled by Alert Army Contractors</title><content type='html'>&lt;a href="http://www.theglobeandmail.com/servlet/story/RTGAM.20070507.wspycoins0507/BNStory/National/home"&gt;oh my&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-9028753569617616146?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/9028753569617616146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=9028753569617616146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9028753569617616146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/9028753569617616146'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/05/vile-canadian-remembrance-plot-foiled.html' title='Vile Canadian Remembrance Plot Foiled by Alert Army Contractors'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3788330091225498506</id><published>2007-05-04T12:36:00.000-05:00</published><updated>2007-05-04T12:37:47.320-05:00</updated><title type='text'>Judge Sues for $65 million - The case of the missing pants</title><content type='html'>&lt;a href="http://www.msnbc.msn.com/id/18471265/GT1/9951/"&gt;Seriously?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3788330091225498506?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3788330091225498506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3788330091225498506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3788330091225498506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3788330091225498506'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/05/judge-sues-for-65-million-case-of.html' title='Judge Sues for $65 million - The case of the missing pants'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-12511286822582826</id><published>2007-03-12T11:34:00.000-05:00</published><updated>2007-03-12T11:40:27.578-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screenshots'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='managed windows forms'/><title type='text'>Managed Windows Forms Screenshots</title><content type='html'>Some really cool entries so far.  It is nice to see the diversity of applications written with winforms.&lt;br /&gt;&lt;br /&gt;I've setup a &lt;a href="http://flickr.com/photos/7241529@N03/"&gt;flickr gallery&lt;/a&gt; of all of the entries so far.    You've got one more week to submit an entry.   Don't let this amazing opportunity for fame and fortune slip away!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-12511286822582826?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/12511286822582826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=12511286822582826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/12511286822582826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/12511286822582826'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/03/managed-windows-forms-screenshots.html' title='Managed Windows Forms Screenshots'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3813886975261053795</id><published>2007-03-10T14:12:00.000-05:00</published><updated>2007-03-10T21:01:10.919-05:00</updated><title type='text'>BETA:  Feed Flare</title><content type='html'>(ignore this post, I am testing some oh so web two oh stuff)&lt;br /&gt;&lt;br /&gt;I wonder.  Is my feedflare working?&lt;br /&gt;&lt;br /&gt;EDIT:  I have updated the title so now this entry is truly web 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3813886975261053795?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3813886975261053795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3813886975261053795' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3813886975261053795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3813886975261053795'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/03/feed-flare.html' title='BETA:  Feed Flare'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-4996738357663209390</id><published>2007-03-06T20:49:00.000-05:00</published><updated>2007-03-06T20:59:35.177-05:00</updated><title type='text'>Winforms screenshot contest</title><content type='html'>JPobst's recent &lt;a href="http://jpobst.blogspot.com/2007/03/little-strip-of-progress.html"&gt;post&lt;/a&gt;, made me realize that I have gotten away from my blogging bread and butter, posting winforms screenshots.   The problem is, I am kinda getting tired of taking screenshots.  You gotta run the app, make sure things look cool, press print to screen, save it, upload it, come up with a snappy blog title, .... too much work.&lt;br /&gt;&lt;br /&gt;So that is why I am having the first ever winforms screenshot contest.  Here's what you do to enter.  Take a screenshot of your application running on Mono's Winforms.  Upload it, and post a link to the screenshot in my comments, feel free to describe your app too.  If you don't have anywhere to upload to, just email me the screenshot and I'll post it for you.&lt;br /&gt;&lt;br /&gt;What does the winner get?  The top three screenshots will be featured prominently on my blog, for thousands of people to see.   You will also enjoy a feeling of pride, for having won the contest.  Finally, you will be able to brag about winning.  Very few people will understand what you are bragging about, but those that do, will be highly impressed.&lt;br /&gt;&lt;br /&gt;So get those screenshots in.&lt;br /&gt;&lt;br /&gt;To get things started, I present to you, my designer app from about a year ago.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://primates.ximian.com/%7Ejackson/Screenshot-Designer.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://primates.ximian.com/%7Ejackson/Screenshot-Designer.png" alt="" 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/4677537836173626009-4996738357663209390?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/4996738357663209390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=4996738357663209390' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4996738357663209390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/4996738357663209390'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/03/winforms-screenshot-contest.html' title='Winforms screenshot contest'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7303237950852220871</id><published>2007-03-06T00:27:00.000-05:00</published><updated>2007-03-06T01:11:00.022-05:00</updated><title type='text'>Caching control output in ASP.NET with memcached</title><content type='html'>Caching whole pages is pretty cool, but it can be very difficult to correctly vary those pages.  Think about a typical website that has some user customization, like youtube.  I imagine a lot of people that browse youtube aren't registered and logged in, so caching pages for unregistered users is great, but what about when someone is logged in?  When a user is logged in, parts of the page will be slightly different for each user.  For example, up along the top of the page it will have your username.  In this case page caching is pretty useless. Basically everything on a certain youtube page will look exactly the same for every user, but the entire page can't be cached because of one little difference.&lt;br /&gt;&lt;br /&gt;Page caching also isn't ideal when you think about how many of the same components of a page are shared across different pages, and could be rendered exactly the same way on each different page.&lt;br /&gt;&lt;br /&gt;So what I've been working on tonight is output caching for controls.  Like my last post, I am using memcached for my caching.  Memcached is certified badass at caching and is what everyone should be using.&lt;br /&gt;&lt;br /&gt;With the attached code all you need to do is change your custom controls to inherit from Mono.CachedControl instead of System.Web.UI.WebControls.  There is a little bit of overhead to caching, so you need to figure out which controls will profit from being cached, and which controls will slow down.&lt;br /&gt;&lt;br /&gt;Varyby on controls is much more useful than varyby on pages.   So if you need varyby on your cached control just call RegisterVaryByProperty with the name of a property in your constructor.  In my youtube example things would look something like this:&lt;br /&gt;&lt;br /&gt;// I am the control at the top of a youtube page that says:&lt;br /&gt;// My Account  |  History |  QuickList  (0) |  Help  | -- USER NAME --&lt;user&gt;&lt;br /&gt;class UserDataControl : Mono.CachedControl {&lt;br /&gt;&lt;br /&gt;  public UserDataControl ()&lt;br /&gt;  {&lt;br /&gt;              RegisterVaryByProperty ("UserName");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public string UserName {&lt;br /&gt;      .....&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  .....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This would cause a different instance of the UserDataControl to be cached for each user.  For the other controls, that don't need per-user caching, we can just leave out the varyby property.&lt;br /&gt;&lt;br /&gt;Right now you are only allowed one varyby param per a control.  I did this mainly for performance reasons.  Also if you think about it, in 99% of cases you shouldn't need more than one.  In the future, I suppose I should add support for multiple varyby params, and possibly varyby expressions, that allow you to have a code snippet that gets evaluated for the varyby.  These features are neat, but will be seriously non performant compared to the current system.&lt;br /&gt;&lt;br /&gt;I'd appreciate any feedback on this class.  If you have a website and would like to add caching get ahold of me, and I will help you out.  Note that you will need to have your own server, so that you can run memcached.&lt;br /&gt;&lt;br /&gt;So here is the CachedControl class, and a tiny demo app so you can see the control caching at work.&lt;br /&gt;To get the app up and running:&lt;br /&gt;- Compile CachedControl.cs&lt;br /&gt;- Compile AnimalControl.cs&lt;br /&gt;- mkdir bin&lt;br /&gt;- stick both dlls in there&lt;br /&gt;- start xsp&lt;br /&gt;&lt;br /&gt;The app works like this:&lt;br /&gt;- go to animal.aspx&lt;br /&gt;- type a name of an animal in the box, like dog.&lt;br /&gt;- hit enter, you'll see dog written, and the time that it was written, make a mental note of the time&lt;br /&gt;- type some more animal names, hitting enter each time, think of all the different animals you would like to eat, but you've never gotten a chance.  Like wallabees.&lt;br /&gt;- type dog again, notice the time stamp is the same as the first time you typed dog&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/user&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;user&gt;&lt;a href="http://primates.ximian.com/%7Ejackson/CachedControl.cs"&gt;http://primates.ximian.com/~jackson/CachedControl.cs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://primates.ximian.com/%7Ejackson/AnimalControl.cs"&gt;http://primates.ximian.com/~jackson/AnimalControl.cs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://primates.ximian.com/%7Ejackson/animal.aspx"&gt;http://primates.ximian.com/~jackson/animal.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SIDENOTES:&lt;br /&gt;- If you are doing stupid things, like using Response.Write caching isn't going to work for you.&lt;br /&gt;- Don't cache things that should be private.  Caching a users credit card number would not be smart.&lt;br /&gt;- You need to be rendering your custom controls with RenderControl instead of Render for this to work.  This is what you should be doing anyways (I think).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/user&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7303237950852220871?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7303237950852220871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7303237950852220871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7303237950852220871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7303237950852220871'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/03/caching-control-output-in-aspnet-with.html' title='Caching control output in ASP.NET with memcached'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7899478435326809944</id><published>2007-03-05T14:01:00.000-05:00</published><updated>2007-03-05T14:50:07.558-05:00</updated><title type='text'>ASP.NET Output Caching using memcached</title><content type='html'>This weekend I started hacking on a webapp.  It's something along the line of Mike Kestner's &lt;a href="http://sourceforge.net/projects/exert"&gt;exert&lt;/a&gt; application.  It's nice to use some new technologies, and to get reacquainted with some old technologies.   At one point I was thinking to myself "I wonder how the hell the asp.net datagrid does this?", so I opened up our DataGrid class and low-and-behold, I wrote the damn thing.&lt;br /&gt;&lt;br /&gt;Another thing I wrote, was the output caching.  ASP.NET's output caching is fairly limited, and our implementation probably isn't the fastest thing in the world.  The offline caching mode, which I think only took me a day to implement, uses remoting and doesn't really take performance into account at all.  Back then I didn't realize how important performance is to web applications.  At some point I'd like to go back and rework those.  As far as I know though, no body at all uses the remote mode.  I know this because I totally broke it for months and nobody complained.&lt;br /&gt;&lt;br /&gt;The other problem with asp.net's output caching is the varyby stuff.  The varyby params are just difficult to use and not really ideal.  I don't think anyone can be blamed for this, varyby is something that probably requires internal knowledge of an application.  So MS basically just designed something very remedial.&lt;br /&gt;&lt;br /&gt;The problem though, is you have no access to the cache (technically you do, but that's sorta a hack), so you can't expire stuff on your own.  If there was access to the cache, then you could easily expire things when they needed to be.&lt;br /&gt;&lt;br /&gt;So in that vein, I've decided to use &lt;a href="http://danga.com/memcached/"&gt;memcached&lt;/a&gt; for my output caching.  This lets me have remote output caching, and it lets me move my varyby params down into the application layer....although I haven't exactly figured out how yet.  My tentative plan is to use url rewriting very heavily.&lt;br /&gt;&lt;br /&gt;Anyways, here is a http module that caches pages in memcached with no varyby stuff.   You'll need the &lt;a href="https://sourceforge.net/projects/memcacheddotnet/"&gt;memcached .net bindings&lt;/a&gt; and obviously memcached.  Instructions for compiling and using are in the file.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://primates.ximian.com/%7Ejackson/memcached-module.cs"&gt;http://primates.ximian.com/~jackson/memcached-module.cs&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7899478435326809944?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7899478435326809944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7899478435326809944' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7899478435326809944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7899478435326809944'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/03/aspnet-output-caching-using-memcached.html' title='ASP.NET Output Caching using memcached'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3142832759507979339</id><published>2007-02-27T15:34:00.000-05:00</published><updated>2007-02-27T15:45:43.627-05:00</updated><title type='text'>Images in the RichTextBox</title><content type='html'>I've had some more time to work on this and our image support in RTB is a lot better now.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4wtItLnZ3X0/ReSWM8jekyI/AAAAAAAAABg/QtXeK2rayHE/s1600-h/Screenshot-Document*+-+WordPad.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_4wtItLnZ3X0/ReSWM8jekyI/AAAAAAAAABg/QtXeK2rayHE/s320/Screenshot-Document*+-+WordPad.png" alt="" id="BLOGGER_PHOTO_ID_5036315432464585506" border="0" /&gt;&lt;/a&gt;(According to google analytics, screenshots significantly increase my traffic)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. The Good&lt;br /&gt;&lt;/span&gt;The good news is that you can now load images from RTF files.  The images should be inserted correctly in the rich textbox, and you should be able to type text and have the images behave correctly.  Basically they act like one gigantic character in your text stream.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. The Bad&lt;br /&gt;&lt;/span&gt;Right now we only have support for png embeded images (\pngblip), if you are using open office and save as RTF your images will usually get added as pngblig.  UNLESS the image you added was a PNG, in which case it only gets saved as a metafile image.  No idea why OOo does things that way, I guess it just likes to convert images.&lt;br /&gt;&lt;br /&gt;Sadly, the reccomended format for RTF files is metafile, and our metafile support is not done yet.  So if you want images in your RTF files, you'll need to use PNG.  It should be easy enough to convert them on windows.  If people express overwhelming intrest I'll write the ten line script to do it (just pull out the metafile, save it into a memory stream as a png, hex encode it, and stick it back in the RTF file).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. The Ugly&lt;br /&gt;&lt;/span&gt;Resizing documents with images doesn't work that well right now, and there are some problems with selection.  Undo will need some work before you will be able to undo cutting images. &lt;br /&gt;&lt;br /&gt;Overall some of the stuff I had to do probably introduced some instability too.  Since we have to move the caret around a lot to make sure it isn't on top of an image.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3142832759507979339?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3142832759507979339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3142832759507979339' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3142832759507979339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3142832759507979339'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/02/images-in-richtextbox.html' title='Images in the RichTextBox'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4wtItLnZ3X0/ReSWM8jekyI/AAAAAAAAABg/QtXeK2rayHE/s72-c/Screenshot-Document*+-+WordPad.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-8284526319792928809</id><published>2007-02-26T10:34:00.000-05:00</published><updated>2007-02-26T11:11:30.249-05:00</updated><title type='text'>Winforms Sucks...sorta</title><content type='html'>I spent most of the weekend playing with the &lt;a href="http://ajax.asp.net/ajaxtoolkit/"&gt;asp.net ajax control toolkit&lt;/a&gt;, and it is making me seriously question why people would continue to use winforms for application development.&lt;br /&gt;&lt;br /&gt;I've never really been a big fan of web applications, because they always seemed to be substandard to a properly designed desktop application.  My three main reasons for disliking webapps were:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.  They don't work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Everyone used to be all excited about things "running on every platform" and being able to roll out updates to all their customers at once.  In reality, nothing was like that.  All of our webapp code looked like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;if (some strange var exists) {&lt;br /&gt;      // OK we are on internet explorer&lt;br /&gt;} else if (other var) {&lt;br /&gt;  // Looks like netscape, figure out which version&lt;br /&gt;  if (try to call some function that doesn't exist on netscape 4) {&lt;br /&gt;      .... etc&lt;br /&gt;  }&lt;br /&gt;} else {&lt;br /&gt;  alert ("unsupported browser, please install the latest version of internet explorer")&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and even with code like that, there were still support calls that sounded like this:&lt;br /&gt;"OK, do you know if you have javascript enabled?"&lt;br /&gt;"Alright then, go to your security preferences, and check 'disable security for this site'"&lt;br /&gt;&lt;br /&gt;A lot of these problems are gone now.  But you still see things like this all over websites:&lt;br /&gt;NOTICE:  Make sure to disable your popup blocker before attempting to ...&lt;br /&gt;&lt;br /&gt;So it seems there has been significant progress in this department, less and less I get told I am using an unsupported browser (firefox on linux) but there is still a long ways to go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Minimal Features&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This textbox that I am typing in right now is totally handicapped compared to open office, or Word.  I was actually going to write about how most of the features I want are now implemented in webapps, but then I couldn't figure out how to properly indent the code sample above, so I changed my mind.&lt;br /&gt;&lt;br /&gt;Most of googles products seem to have all the features I want.  I guess the blogger textbox is the exception.  It does seem that there is more code reuse in the webapp world than in the desktop world.  I see a lot of the same components being used by different sites, when running winforms apps, it seems that everyone has a custom drawn button.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Poor desktop integration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is my biggest gripe.  It was always a pain in the ass to save and restore things, you can't drag a file from your desktop and drop it onto a webapp and have it uploaded for you, I can't drag a GAIM contact into gmail and email that person, etc.  There's just a lack of dragging, and dropping, and sharing information between apps.&lt;br /&gt;&lt;br /&gt;The new annoyance for me, is that there is a lack of "web top" integration.  I take a course online, and sometimes use google documents to write my papers.  When I go to submit those papers, I need to save them to my harddrive, then upload them.  This works ok now, but what about when I'm using a machine without a hard drive?  Aren't we supposed to all be working entirely on the "web top" one of these days?  Sometimes I do my final proof on the nokia 770, but I can't save the document and upload it from there because of lack of hard drive space.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OK, so I guess winforms doesn't suck&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But one of the main reasons I thought webapps would never compete with desktop apps was:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Better Controls&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Webapp controls used to totally suck, there were no trees, no datagrids, no sliders, no progress meters.  Now they've got it all and more.  Checkout the accordion in the ajax toolkit, that kicks ass and is a pain in the ass to write with winforms, I know, because I spent a couple of weekends implementing one last year.  And that list on the left side of the samples page....thats a tree.  Try doing &lt;a href="http://ajax.asp.net/ajaxtoolkit/HoverMenu/HoverMenu.aspx"&gt;this&lt;/a&gt; in winforms.  You can probably do it, but it'll be a seriously crappy week getting it to work right.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I guess both suck&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But I actually see webapps getting a lot better, and all I see from desktop apps is an &lt;a href="http://wpf.netfx3.com/"&gt;attempt to emulate webapps.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-8284526319792928809?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/8284526319792928809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=8284526319792928809' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8284526319792928809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/8284526319792928809'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/02/winforms-suckssorta.html' title='Winforms Sucks...sorta'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3458967365614576062</id><published>2007-02-15T10:57:00.000-05:00</published><updated>2007-02-15T10:59:25.418-05:00</updated><title type='text'>New Dog!!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4wtItLnZ3X0/RdSDKx7befI/AAAAAAAAAA8/HLZw2tubXSY/s1600-h/P1010817+%28Modified%29.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_4wtItLnZ3X0/RdSDKx7befI/AAAAAAAAAA8/HLZw2tubXSY/s320/P1010817+%28Modified%29.JPG" alt="" id="BLOGGER_PHOTO_ID_5031790904904219122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have purchased a mail order husband for Roxy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3458967365614576062?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3458967365614576062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3458967365614576062' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3458967365614576062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3458967365614576062'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/02/new-dog.html' title='New Dog!!!'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4wtItLnZ3X0/RdSDKx7befI/AAAAAAAAAA8/HLZw2tubXSY/s72-c/P1010817+%28Modified%29.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3952869386180230753</id><published>2007-02-08T13:49:00.000-05:00</published><updated>2007-02-04T05:26:44.581-05:00</updated><title type='text'>Phone number update</title><content type='html'>I cancelled my Vonage phone today, since I just never used it.  So to everyone that has my phone numbers, make sure you are using the 213 number not the 714 one.  If you don't have the 213 number, send me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3952869386180230753?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3952869386180230753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3952869386180230753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3952869386180230753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3952869386180230753'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/02/phone-number-update.html' title='Phone number update'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-1062000694221291002</id><published>2007-01-30T13:28:00.000-05:00</published><updated>2007-01-30T13:37:10.690-05:00</updated><title type='text'>Unhappy Meals</title><content type='html'>Michael &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Pollan&lt;/span&gt;, author of &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1594200823/bookstorenow600-20"&gt;The Omnivore's Dilemma&lt;/a&gt; (click the link it is worth watching his episode of Fishbowl on Amazon) &lt;a href="http://www.nytimes.com/2007/01/28/magazine/28nutritionism.t.html?ei=5090&amp;en=a18a7f35515014c7&amp;amp;ex=1327640400&amp;partner=rssuserland&amp;amp;emc=rss&amp;pagewanted=print"&gt;writes about&lt;/a&gt;  the current state of food in the United States. A  good read on the culture of why we eat what we eat.   I am sure most people know this, but our nutritional guidelines like almost everything else developed in Washington, was not developed in our best interest, it was developed in the best interest of politicians. Which is why, when you read things like the food pyramid, you should do so with a grain of salt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-1062000694221291002?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/1062000694221291002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=1062000694221291002' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1062000694221291002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/1062000694221291002'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/unhappy-meals.html' title='Unhappy Meals'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5054525682250314212</id><published>2007-01-29T20:30:00.000-05:00</published><updated>2007-01-29T20:39:23.895-05:00</updated><title type='text'>Meal Planner</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/Rb6gBJeG7iI/AAAAAAAAAAw/9fpR54cOIsg/s1600-h/Screenshot-MealPlanner.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_4wtItLnZ3X0/Rb6gBJeG7iI/AAAAAAAAAAw/9fpR54cOIsg/s320/Screenshot-MealPlanner.png" alt="" id="BLOGGER_PHOTO_ID_5025630175774567970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since everyone else is posting  pictures of their weekend hacks, I'll post a screenshot of the app I have been working on over the weekends.&lt;br /&gt;&lt;br /&gt;MealPlanner solves one of the most annoying tasks I have to do every weekend.  It lets me plan my weekly meals, and creates a grocery list.  I try not to go to the grocery store more then once a week, but since I work from home, I cook all my meals myself.  Also, I do that eat every 2-4 hours thing, so I have 6 "feedings" a day.   With MealPlanner, I don't really have to screw around or think about what to make next, and I never have to run to the grocery store mid week.&lt;br /&gt;&lt;br /&gt;Basically everything works on drag and drop right now, which has been a pretty good test of our drag and drop implementation.  I think I'll add support for double clicking cells to add items (It'll bring up a drop down tree) but am not really sure yet.  I want to keep the UI painfully simple.&lt;br /&gt;&lt;br /&gt;I won't be adding any recipe features, there are already plenty of crappy recipe apps out there.  I also don't know what I am going to do for data entry.  Right now it just uses an XML file, and I don't really want to add UI for inserting new dishes in the tree. &lt;br /&gt;&lt;br /&gt;If anyone has any clever ideas for improving the UI, post 'em here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5054525682250314212?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5054525682250314212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5054525682250314212' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5054525682250314212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5054525682250314212'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/meal-planner.html' title='Meal Planner'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/Rb6gBJeG7iI/AAAAAAAAAAw/9fpR54cOIsg/s72-c/Screenshot-MealPlanner.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6952433329712812835</id><published>2007-01-22T17:22:00.000-05:00</published><updated>2007-01-22T17:37:43.075-05:00</updated><title type='text'>Computer Vision Syndrome</title><content type='html'>I was starting to think that my body was physically rejecting programming, and I would have to spend the rest of my life making sandwiches (the only other thing I am good at).   Turns out I have &lt;a href="http://en.wikipedia.org/wiki/Computer_vision_syndrome"&gt;Computer Vision Syndrome&lt;/a&gt; though.  I was hoping the only cure was six months sipping &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;mai&lt;/span&gt; &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;tai's&lt;/span&gt; on the beach or six months of intensive &lt;a href="http://www.easports.com/madden07/"&gt;Madden&lt;/a&gt; practice.  Sadly, all I have to do is look out the window and stare at the neighbors tree every twenty minutes.  Adjusting the brightness on the monitor helped a lot too, as did dimming the overhead lights.  Since I am sure a lot of people reading this have the same problem, &lt;a href="http://www.allaboutvision.com/cvs/irritated.htm"&gt;here&lt;/a&gt; are some other things you can do that help a lot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On another note, I am wondering why we can't replace &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;optometrists&lt;/span&gt; with robots.  Their job requires minimal logic.  I can't believe that a human with 22 years of education is &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;necessary&lt;/span&gt; for "&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;ok&lt;/span&gt; which looks better number one or number two....number three or number four".  Also with good software we could randomize the letters that they have you read.  "Of course I can tell you what the bottom row says, I just read it fine with my right eye".   I am sure I could right friendlier software too, after the doctor practically yelled at my girlfriend for closing a door I felt like reading the bottom row "f u c k y o u".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6952433329712812835?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6952433329712812835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6952433329712812835' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6952433329712812835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6952433329712812835'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/computer-vision-syndrome.html' title='Computer Vision Syndrome'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-913563235533087805</id><published>2007-01-20T20:33:00.000-05:00</published><updated>2007-01-20T20:36:41.851-05:00</updated><title type='text'>Screw Beckham</title><content type='html'>If we are going to bring over anything from Europe, can it please be &lt;a href="http://youtube.com/watch?v=DFgGIuWKHug"&gt;handball&lt;/a&gt;?  How could this sport not be popular in the US?  It certainly couldn't do any worse than MLS or the WNBA....or hockey for that matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-913563235533087805?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/913563235533087805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=913563235533087805' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/913563235533087805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/913563235533087805'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/screw-beckham.html' title='Screw Beckham'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2511188901621460006</id><published>2007-01-18T14:44:00.000-05:00</published><updated>2007-01-18T14:53:35.033-05:00</updated><title type='text'>A long strange trip</title><content type='html'>Talking this weekend to someone about people forgetting to attach their resumes to emails reminded me of my first patch to mono.   It only took me three tries to get the email right:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://lists.ximian.com/pipermail/mono-list/2002-October/009198.html"&gt;First&lt;/a&gt;, I send the patch using the wrong email address.  Also note how I didn't start a new message, I replied to someone else and just changed the subject line.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.ximian.com/pipermail/mono-list/2002-October/009193.html"&gt;Second&lt;/a&gt;, I get the email address right, but forget the attachment.  Ugh, I even used the happy hacking send off.  How lame is that? Especially considering the insignificance of this patch.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.ximian.com/pipermail/mono-list/2002-October/009195.html"&gt;Third try&lt;/a&gt;, I finally get the thing attached and sent.  However I over compensate for my embarrassment by using the little smiley with the tongue hanging out :-)~.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2511188901621460006?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2511188901621460006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2511188901621460006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2511188901621460006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2511188901621460006'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/long-strange-trip.html' title='A long strange trip'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2112967009370366182</id><published>2007-01-18T09:35:00.000-05:00</published><updated>2007-01-18T10:47:32.998-05:00</updated><title type='text'>Is it just me?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4wtItLnZ3X0/Ra-GB5eG7hI/AAAAAAAAAAk/Kn9FfQWSQ-Q/s1600-h/apple-sticker.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_4wtItLnZ3X0/Ra-GB5eG7hI/AAAAAAAAAAk/Kn9FfQWSQ-Q/s320/apple-sticker.jpg" alt="" id="BLOGGER_PHOTO_ID_5021379476706487826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Or are these damn stickers getting to be impossible to get off of apples?   I'd say I wind up eating the sticker like 80% of the time now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; Apparently this is a &lt;a href="http://select.nytimes.com/gst/abstract.html?res=F10E12FF3C580C7A8DDDAE0894DD404482"&gt;solved problem&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2112967009370366182?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2112967009370366182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2112967009370366182' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2112967009370366182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2112967009370366182'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/is-it-just-me.html' title='Is it just me?'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4wtItLnZ3X0/Ra-GB5eG7hI/AAAAAAAAAAk/Kn9FfQWSQ-Q/s72-c/apple-sticker.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-6728823509934843215</id><published>2007-01-08T16:24:00.000-05:00</published><updated>2007-01-08T16:26:37.733-05:00</updated><title type='text'>Images in the RichTextBox</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4wtItLnZ3X0/RaK2oLC4pHI/AAAAAAAAAAY/tQfQcOd4SSg/s1600-h/Screenshot-Document+-+WordPad.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_4wtItLnZ3X0/RaK2oLC4pHI/AAAAAAAAAAY/tQfQcOd4SSg/s320/Screenshot-Document+-+WordPad.png" alt="" id="BLOGGER_PHOTO_ID_5017773736120067186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This probably isn't the most important missing feature on the Rich Text Box TODO list, but I implemented it this weekend / today to test some refactoring work that I have been doing to make some of the other missing RTF features more implementable.  Images still need a little more work and testing before I can check in.  After that I am hoping I can do tables pretty easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-6728823509934843215?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/6728823509934843215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=6728823509934843215' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6728823509934843215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/6728823509934843215'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/images-in-richtextbox.html' title='Images in the RichTextBox'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4wtItLnZ3X0/RaK2oLC4pHI/AAAAAAAAAAY/tQfQcOd4SSg/s72-c/Screenshot-Document+-+WordPad.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-3854146993795290502</id><published>2007-01-04T12:41:00.000-05:00</published><updated>2007-01-04T12:48:54.929-05:00</updated><title type='text'>ASCII Art in RTB</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4wtItLnZ3X0/RZ08dTtZUnI/AAAAAAAAAAM/YamF6PM6nBg/s1600-h/Screenshot-richtext.rtf+-+WordPad.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_4wtItLnZ3X0/RZ08dTtZUnI/AAAAAAAAAAM/YamF6PM6nBg/s320/Screenshot-richtext.rtf+-+WordPad.png" alt="" id="BLOGGER_PHOTO_ID_5016232034165150322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A special xmas gift for &lt;a href="http://primates.ximian.com/%7Emkestner/weblog/index.php"&gt;mike&lt;/a&gt;.  Curtesy of &lt;a href="http://www.chris.com/ASCII/"&gt;chris.com's ASCII Art collection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyways, my theory that ASCII Art would be a perfect rich text box test was horribly flawed, since ASCII art doesn't use any rich text features, and well only uses ASCII. &lt;br /&gt;&lt;br /&gt;So I've spent all morning testing the rich text box by reading people's resume's.  I can't believe how many former (and current) Novell employee's I've run across.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-3854146993795290502?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/3854146993795290502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=3854146993795290502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3854146993795290502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/3854146993795290502'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/ascii-art-in-rtb.html' title='ASCII Art in RTB'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4wtItLnZ3X0/RZ08dTtZUnI/AAAAAAAAAAM/YamF6PM6nBg/s72-c/Screenshot-richtext.rtf+-+WordPad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-266861052161172692</id><published>2007-01-03T10:38:00.000-05:00</published><updated>2007-01-03T10:39:09.466-05:00</updated><title type='text'>Good things in winforms</title><content type='html'>I was planning on writing an entry on how much I hated the winforms API, and how stupid parts of it were.  But then when I was fixing a bug in textcontrol this morning, I found myself copying a pattern in Control, and realized, there are a few nice patterns in winforms.  Here are my top &lt;span style="text-decoration: line-through;"&gt;five&lt;/span&gt; two.&lt;br /&gt;&lt;br /&gt;Oh and please, I doubt any of these are truly original to winforms, so please no one email me saying "STEVE JOBS INVENTED DAT!!!1"&lt;br /&gt;&lt;br /&gt;A couple of design patterns in winforms that I like:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Suspend/ResumeLayout.  The inspiration for this entry.  Very simple, if you don't want something done during a block of code, you suspend it, when you are done, you resume it. Like setting a dont_do_this flag, but better, since multiple methods can call it, and methods can't "accidently" unset it. In things like the textcontrol, it keeps track of what needs to be recalculated when you Resume so we don't have to recalculate the entire document.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;BoundsSpecified.  OK, this isn't that unique, but seriously, what is nowadays?  I copied this in textcontrol, so when you set formatting on a tag of text you now do this (note all this is internal) document.FormatText (start, end, font, front_color, back_color, FormatSpecified.Font | FormatSpecified.BackColor);  Nice because it allows you to avoid duplication, without adding argument weirdness rules like "pass Color.Empty for the front color if you don't want it to be modified".&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-266861052161172692?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/266861052161172692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=266861052161172692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/266861052161172692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/266861052161172692'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2007/01/good-things-in-winforms.html' title='Good things in winforms'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-2627635416692737143</id><published>2006-12-30T21:50:00.000-05:00</published><updated>2006-12-30T21:57:11.299-05:00</updated><title type='text'>Chicken Cordon Bleu</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/132/339162507_e26368b490.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://farm1.static.flickr.com/132/339162507_e26368b490.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;One of my all time favorite foods.  I never had any idea how it was made though. &lt;br /&gt;&lt;br /&gt;Until today I thought there was some complex cordon bleu machine that wrapped chicken around ham.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://cooking101.abccook.com/"&gt;cooking 101&lt;/a&gt; I finally learned how to make it myself (you cut a pouch in the chicken, there is no special machine involved).&lt;br /&gt;&lt;br /&gt;Sadly I have not even started &lt;a href="http://library.thinkquest.org/28146/Intro.html"&gt;photography 101&lt;/a&gt; yet, so the pictures didn't turn out too well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-2627635416692737143?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/2627635416692737143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=2627635416692737143' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2627635416692737143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/2627635416692737143'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2006/12/chicken-cordon-bleu.html' title='Chicken Cordon Bleu'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-5865240859907008267</id><published>2006-12-29T18:47:00.000-05:00</published><updated>2006-12-29T19:07:24.994-05:00</updated><title type='text'>Wireless help</title><content type='html'>&lt;a href="http://www.amazon.com/Netgear-Powerline-Ethernet-Adapter-XE102US/dp/B0002IHP58/sr=1-1/qid=1167436480/ref=pd_bbs_sr_1/002-0337051-3040070?ie=UTF8&amp;s=electronics"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 150px;" src="http://ec2.images-amazon.com/images/P/B0002IHP58.01._AA280_SCLZZZZZZZ_.jpg" alt="" border="0" /&gt;&lt;/a&gt;Does anyone have any experience with powerline ethernet adapters?  My main desktop is "stranded" upstairs far away from the wireless router, and the 50 ft ethernet cable running through half the house is just not the worlds slickest solution.&lt;br /&gt;&lt;br /&gt;This evening I tried a wireless card for my desktop but it is failing miserably.  I don't know if its the card, the walls the wireless has to go through, or the ndiswrapper.  Whatever it is, this isn't working.   So I am hoping that the powerline adapter will be a better solution for me.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/Netgear-Mini-Print-Server-PS121/dp/B0001BXVA4/sr=8-2/qid=1167436813/ref=pd_bbs_2/002-0337051-3040070?ie=UTF8&amp;s=electronics"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 150px;" src="http://ec2.images-amazon.com/images/P/B0001BXVA4.01._AA280_SCLZZZZZZZ_V40626085_.jpg" alt="" border="0" /&gt;&lt;/a&gt;At the same time I would like to get my printer onto a print server.  I was dumb enough to buy a printer that does not work with Linux.  I think my exact words were "naw, it'll be fine, everything works with linux now".  So I am thinking that if I get one of these print server things the printer will show up on the network as a samba server, right?  My only windows machine is a laptop, so I don't really want to turn it into a dedicated print server.&lt;br /&gt;&lt;br /&gt;I finally have a blog that allows comments, so hopefully someone out there can help me out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-5865240859907008267?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/5865240859907008267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=5865240859907008267' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5865240859907008267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/5865240859907008267'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2006/12/wireless-printer-hubs.html' title='Wireless help'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7493166836812701951</id><published>2006-12-29T13:55:00.000-05:00</published><updated>2006-12-29T16:05:29.237-05:00</updated><title type='text'>My links roundup</title><content type='html'>This is a roundup of all my various links:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://flickr.com/photos/jacksonh/"&gt;My &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;flickr&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; -  Pictures of me, my girlfriend, my house, and (most &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;prominently&lt;/span&gt;) my dog.&lt;br /&gt;- &lt;a href="http://www.43things.com/person/jacksonh"&gt;My 43 things&lt;/a&gt; -   This is a list of goals, mainly just silly things I would like to do, not big important goals like "Become CEO of &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Novell&lt;/span&gt;&lt;/span&gt;" or "End world Hunger"&lt;br /&gt;- &lt;a href="http://www.amazon.com/gp/registry/wishlist/FIC6XFMJDDAY/ref=wl_web/"&gt;My Amazon &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Wishlist&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; - Since I am getting a constant barrage of "Your blog is so great, I want to buy you something" emails.&lt;br /&gt;- &lt;a href="http://bugzilla.ximian.com/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;bug_status=NEEDINFO&amp;amp;email1=jackson%40ximian.com&amp;emailtype1=exact&amp;amp;emailassigned_to1=1&amp;amp;emailreporter1=1"&gt;My Bugs&lt;/a&gt; - boo!&lt;br /&gt;- &lt;a href="http://feeds.feedburner.com/JacksonsActivityLog"&gt;My Feed&lt;/a&gt; - This is the preferred way of getting a feed for my blog.&lt;br /&gt;- &lt;a href="http://cia.navi.cx/stats/author/jackson"&gt;My work&lt;/a&gt; - Keep track of whether or not I am working hard&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7493166836812701951?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7493166836812701951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7493166836812701951' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7493166836812701951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7493166836812701951'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2006/12/my-links-roundup.html' title='My links roundup'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-7787827933802606688</id><published>2006-12-29T13:17:00.000-05:00</published><updated>2006-12-29T14:27:26.128-05:00</updated><title type='text'>Reading</title><content type='html'>I just took a week off from work and started reading these books:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034/sr=1-1/qid=1167420277/ref=sr_1_1/002-0337051-3040070?ie=UTF8&amp;s=books"&gt;How to Win Friends and Influence People&lt;/a&gt;:  Silly title, but a good read.  World would be a better place if everyone read this book.  If I had to summarize Carnegie's philosphy it would be "Don't be a dick.", sadly most people don't believe in this philosophy.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.amazon.com/Six-Armies-Normandy-Liberation-Revised/dp/0140235426/sr=8-3/qid=1167417213/ref=sr_1_3/002-0337051-3040070?ie=UTF8&amp;s=books"&gt;Six Armies in  Normandy&lt;/a&gt;: Interesting to see how much of the way WWII was fought was due to political concessions rather than military strategy.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.amazon.com/Iraq-War-Offensive-Insurgent-Aftermath/dp/1400079209/sr=1-11/qid=1167417316/ref=sr_1_11/002-0337051-3040070?ie=UTF8&amp;amp;s=books"&gt;The Iraq War: The Military Offensive, from Victory in 21 Days to the Insurgent Aftermath&lt;/a&gt;: I am only a chapter or so into this, but it is interesting to see why the Iraqi war is unlike any other conventional war (short version: no one cares).&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.amazon.com/Science-Practice-Strength-Training-Second/dp/0736056289/sr=1-1/qid=1167417431/ref=sr_1_1/002-0337051-3040070?ie=UTF8&amp;amp;s=books"&gt;Science and Practice of Strength Training&lt;/a&gt;: This is written by Vladimir &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Zatsiorsky&lt;/span&gt;, a pretty well noted Russian Strength and Conditioning coach.  The Russians have been way ahead of the US in strength training since the cold war, mainly because they were the first to really treat the topic as a science, and because of some poor research in the early US program.  A lot of this information is eye opening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-7787827933802606688?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/7787827933802606688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=7787827933802606688' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7787827933802606688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/7787827933802606688'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2006/12/reading.html' title='Reading'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4677537836173626009.post-574949684641569277</id><published>2006-12-29T13:02:00.000-05:00</published><updated>2006-12-29T13:11:24.015-05:00</updated><title type='text'>A (hopefully) more reliable blog</title><content type='html'>Updating my blog on primates  involved jumping through multiple hurdles.   I would have to write the entry, name the file correctly, &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;login&lt;/span&gt; to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;VPN&lt;/span&gt;, run &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;lameblog&lt;/span&gt;, and push the data to primates.  And this was the simplest scenario.  Usually I would also have to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;scp&lt;/span&gt; images to primates, and then &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;fixup&lt;/span&gt; URLs.  I know all this doesn't sound like an insurmountable amount of work, but the fact that I work from 3 different machines, and would like to blog from all of those machines, made things even more difficult (I had to &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;rsync&lt;/span&gt; all the files to each machine).  Finally the kicker is that I can't even get the &lt;span onclick="BLOG_clickHandler(this)" class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;VPN&lt;/span&gt; working on my main machine anymore.&lt;br /&gt;&lt;br /&gt;So here I am.  Hopefully this will be a better blogging solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4677537836173626009-574949684641569277?l=jacksonito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacksonito.blogspot.com/feeds/574949684641569277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4677537836173626009&amp;postID=574949684641569277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/574949684641569277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4677537836173626009/posts/default/574949684641569277'/><link rel='alternate' type='text/html' href='http://jacksonito.blogspot.com/2006/12/hopefully-more-reliable-blog.html' title='A (hopefully) more reliable blog'/><author><name>jacksonh</name><uri>http://www.blogger.com/profile/06579239848879006903</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
