<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Charles Strahan</title>
 
 <link href="http://cstrahan.com/" />
 <updated>2011-11-28T01:03:05-08:00</updated>
 <id>http://cstrahan.com/</id>
 <author>
   <name>Charles Strahan</name>
   <email>charles.c.strahan@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/cstrahan" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="cstrahan" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>No Sound from Headphones on Ubuntu</title>
   <link href="http://cstrahan.com/2011/09/19/ubuntu-sound-problem.html" />
   <updated>2011-09-19T04:34:14-07:00</updated>
   <id>75fdf3b0c4d0012e53d1001bfc9c480a</id>
   <content type="html">&lt;p&gt;On my Compaq Presario (Model: SR5152NX, Soundcard: ALC888), the audio wasn&amp;#8217;t working quite right; when I plugged my headphones in, the audio came out of both the speakers and the heaphones. Here&amp;#8217;s how I fixed it.&lt;/p&gt;
&lt;h2&gt;Finding the Sound Card Model&lt;/h2&gt;
&lt;p&gt;Issue the following command in a terminal:&lt;/p&gt;
&lt;pre class="console"&gt;
head -n 1 /proc/asound/card0/codec*
&lt;/pre&gt;
&lt;p&gt;On my Compaq, that prints &lt;strong&gt;&amp;#8220;Codec: Realtek ALC888&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Find the Correct Model Parameter&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;re going to modify &lt;code&gt;/etc/modprobe.d/alsa-base.conf&lt;/code&gt; to specify the sound card model, but first we need to know what model parameter we need. Look through the documentation here to find your model:&lt;/p&gt;
&lt;pre class="console"&gt;
zless /usr/share/doc/alsa-base/driver/HD-Audio-Models.txt.gz
&lt;/pre&gt;
&lt;p&gt;You&amp;#8217;ll find a number of possible settings &amp;#8211; you&amp;#8217;ll need to pick the closest setting to your hardware. You may need to try a couple by trial and error before you get it just right.&lt;/p&gt;
&lt;p&gt;I looked under the &lt;strong&gt;ALC882/883/885/888/889&lt;/strong&gt; section and tried &lt;strong&gt;3stack-6ch&lt;/strong&gt;, as I have three ports in the back, and 6 channels per my hardware specs. Unfortunately, that wasn&amp;#8217;t quite right, so I tried &lt;strong&gt;3stack-hp&lt;/strong&gt; instead, which did the trick.&lt;/p&gt;
&lt;h2&gt;Tweak alsa-base.conf&lt;/h2&gt;
&lt;p&gt;We must now teak &lt;code&gt;alsa-base.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="console"&gt;
# Edit the config file:
sudo vim /etc/modprobe.d/alsa-base.conf

# Add the following line to the bottom:
# options snd-hda-intel model=3stack-hp
&lt;/pre&gt;
&lt;p&gt;Et voilã , audio works flawlessly now.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Austin Code Camp 2011</title>
   <link href="http://cstrahan.com/2011/09/12/austin-code-camp-2011.html" />
   <updated>2011-09-12T23:16:16-07:00</updated>
   <id>0ca7bb00bfed012e53d0001bfc9c480a</id>
   <content type="html">&lt;p&gt;It was a pleasure to both attend and speak at &lt;a href="http://adnug.github.com/code-camp-2011/"&gt;Austin Code Camp&lt;/a&gt; this year. I couldn&amp;#8217;t &lt;em&gt;possibly&lt;/em&gt; have had a better response to my first talk, &lt;strong&gt;&amp;#8220;Seven Soft Skills for Super Sexy Salaries&amp;#8221;&lt;/strong&gt;! If you attended my first talk, thank you so much for all of the positive feedback, and all of the great questions!&lt;/p&gt;
&lt;h2&gt;Whoops!&lt;/h2&gt;
&lt;p&gt;Unfortunately, I experienced some technical difficulties whilst giving my second talk, &lt;strong&gt;&amp;#8220;Let&amp;#8217;s create a programming language!&amp;#8221;&lt;/strong&gt;. Because of that, I will be recording and uploading the presentation over the next couple days.&lt;/p&gt;
&lt;p&gt;For the curious, ANTLRWorks was invoking &lt;code&gt;javac&lt;/code&gt;, which in turn failed with &lt;code&gt;javac: file not found: &amp;lt;path-to-file&amp;gt;&lt;/code&gt;. Of course, the file that &lt;code&gt;javac&lt;/code&gt; was complaining about was generated &lt;em&gt;by&lt;/em&gt; ANTLRWorks and &lt;em&gt;was&lt;/em&gt; there, in plain sight. Something was utterly confused. I rebooted and, like magic, ANTLRWorks was working fine&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note to self:&lt;/strong&gt; when preparing a presentation, use the same computer you plan to bring with you &amp;#8211; crazy shit happens!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Ubuntu Experience</title>
   <link href="http://cstrahan.com/2011/07/31/installing-ubuntu.html" />
   <updated>2011-07-31T16:07:19-07:00</updated>
   <id>001003709de7012e53cf001bfc9c480a</id>
   <content type="html">&lt;p&gt;&lt;img src="/images/2011-07-31-ubuntu-screenshot.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here are the notes of my attempt to create the ultimate 64-bit Ubuntu 11.04 dev machine, from fresh install to &amp;#8220;finish&amp;#8221; (as if the tweaking is ever trully finished).&lt;/p&gt;
&lt;h2&gt;Get Wireless Working&lt;/h2&gt;
&lt;p&gt;Just after I installed Ubuntu, I noticed that my wireless was acting a little slow. After a little probing, it turned out to be a driver conflict with the default Ralink &lt;span class="caps"&gt;USB&lt;/span&gt; drivers. A quick &lt;code&gt;lsmod | grep rt&lt;/code&gt; showed that I had rt2870sta running (which was fine), and then a few other drivers that needed to be blacklisted. I had to append the following to &lt;code&gt;/etc/modeprobe.d/blacklist.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="console"&gt;
# Get wireless working
blacklist rt2800usb
blacklist rt2800lib
blacklist rt2x00usb
blacklist rt2x00lib
&lt;/pre&gt;
&lt;p&gt;Everything was pretty snappy after rebooting.&lt;/p&gt;
&lt;h2&gt;UI Tweaks / Hardware Drivers / etc&lt;/h2&gt;
&lt;p&gt;I mostly followed these two articles immediately after installing Ubuntu:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.unixmen.com/linux-tutorials/linux-distributions/linux-distributions4-ubuntu/1540-top-things-to-do-after-installing-ubuntu-1104-natty-narwhal"&gt;Top Things to do after installing Ubuntu 11.04 Natty Narwhal&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.techdrivein.com/2011/04/12-things-i-did-after-installing-new.html"&gt;12 Things I did After Installing New Ubuntu 11.04 Natty Narwhal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;OpenGL &amp;amp; &lt;span class="caps"&gt;SDL&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Some packages for OpenGL/&lt;span class="caps"&gt;SDL&lt;/span&gt; bindings:&lt;/p&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install xorg-dev mesa-common-dev libglu1-mesa-dev \
                       libsdl1.2debian \
                       libsdl1.2debian-alsa \
                       libsdl1.2-dev \
                       libsdl-image1.2 \
                       libsdl-image1.2-dev \
                       libsdl-mixer1.2 \
                       libsdl-mixer1.2-dev \
                       libsdl-net1.2 \
                       libsdl-net1.2-dev \
                       freeglut3 freeglut3-dev \
                       glutg3 glutg3-dev
&lt;/pre&gt;
&lt;h2&gt;Adobe Air &amp;amp; Pandora One&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t know about you, but I can&amp;#8217;t live without &lt;a href="http://www.pandora.com/desktop_app"&gt;Pandora One&lt;/a&gt;. Unfortunately, installing Adobe Air on 64-bit Ubuntu wasn&amp;#8217;t as easy as I had hoped. You &lt;em&gt;can&lt;/em&gt; get it to work with a little finagling though: &lt;a href="http://www.jamesward.com/2010/10/14/install-adobe-air-on-64-bit-ubuntu-10-10/"&gt;Install Adobe &lt;span class="caps"&gt;AIR&lt;/span&gt; on 64-bit Ubuntu 10.10&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Exuberant CTags&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install exuberant-ctags
&lt;/pre&gt;
&lt;h2&gt;(D)&lt;span class="caps"&gt;VCS&lt;/span&gt;&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install subversion git-core mercurial
&lt;/pre&gt;
&lt;h2&gt;R&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install r-base r-base-dev
&lt;/pre&gt;
&lt;h2&gt;Java &lt;span class="caps"&gt;JRE&lt;/span&gt; &amp;amp; &lt;span class="caps"&gt;JDK&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;See &lt;a href="http://www.ubuntugeek.com/how-to-install-java-runtime-environment-jre-in-ubuntu.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Scala&lt;/h2&gt;
&lt;p&gt;See &lt;a href="http://srirangan.net/2011-04-setting-up-scala-dev-environment-on-ubuntu-11-04"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Haskell&lt;/h2&gt;
&lt;p&gt;You should be able to &lt;code&gt;sudo apt-get install haskell-platform&lt;/code&gt;, but there was a bug in the package that caused apt-get to fail. Until it gets fixed, take a look &lt;a href="http://askubuntu.com/questions/44709/how-can-i-install-haskell-platform"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what I did:&lt;/p&gt;
&lt;pre class="console"&gt;
$ sudo add-apt-repository ppa:brcha/ppa
$ sudo apt-get update
$ sudo apt-get install haskell-platform&lt;/pre&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;h2&gt;Ruby&lt;/h2&gt;
&lt;p&gt;I initially installed Ruby via &lt;code&gt;sudo apt-get install ruby&lt;/code&gt;, but quickly removed the package in favor of letting &lt;a href="https://rvm.beginrescueend.com/"&gt;&lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/a&gt; handle my rubies through and through. If you&amp;#8217;re not familiar with &lt;span class="caps"&gt;RVM&lt;/span&gt;, give this a good read: &lt;a href="http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you/"&gt;Ubuntu, Ruby, &lt;span class="caps"&gt;RVM&lt;/span&gt;, Rails, and You&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;span class="caps"&gt;GNU&lt;/span&gt; Smalltalk&lt;/h2&gt;
&lt;p&gt;Until Ubuntu starts packaging &lt;code&gt;gst&lt;/code&gt; again, you&amp;#8217;ll need to compile it yourself. Grab the latest version from &lt;a href="http://smalltalk.gnu.org/"&gt;here&lt;/a&gt; (at the time of writing, it was v3.2.4).&lt;/p&gt;
&lt;p&gt;To compile:&lt;/p&gt;
&lt;pre class="console"&gt;
# Prereqs:
$ sudo apt-get install tcl tcl-dev tk tk-dev

# Compile:
$ wget ftp://ftp.gnu.org/gnu/smalltalk/smalltalk-3.2.4.tar.gz
$ tar xzf smalltalk-3.2.4.tar.gz
$ cd smalltalk-3.2.4
$ autoreconf -vi
$ ./configure

# If ./configure outputs
#   "checking whether to install &amp;lt;SOME_PACKAGE_HERE&amp;gt;... no"
# you'll probably want to see which headers couldn't be found,
# and apt-get the corresponding library before continuing.

$ make
$ sudo make install
&lt;/pre&gt;
&lt;h2&gt;Squeak Smalltalk&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install squeak-vm
&lt;/pre&gt;
&lt;h2&gt;Racket&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo add-apt-repository ppa:plt/racket
$ sudo apt-get update
$ sudo apt-get install racket
&lt;/pre&gt;
&lt;h2&gt;&lt;span class="caps"&gt;MIT&lt;/span&gt; Scheme&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://blog.thestever.net/2010/04/21/edwin-mit-scheme-on-x86-64-ubuntu-hardy-haron/"&gt;This site&lt;/a&gt; suggests that the following esential and optional packages be installed (respectively):&lt;/p&gt;
&lt;pre class="console"&gt;
$ sudo apt-get install m4 autotools-dev libssl-dev libncurses5-dev libx11-dev libxt-dev libltdl-dev
$ sudo apt-get install libmhash-dev libmcrypt-dev libgdbm-dev libpq-dev libdb-dev
&lt;/pre&gt;
&lt;p&gt;Then download and compile:&lt;/p&gt;
&lt;pre class="console"&gt;
$ wget http://ftp.gnu.org/gnu/mit-scheme/snapshot.pkg/20090107/mit-scheme-c-20090107.tar.gz
$ tar xzf mit-scheme-c-20090107.tar.gz
$ cd mit-scheme-c-20090107/src
$ etc/make-liarc.sh
$ sudo make install
&lt;/pre&gt;
&lt;h2&gt;&lt;span class="caps"&gt;CLISP&lt;/span&gt;&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get instal clisp
&lt;/pre&gt;
&lt;h2&gt;&lt;span class="caps"&gt;SBCL&lt;/span&gt;&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-get instal sbcl
&lt;/pre&gt;
&lt;h2&gt;Erlang&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://gist.github.com/991706"&gt;this gist/script&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;MongoDB&lt;/h2&gt;
&lt;pre class="console"&gt;
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ sudo nano /etc/apt/sources.list
$ echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee --append /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install mongodb-10gen
&lt;/pre&gt;
&lt;h2&gt;Programming Environments&lt;/h2&gt;
&lt;p&gt;I installed Eclipse, Netbeans and Emacs from the Software Center. Vim and IntelliJ &lt;span class="caps"&gt;IDEA&lt;/span&gt; were a little more involved, though.&lt;/p&gt;
&lt;h3&gt;Installing IntelliJ &lt;span class="caps"&gt;IDEA&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;See &lt;a href="http://www.niftyeyeblog.com/intellij-idea-on-ubuntu/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Installing Vim&lt;/h3&gt;
&lt;p&gt;I wanted a decent Vim will all the bells and whistles, including &lt;a href="http://www.vim.org/scripts/script.php?script_id=3025"&gt;Command-T&lt;/a&gt;. Ubuntu has a package for Vim, but it&amp;#8217;s a little flakey with Ruby extensions (it was at the time wrote this, anyway). Here&amp;#8217;s (more or less) everything I needed to get a big fat vim compiled and installed from source.&lt;/p&gt;
&lt;pre class="console"&gt;
# Vim dependencies:
$ sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \
  libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
  libcairo2-dev libx11-dev libxpm-dev libxt-dev

# Language bindings:
$ sudo apt-get install python python-dev lua5.1 luarocks perl libperl5.10

# Compile:
$ hg clone https://vim.googlecode.com/hg/ ~/vim
$ cd ~/vim
$ hg update -C v7-3-154
$ ./configure --with-features=huge \
            --enable-perlinterp --enable-pythoninterp \
            --enable-rubyinterp --enable-gui=gnome2 \
            --disable-largefile \
            --enable-luainterp=dynamic
$ make
$ sudo make install

# If you get "Terminal entry not found in terminfo 'gnome-256color'" in terminal vim,
# you'll want this:
$ sudo apt-get install ncurses-term
&lt;/pre&gt;
&lt;h2&gt;Dotfiles&lt;/h2&gt;
&lt;p&gt;After installing my favorite apps, I needed to get my dotfiles from my Windows box copied over. This presented a bit of a problem, considering how I had my dotfiles stored in git: all files were in the root, which meant that I had to clone the repo directly into my home folder. I settled on creating a dedicated &lt;code&gt;~/.dotfiles&lt;/code&gt; folder to host my dotfiles, each of which would then be symlinked into &lt;code&gt;~/&lt;/code&gt; via a &lt;code&gt;Rakefile&lt;/code&gt;. Whenever I get around to customizing my &lt;code&gt;bash&lt;/code&gt;, I&amp;#8217;ll throw in a script to recursively load my scripts.&lt;/p&gt;
&lt;p&gt;You can take a look at my &lt;code&gt;Rakefile&lt;/code&gt; and dotfiles &lt;a href="https://github.com/cstrahan/dotfiles/"&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mongoid + YAML + Rails = Conflict</title>
   <link href="http://cstrahan.com/2011/05/14/mongoid-yaml-rails-conflict.html" />
   <updated>2011-05-14T18:58:06-07:00</updated>
   <id>efd3392160b3012e8519001fe16c6eb2</id>
   <content type="html">&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;You get the following when you try to run your Rails app with Mongoid:&lt;/p&gt;
&lt;pre class="console"&gt;
db_name must be a string or symbol
C:/Ruby192/lib/ruby/gems/1.9.1/gems/mongo-1.3.1/lib/mongo/util/support.rb:50:in `validate_db_name'
&lt;/pre&gt;
&lt;h2&gt;The Cause&lt;/h2&gt;
&lt;p&gt;You probably have RubyGems v1.5.0, which changes the default yaml parser to &lt;a href="https://github.com/tenderlove/psych"&gt;psych&lt;/a&gt; (as opposed to &lt;a href="http://rubyforge.org/projects/syck/"&gt;syck&lt;/a&gt;), which doesn&amp;#8217;t like &lt;code&gt;:&amp;lt;&amp;lt;&lt;/code&gt; in yaml files.&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;Add the following to the top of your config/environment.rb:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;yaml&amp;#39;&lt;/span&gt; 
&lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yamler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;syck&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#8230; or perhaps you could just tweak your &lt;span class="caps"&gt;YAML&lt;/span&gt; to make psych happy. I don&amp;#8217;t know what-the-hell I&amp;#8217;m doing, so I took the easy way out.&lt;/p&gt;
&lt;p&gt;Feel free to share better alternatives.&lt;/p&gt;
&lt;h2&gt;Credit&lt;/h2&gt;
&lt;p&gt;Thanks go to the chaps on &lt;a href="http://groups.google.com/group/mongoid/browse_thread/thread/9213a17a73d3c422/911f0811bf5b9d79"&gt;this Mongoid forum thread&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Alt.Net Seattle 2011</title>
   <link href="http://cstrahan.com/2011/05/08/altnetseattle.html" />
   <updated>2011-05-08T17:35:42-07:00</updated>
   <id>31d8c5315c02012e8516001fe16c6eb2</id>
   <content type="html">&lt;p&gt;&lt;img src="/images/2011-05-05-altnetseattle-pano-1.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;This year&amp;#8217;s &lt;a href="http://altnet2011.heroku.com/"&gt;Alt.Net Seattle&lt;/a&gt; conference was a blast. I met and mingled with so many bright developers over the short span of four days. The collective passion and energy was absolutely overwhelming.&lt;/p&gt;
&lt;p&gt;Oh, and thank you &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; &amp;amp; &lt;a href="https://www.bookr.net/"&gt;Bookr&lt;/a&gt; for the &lt;a href="https://github.com/blog/850-seattle-redmond-drinkup-on-sat-may-7"&gt;drink-up&lt;/a&gt; &amp;#8211; you guys rock!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Vim Tweaks on Windows</title>
   <link href="http://cstrahan.com/2011/04/30/vim-windows.html" />
   <updated>2011-04-30T23:12:14-07:00</updated>
   <id>1e4ecae055d7012e8515001fe16c6eb2</id>
   <content type="html">&lt;p&gt;To be frank, getting &lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt; and Windows to play nice is a bit of a pain in the ass. Here are some tips and tricks to get the most out of vim on Windows.&lt;/p&gt;
&lt;h2&gt;Power Tools&lt;/h2&gt;
&lt;p&gt;If you want a pretty slick setup without too much hassle, check out &lt;a href="http://akitaonrails.com/"&gt;Fabio Akita&lt;/a&gt; &amp;#8216;s &lt;a href="https://github.com/akitaonrails/vimfiles"&gt;vimfiles&lt;/a&gt;. Here&amp;#8217;s a list of some of the bad-ass plugins that I find particularly useful (full list can be found on the GitHub repo):&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;fugitive&lt;/li&gt;
	&lt;li&gt;Command-T&lt;/li&gt;
	&lt;li&gt;surround&lt;/li&gt;
	&lt;li&gt;rails&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Make it Sexy&lt;/h2&gt;
&lt;p&gt;I absolutely &lt;em&gt;love&lt;/em&gt; the &lt;a href="http://ethanschoonover.com/solarized"&gt;Solarized&lt;/a&gt; theme. If you use Akita&amp;#8217;s vimfiles, you already have it installed (courtesy of yours truly).&lt;/p&gt;
&lt;p&gt;Here are a couple other cosmetic changes from &lt;a href="https://github.com/cstrahan/dotfiles/blob/master/.vimrc"&gt;my .vimrc&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="vim"&gt;&lt;span class="k"&gt;if&lt;/span&gt; has&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gui_win32&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; has&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gui_win32s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;guifont&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;PragmataPro:h10
  &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;background&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dark&lt;/span&gt;
  &lt;span class="k"&gt;colorscheme&lt;/span&gt; solarized
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="c"&gt;&amp;quot; Taggle Solarized light/dark background using F5 key&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; togglebg#map&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;F5&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;&amp;quot; No space between lines&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;linespace&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;

&lt;span class="c"&gt;&amp;quot; Make csharp code use 4 spaces for tabs&lt;/span&gt;
autocmd &lt;span class="nb"&gt;FileType&lt;/span&gt; cs &lt;span class="k"&gt;setlocal&lt;/span&gt; &lt;span class="nb"&gt;expandtab&lt;/span&gt; &lt;span class="nb"&gt;shiftwidth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nb"&gt;softtabstop&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you don&amp;#8217;t already own a copy, go buy &lt;a href="http://www.fsd.it/fonts/pragmatapro.htm"&gt;PragmataPro&lt;/a&gt; &amp;#8211; thine eyes shalt thank thee.&lt;/p&gt;
&lt;h2&gt;Visual Studio&lt;/h2&gt;
&lt;p&gt;Add gVim as an external tool. Go to &lt;code&gt;Tools &amp;gt; External Tools &amp;gt; Add&lt;/code&gt; and plug in the following:&lt;/p&gt;
&lt;pre class="console"&gt;
Title: &amp;amp;Vim
Command: C:\Program Files (x86)\Vim\vim73\gvim.exe
Arguments: --servername VimualStudio --remote-silent +"call cursor($(CurLine),$(CurCol))" $(ItemPath)
Initial directory: $(SolutionDir)
&lt;/pre&gt;
&lt;p&gt;By specifying &lt;code&gt;--servername VimualStudio&lt;/code&gt;, you&amp;#8217;ll have a dedicated vim process just for Visual Studio.&lt;/p&gt;
&lt;h2&gt;Fixing Problems&lt;/h2&gt;
&lt;p&gt;Here are some problems I came across. If you have any of the following problems, see if the given solution will work for you.&lt;/p&gt;
&lt;h3&gt;#1 &amp;#8211; CommandT::&lt;span class="caps"&gt;VIM&lt;/span&gt; Conflicts with ::&lt;span class="caps"&gt;VIM&lt;/span&gt;&lt;/h3&gt;
&lt;pre class="console"&gt;
line 74
NoMethodError: undefined method `command' for CommandT::VIM:Module
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; See &lt;a href="https://wincent.com/issues/1752"&gt;this page&lt;/a&gt; for help.&lt;/p&gt;
&lt;h3&gt;#2 &amp;#8211; CommandT Crashes Vim&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Following the &lt;a href="https://wincent.com/issues/1647"&gt;advice here&lt;/a&gt; solved my problem. It appears that there&amp;#8217;s a bug in vim that was patched as of version 7.3.088.&lt;/p&gt;
&lt;p&gt;You may also have to build CommandT. To do so, you&amp;#8217;ll need to have the Ruby DevKit installed. Then, enter the following in shell (change the paths to reflect your system):&lt;/p&gt;
&lt;pre class="console"&gt;
c:\RubyDevKit\devkitvars.bat
cd C:\Users\Charles\vimfiles\bundle\Command-T\ruby\command-t
ruby extconf.rb
make
&lt;/pre&gt;
&lt;h3&gt;#3 &amp;#8211; Fugitive&amp;#8217;s GDiff Fails&lt;/h3&gt;
&lt;pre class="console"&gt;
Error detected while processing function &amp;lt;SNR&amp;gt;12_BufReadIndexFile..&amp;lt;SNR&amp;gt;12_ReplaceCmd:
line  26:
E302: Could not rename swap file
Press ENTER or type command to continue
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; One of the answers on &lt;a href="http://stackoverflow.com/questions/2932399/error-using-the-gdiff-command-of-fugitive-vim-using-gvim-for-windows-and-msys-gi"&gt;this StackOverflow question&lt;/a&gt; should do the trick.&lt;/p&gt;
&lt;h3&gt;#4 &amp;#8211; Mysterious Blank Screen&lt;/h3&gt;
&lt;p&gt;If you have a blank screen until you press a key, vim probably ran into a problem and displayed a warning. In my case, I needed to tell CSApprox to shut up:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="vim"&gt;&lt;span class="c"&gt;&amp;quot; Put this at the very top of your .vimrc:&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; g:CSApprox_verbose_level&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Anything Else?&lt;/h2&gt;
&lt;p&gt;If there&amp;#8217;s something that you think I&amp;#8217;m missing, let me know!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>From Wordpress to Jekyll</title>
   <link href="http://cstrahan.com/2011/04/20/just-installed-jekyll.html" />
   <updated>2011-04-20T22:00:00-07:00</updated>
   <id>8ec4b3304e1a012e850c001fe16c6eb2</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve finally decided to ditch &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; for &lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;. I &lt;em&gt;really&lt;/em&gt; don&amp;#8217;t see the point in using a full-fledged blogging platform if you&amp;#8217;re seasoned developer &amp;#8212; there&amp;#8217;s just &lt;em&gt;way&lt;/em&gt; too much bloat to sift through.&lt;/p&gt;
&lt;h2&gt;How is this any better?&lt;/h2&gt;
&lt;p&gt;What do I like about it? Well, it&amp;#8217;s pretty easy to get started (aside from seting up &lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt; on Windows)&lt;sup class="footnote"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, and all of my posts are contained in &lt;a href="http://redcloth.org/textile"&gt;textile formatted&lt;/a&gt; files &amp;#8212; for example, this &lt;a href="https://github.com/cstrahan/cstrahan.github.com/raw/master/_posts/2011-04-20-just-installed-jekyll.textile"&gt;here&lt;/a&gt; is the textile file for this very page. Of course, all of my posts are version controlled using &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, and my site is &lt;a href="http://pages.github.com/#using_jekyll_for_complex_layouts"&gt;built and hosted on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Dude, I&amp;#8217;m sold!&lt;/h2&gt;
&lt;p&gt;Sweet! Here are some tips for you &lt;a href="https://github.com/mojombo/jekyll/wiki"&gt;after you&amp;#8217;ve installed Jekyll&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Autogenerate New Posts&lt;/h3&gt;
&lt;p&gt;Make a &lt;a href="https://github.com/cstrahan/cstrahan.github.com/blob/master/tasks/mkpost.rake"&gt;rake task&lt;/a&gt; to generate new posts, and include a unique identifier. This will be used by Disqus and the&lt;/p&gt;
&lt;h3&gt;Configure an Atom Feed&lt;/h3&gt;
&lt;p&gt;Checkout &lt;a href="https://github.com/cstrahan/cstrahan.github.com/raw/master/atom.xml"&gt;my atom feed&lt;/a&gt; for inspiration. Note the use of &lt;code&gt;post.uuid&lt;/code&gt;, which we auto-generated with our rake task.  I use &lt;a href="http://www.feedburner.com/"&gt;FeedBurner&lt;/a&gt; to keep track of my following.&lt;/p&gt;
&lt;h3&gt;Use Disqus&lt;/h3&gt;
&lt;p&gt;Use &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt; for your comments and be sure to use your posts&amp;#8217; &lt;code&gt;uuid&lt;/code&gt;, just in case your URLs change (the &lt;span class="caps"&gt;UUID&lt;/span&gt; will assosciate your posts with your comments). You can check out my post template &lt;a href="https://github.com/cstrahan/cstrahan.github.com/blob/master/_layouts/post.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; You&amp;#8217;ll find a guide &lt;a href="http://skim.la/2010/02/14/how-to-run-jekyll-pygmentize-on-windows/"&gt;here&lt;/a&gt; for getting Pygments installed on Windows.&lt;/p&gt;
&lt;p class="footnote" id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; &lt;span class="caps"&gt;BTW&lt;/span&gt;, &lt;code&gt;Jekyll 0.11.0&lt;/code&gt; has &lt;a href="https://github.com/rtomayko/posix-spawn/issues/17"&gt;some trouble with textile on Windows&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Adventures in .NET - Aspect Oriented Programming</title>
   <link href="http://cstrahan.com/2010/09/29/adventures-in-dotnet-aop.html" />
   <updated>2010-09-29T22:20:54-07:00</updated>
   <id>949aa9b07087012e8523001fe16c6eb2</id>
   <content type="html">&lt;h2&gt;About this Series&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;Adventures in .&lt;span class="caps"&gt;NET&lt;/span&gt;&amp;#8221;&lt;/strong&gt; is a series of articles that aim to expose .&lt;span class="caps"&gt;NET&lt;/span&gt; developers to powerful techniques and concepts to empower them to develop software more productively. The concepts that I present in this series have been gleaned from years of designing and implementing software solutions, and I hope to save you hours of frustration by helping you avoid the pitfalls I experienced through the application of these powerful patterns and practices. While I won&amp;#8217;t dive too deep into each subject, I do hope to inspire you to both learn and incorporate these technologies into your work.&lt;/p&gt;
&lt;p&gt;All source code for this series can be found on GitHub here: &lt;br /&gt;
&lt;a href="http://github.com/cstrahan/adventures-in-dotnet"&gt;http://github.com/cstrahan/adventures-in-dotnet&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;As software developers, it is a well known (not to mention begrudging) fact that we spend most of our time maintaining code; anything that we can do to minimize the amount of time spent in &amp;#8220;maintenance mode&amp;#8221; is a major boon to both our productivity and our esteem, and that entails writing less code in the first place. Unfortunately, there is another well known fact that conspires against our productivity; our codebases tend to be littered with eerily similar code that we just can&amp;#8217;t seem to abstract out. An excellent example of this problem is present in any class that implements &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx"&gt;INotifyPropertyChanged&lt;/a&gt; (&lt;span class="caps"&gt;INPC&lt;/span&gt;); every property requires an explicit getter and setter, and the setter must notify the subscribers of the appropriate changes; a perfect example of a &lt;a href="http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html"&gt;&lt;span class="caps"&gt;DRY&lt;/span&gt;&lt;/a&gt; violation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;event&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt; &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;get&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="k"&gt;set&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;_firstName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="n"&gt;RaisePropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
  
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;get&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="k"&gt;set&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;_lastName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="n"&gt;RaisePropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
  
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;RaisePropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PropertyChanged&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Polymorphism is great for abstracting out vertical commonality (all objects within a type hierarchy share the same traits; a dog is an animal); however, &lt;span class="caps"&gt;OOP&lt;/span&gt; doesn&amp;#8217;t provide us with a solution for abstracting out the horizontal aspects (e.g. &lt;span class="caps"&gt;INPC&lt;/span&gt;, logging all method invocations, auditing changes to Entities, etc). What we need is a means to abstract out the common aspects of our objects&amp;#8217; functions; this is where Aspect Oriented Programming (&lt;span class="caps"&gt;AOP&lt;/span&gt;) steals the lime light.&lt;/p&gt;
&lt;h2&gt;Solutions&lt;/h2&gt;
&lt;p&gt;While C# as a language doesn&amp;#8217;t provide any syntactic means for applying &lt;span class="caps"&gt;AOP&lt;/span&gt; (unlike some languages, such as as &lt;a href="http://www.eclipse.org/aspectj/"&gt;AspectJ&lt;/a&gt;), we do have several options at the &lt;span class="caps"&gt;CLR&lt;/span&gt; level: proxies (dynamic/remote) and post-compile static IL-weaving. We&amp;#8217;ll take a look at each of these in turn.&lt;/p&gt;
&lt;h3&gt;Dynamic Proxies&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A dynamic proxy class is a class that implements a list of interfaces specified at runtime such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. Thus, a dynamic proxy class can be used to create a type-safe proxy object for a list of interfaces without requiring pre-generation of the proxy class, such as with compile-time tools.&lt;br /&gt;
(&lt;a href="http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Proxy.html"&gt;http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Proxy.html&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A dynamic proxy class may be thought of as a &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;decorator&lt;/a&gt; class that is emitted at runtime; you must make all of your intercepted methods and properties &lt;a href="http://msdn.microsoft.com/en-us/library/sf985hc5(VS.71).aspx"&gt;abstract&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/9fkccyh4(VS.80).aspx"&gt;virtual&lt;/a&gt; if you wish for the generated class to derive from your target class (a class proxy), or you may specify an interface for the generated class to impliment (an interface proxy), in which case you may leave your members non-virtual. There are two excellent .&lt;span class="caps"&gt;NET&lt;/span&gt; libraries that help in constructing dynamic proxies: Castle&amp;#8217;s &lt;a href="http://www.castleproject.org/dynamicproxy/index.html"&gt;DynamicProxy&lt;/a&gt; and &lt;a href="http://github.com/philiplaureano/LinFu"&gt;LinFu&lt;/a&gt;.  While both are great libraries, let&amp;#8217;s take a look at Castle&amp;#8217;s DynamicProxy.&lt;/p&gt;
&lt;p&gt;DynamicProxy supports both class proxies and interface proxies, which are created through the instance methods of the ProxyGenerator class. The ProxyGenerator constructs proxies that delegate control to a list of one or more IInterceptors that you provide. Let&amp;#8217;s take a look at the definition for the IInterceptor interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IInterceptor&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IInvocation&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;All of the magic happens inside of the Intercept method; it provides you with all of the info regarding the current method invocation in the aptly named invocation argument, and it allows you to handle the invocation as you see fit. You can proceed with the invocation by calling invocation.Proceed, inspect the arguments with invocation.Arguments, view the MethodInfo via invocation.Method, etc. In our case, we will use this as an opportunity to encapsulate our aspects.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;For those familiar with dynamic languages, this is akin to having Ruby&amp;#8217;s &lt;a href="http://ruby-doc.org/core/classes/Kernel.html#M005925"&gt;method_missing&lt;/a&gt; within a static type system; the difference is that we can only intercept methods that are defined on our proxy class.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s enough theory; let&amp;#8217;s take a look at a concrete example (heavily inspired by &lt;a href="http://serialseb.blogspot.com/2008/05/implementing-inotifypropertychanged.html"&gt;this post&lt;/a&gt; from &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastien Lambla&amp;#8217;s blog&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;event&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt; &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="na"&gt;    [Notify]&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="na"&gt;    [Notify]&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotifyAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Attribute&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotifyPropertyChangedInterceptor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IInterceptor&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IInvocation&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="c1"&gt;// let the original call go through first, so we can notify *after*  &lt;/span&gt;
        &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Proceed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TargetType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
            &lt;span class="c1"&gt;// check that we have the attribute defined  &lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCustomAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NotifyAttribute&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
            &lt;span class="c1"&gt;// get the field storing the delegate list that are stored by the event.  &lt;/span&gt;
            &lt;span class="n"&gt;FieldInfo&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TargetType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BindingFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BindingFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NonPublic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="c1"&gt;// get the value of the field  &lt;/span&gt;
                &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt; &lt;span class="n"&gt;evHandler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InvocationTarget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
                &lt;span class="c1"&gt;// invoke the delegate if it&amp;#39;s not null (aka empty)  &lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evHandler&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                    &lt;span class="n"&gt;evHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TargetType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;proxyGenerator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProxyGenerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
    &lt;span class="n"&gt;PersonViewModel&lt;/span&gt; &lt;span class="n"&gt;personViewModel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;proxyGenerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateClassProxy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Personviewmodel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;NotifyPropertyChangedInterceptor&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;  
  
    &lt;span class="n"&gt;personViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PropertyChanged&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PropertyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
    &lt;span class="n"&gt;personViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Charles&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;personViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Strahan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As you can see, we&amp;#8217;ve made the code simpler while also making our intent much more clear &amp;#8211; a win/win result.&lt;/p&gt;
&lt;p&gt;If you want a more detailed look at DynamicProxy, look no further than &lt;a href="http://kozmic.pl/"&gt;Krzysztof Kozmic&amp;#8217;s&lt;/a&gt; excellent &lt;a href="http://kozmic.pl/articles/castle-dynamic-proxy-tutorial.aspx"&gt;tutorial&lt;/a&gt;. Likewise, there is an excellent &lt;a href="http://www.codeproject.com/KB/cs/LinFuPart1.aspx"&gt;tutorial for LinFu&lt;/a&gt; on CodeProject by &lt;a href="http://plaureano.blogspot.com/"&gt;Philip Laureano&lt;/a&gt; &amp;#8211; LinFu&amp;#8217;s author.&lt;/p&gt;
&lt;h3&gt;Remote Proxies&lt;/h3&gt;
&lt;p&gt;The .&lt;span class="caps"&gt;NET&lt;/span&gt; remoting infrastructure can be used to intercept method invocations by hooking into the message sink chain, allowing us to apply our aspects. We&amp;#8217;ll use a custom &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.imessagesink.aspx"&gt;IMessageSink&lt;/a&gt; implementation to intercept messages to our remote proxy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.ComponentModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Reflection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.Remoting.Messaging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;RemoteProxy&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AutoNotifySink&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;MarshalByRefObject&lt;/span&gt; &lt;span class="n"&gt;_target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;AutoNotifySink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MarshalByRefObject&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt; &lt;span class="n"&gt;nextSink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;_target&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="n"&gt;NextSink&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nextSink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt; &lt;span class="n"&gt;NextSink&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IMessage&lt;/span&gt; &lt;span class="nf"&gt;SyncProcessMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMessage&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;returnedMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMethodReturnMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;NextSink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SyncProcessMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="n"&gt;TryRaisePropertyChanged&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;IMethodMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;returnedMessage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IMessageCtrl&lt;/span&gt; &lt;span class="nf"&gt;AsyncProcessMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMessage&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt; &lt;span class="n"&gt;replySink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
  
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;TryRaisePropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMethodMessage&lt;/span&gt; &lt;span class="n"&gt;methodMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methodMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MethodName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;methodMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MethodName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
                &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methodMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
                &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
                &lt;span class="c1"&gt;// check that we have the attribute defined  &lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCustomAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NotifyAttribute&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                &lt;span class="p"&gt;{&lt;/span&gt;  
                    &lt;span class="c1"&gt;// get the field storing the delegate list that are stored by the event.  &lt;/span&gt;
                    &lt;span class="n"&gt;FieldInfo&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BindingFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BindingFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NonPublic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                    &lt;span class="p"&gt;{&lt;/span&gt;  
                        &lt;span class="c1"&gt;// get the value of the field  &lt;/span&gt;
                        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
                        &lt;span class="c1"&gt;// invoke the delegate if it&amp;#39;s not null (aka empty)  &lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
                            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
                    &lt;span class="p"&gt;}&lt;/span&gt;  
                &lt;span class="p"&gt;}&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now that we have a custom a custom message sink, we&amp;#8217;ll need some way to specify that this message sink should be used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.Remoting.Activation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.Remoting.Contexts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.Remoting.Messaging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;RemoteProxy&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AutoNotifyContextProperty&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IContextProperty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IContributeObjectSink&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;get&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AutoNotify&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsNewContextOK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Freeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt; &lt;span class="nf"&gt;GetObjectSink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MarshalByRefObject&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IMessageSink&lt;/span&gt; &lt;span class="n"&gt;nextSink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;notifySink&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AutoNotifySink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nextSink&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;notifySink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="na"&gt;  &lt;/span&gt;
&lt;span class="na"&gt;    [AttributeUsage(AttributeTargets.Class)]&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;INPCAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextAttribute&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;INPCAttribute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;INPCAttribute&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;GetPropertiesForNewContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IConstructionCallMessage&lt;/span&gt; &lt;span class="n"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;IContextProperty&lt;/span&gt; &lt;span class="n"&gt;notifyProperty&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AutoNotifyContextProperty&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
            &lt;span class="n"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContextProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notifyProperty&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now we just apply that attribute like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.ComponentModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;RemoteProxy&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
&lt;span class="na"&gt;    [INPC]&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextBoundObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;event&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt; &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="na"&gt;        [Notify]&lt;/span&gt;  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="na"&gt;        [Notify]&lt;/span&gt;  
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As you can see, this was relatively straightforward. One of the nice things about this implementation is that we don&amp;#8217;t need to explicitly wrap the target class in proxy &amp;#8211; it&amp;#8217;s all transparent. However, this does require that we inherit from ContextBound object, and the performance is considerably lower than with the dynamic proxy.&lt;/p&gt;
&lt;h3&gt;Post-Compile Static IL-Weaving&lt;/h3&gt;
&lt;p&gt;IL-weaving is another approach to &lt;span class="caps"&gt;AOP&lt;/span&gt; in .&lt;span class="caps"&gt;NET&lt;/span&gt;. Instead of trying to intercept messages via proxies, a second step can be added to the build process that &amp;#8220;weaves in&amp;#8221; the necessary IL into the emitted assemblies.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://evain.net/blog/"&gt;Jb Evain&amp;#8217;s&lt;/a&gt; &lt;a href="http://www.mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt; library is excellent for manipulating IL; when combined with a custom build task, it can make for an excellent &lt;span class="caps"&gt;AOP&lt;/span&gt; tool (&lt;a href="http://justinangel.net/"&gt;Justin Angel&lt;/a&gt; has an excellent &lt;a href="http://justinangel.net/AutomagicallyImplementingINotifyPropertyChanged"&gt;tutorial&lt;/a&gt;). The only down side to using Mono.Cecil is that you have to manipulate the individual IL opcodes (Cecil is meant for generic IL manipulation). Alternatively, If you have some money to spare, &lt;a href="http://www.sharpcrafters.com/"&gt;PostSharp&lt;/a&gt; is an excellent product that takes much higher-level approach to IL-weaving, providing an &lt;span class="caps"&gt;API&lt;/span&gt; similar to DynamicProxy&amp;#8217;s IInterceptor.&lt;/p&gt;
&lt;p&gt;For the sake of brevity, I won&amp;#8217;t be including any code samples for this approach.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;span class="caps"&gt;AOP&lt;/span&gt; is a powerful technique that, when used appropriately, can greatly simplify your projects. Common activities such as logging, auditing and caching can all be abstracted away using the aforementioned techniques. I encourage you to consider how these techniques can be applied to your current project(s). If you have any questions, please feel free to email me at charles.c.strahan &lt;at&gt; gmail.com.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Setting an SSH Key's Password</title>
   <link href="http://cstrahan.com/2010/06/03/setting-ssh-key-password.html" />
   <updated>2010-06-03T21:50:11-07:00</updated>
   <id>4a0617307083012e851f001fe16c6eb2</id>
   <content type="html">&lt;p&gt;This was a royal pain in the ass to figure out, so hopefully this&amp;#8217;ll save you or someone else some time. What follows is pretty much copied verbatim from the following site: &lt;br /&gt;
&lt;a href="http://www.noah.org/wiki/SSH_public_keys"&gt;http://www.noah.org/wiki/SSH_public_keys&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note to Windows/msysgit users:&lt;/strong&gt; the following commands will work without a hitch if you run them from the &amp;#8220;&lt;span class="caps"&gt;GIT&lt;/span&gt; Bash&amp;#8221;. Otherwise, you&amp;#8217;ll need to ensure that openssl is on your &lt;span class="caps"&gt;PATH&lt;/span&gt;. I&amp;#8217;m assuming here that your key is located at &lt;code&gt;%userprofile%/.ssh/id_rsa&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Unencrypt your existing key&lt;/h2&gt;
&lt;p&gt;If your existing key is encrypted (read: has a password), you&amp;#8217;ll need to remove the encryption first (this will obviously overwrite the existing key file):&lt;/p&gt;
&lt;pre class="console"&gt;
openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa
&lt;/pre&gt;
&lt;h2&gt;Encrypt your existing key&lt;/h2&gt;
&lt;p&gt;Once you&amp;#8217;ve unencrypted your key, you&amp;#8217;ll need to re-encrypt it (this will obviously overwrite the existing key file):&lt;/p&gt;
&lt;pre class="console"&gt;
openssl rsa -des3 -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa
&lt;/pre&gt;
&lt;p&gt;When you run the above command, you&amp;#8217;ll be prompted for your new password.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Linq in IronRuby</title>
   <link href="http://cstrahan.com/2010/04/26/linq-in-ironruby.html" />
   <updated>2010-04-26T21:28:05-07:00</updated>
   <id>33cb81b17080012e851c001fe16c6eb2</id>
   <content type="html">&lt;p&gt;Perusing through some old IronRuby mailing lists, I saw some people inquiring about using Linq from IronRuby. The general response was that it wasn&amp;#8217;t necessary &amp;#8211; you can use the equivalent methods on the Enumerable module. That works fine if your working with an IEnumerable, but there&amp;#8217;s one big problem &amp;#8211; you can&amp;#8217;t consume an &lt;span class="caps"&gt;API&lt;/span&gt; that exposes an IQueryable without calling #to_a. That sucks because you&amp;#8217;re now eager-loading everything into &lt;span class="caps"&gt;RAM&lt;/span&gt;. C# devs have the benefit of lambda expressions, but there isn&amp;#8217;t an equivelent in Ruby. You could create an Expression tree manually, but that sucks even harder.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s way to much suckage going on &amp;#8211; now lets make it blow! Er, suck less:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089&amp;#39;&lt;/span&gt;  
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;System.Linq.Dynamic&amp;#39;&lt;/span&gt;  
  
&lt;span class="c1"&gt;# Add DynamicQueryable methods to IQueryable[T]  &lt;/span&gt;
&lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Linq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;IQueryable&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;module_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  
  &lt;span class="n"&gt;dynamic_methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w{ any count group_by order_by select skip take where }&lt;/span&gt;  
  &lt;span class="n"&gt;dynamic_methods&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;  
    &lt;span class="n"&gt;define_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dynamic_&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;  
      &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Linq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Dynamic&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DynamicQueryable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;end&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;  
  
&lt;span class="c1"&gt;# Add some usefull methods to ::Enumerable and IEnumerable  &lt;/span&gt;
&lt;span class="n"&gt;enumerables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;IEnumerable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;  
&lt;span class="n"&gt;enumerables&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;enum_module&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;  
  &lt;span class="n"&gt;enum_module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;module_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_queryable&lt;/span&gt;  
      &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Linq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Queryable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_queryable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;end&lt;/span&gt;  
  
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
      &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Linq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Enumerable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:cast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;end&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;  
  
&lt;span class="c1"&gt;# Check it out!  &lt;/span&gt;
&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;  
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Fixnum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;\&lt;/span&gt;  
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_queryable&lt;/span&gt; &lt;span class="p"&gt;\&lt;/span&gt;  
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dynamic_where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;it % @0 == @1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;\&lt;/span&gt;  
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_a&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt; [2, 4, 6, 8]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;What&amp;#8217;s going on here?&lt;/h2&gt;
&lt;p&gt;First off, I&amp;#8217;m using the DynamicQueryable class that comes packaged as an example solution with Visual Studio 2008. I compiled the project as a class library, output as System.Linq.Dynamic.dll (thus the &lt;code&gt;require 'System.Linq.Dynamic'&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Next, you&amp;#8217;ll see that I&amp;#8217;m dynamically defining methods on &lt;code&gt;IQueryable&amp;lt;T&amp;gt;&lt;/code&gt; that delegate to &lt;code&gt;System.Linq.Queryable&lt;/code&gt;. I create a list of the Queryable static method names that I want to include, loop over each, and use &lt;code&gt;Module#define_method&lt;/code&gt; to create the method.&lt;/p&gt;
&lt;p&gt;Lastly, I add &lt;code&gt;#as_queryable&lt;/code&gt; and &lt;code&gt;#cast&lt;/code&gt; methods to &lt;code&gt;::Enumerable&lt;/code&gt; and &lt;code&gt;IEnumerable&lt;/code&gt;, just for convenience.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not quite as nice as C#, but I&amp;#8217;m sure it could get there with some lovin&amp;#8217;. Next on my &amp;#8220;todo&amp;#8221; list is to write an example of using this technique with Linq-to-&lt;span class="caps"&gt;SQL&lt;/span&gt;, with some metaprogramming sprinkled on top. I&amp;#8217;ll present a couple things here in a little while:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Write a &lt;span class="caps"&gt;DSL&lt;/span&gt; for Linq-to-&lt;span class="caps"&gt;SQL&lt;/span&gt; mappings.&lt;/li&gt;
	&lt;li&gt;Get active_record-esque ease of use with Linq-to-&lt;span class="caps"&gt;SQL&lt;/span&gt;. Just load a &lt;span class="caps"&gt;DBML&lt;/span&gt; file &amp;#8211; no need for code generation.&lt;/li&gt;
	&lt;li&gt;Even better active_record-ness. Same as above, with the benefit of using just a connection string.&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>ASP.NET Development Server v2.0 - Faster, Better, Stronger</title>
   <link href="http://cstrahan.com/2010/03/09/hacking-aspnet-dev-server.html" />
   <updated>2010-03-09T21:54:40-08:00</updated>
   <id>ea5e85907083012e8521001fe16c6eb2</id>
   <content type="html">&lt;p&gt;So here&amp;#8217;s the thing &amp;#8211; we all hate having to tie our Visual Studio solutions to an &lt;span class="caps"&gt;IIS&lt;/span&gt; web site when the &lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; Development Server will do just fine.  Sure, it&amp;#8217;s best to test our web apps on a live, flesh and blood &lt;span class="caps"&gt;IIS&lt;/span&gt; server &amp;#8211; but for small scale projects, why bother?  You and I are happy to use it 99% of the time&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;#8230; but some times we can&amp;#8217;t!&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s right &amp;#8211; &lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; Development Server refuses remote connections.  What&amp;#8217;s an iPhone web app developer to do?  Use &lt;span class="caps"&gt;IIS&lt;/span&gt; so I can establish remote connections from my iPhone?&lt;/p&gt;
&lt;p&gt;Hell no!&lt;/p&gt;
&lt;p&gt;Ladies and gentlemen, I present to you: &lt;span class="caps"&gt;ILDASM&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ohhhh yeah!&lt;/em&gt;  It&amp;#8217;s time to bring out the big guns.  We&amp;#8217;re gonna have us a little hackin&amp;#8217; action.  If the dev server doesn&amp;#8217;t want to play nice, we&amp;#8217;ll make it!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Let&amp;#8217;s grab the dev server executable.  You can find out where it&amp;#8217;s located by debugging a &lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; web project, opening the Task Manager and clicking the &amp;#8220;Open File Location&amp;#8221; on the WebDev.WebServer.&lt;span class="caps"&gt;EXE&lt;/span&gt;.  Copy that file to c:\temp, where we&amp;#8217;ll do a little patch work later on.  In my case, it&amp;#8217;s in the following folder:  C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/2010-03-09-taskman.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; It&amp;#8217;s time to perform open heart surgery.  Grab Reflector, and let&amp;#8217;s get to work.  Drag and drop the executable onto Reflector and take a look around.  You&amp;#8217;ll notice that there&amp;#8217;s nothing of real interest here &amp;#8211; it delegates most of the heavy lifting to the WebDev.WebHost40 assembly.  Let&amp;#8217;s figure out where that is like so:&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/2010-03-09-reflector1.png" alt="" /&gt;&lt;br /&gt;
&lt;img src="/images/2010-03-09-reflector2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Now that we know where it is, let&amp;#8217;s copy that to c:\temp:&lt;/p&gt;
&lt;pre class="console"&gt;
xcopy C:\Windows\Microsoft.Net\assembly\GAC_32\WebDev.WebHost40\v4.0_10.0.0.0__b03f5f7f11d50a3a\WebDev.WebHost40.dll c:\temp
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Back to Reflector!  Let&amp;#8217;s take a look around for a sec&amp;#8230;  Did you notice the Request class?  Let&amp;#8217;s take a look there.  Ah!  Request.Process() looks rather suspicious:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="na"&gt;[AspNetHostingPermission(SecurityAction.Assert, Level=AspNetHostingPermissionLevel.Medium)]&lt;/span&gt;  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TryParseRequest&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_verb&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_contentLength&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_preloadedContentLength&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_contentLength&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write100Continue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequireAuthentication&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TryNtlmAuthenticate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_isClientScriptPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteEntireResponseFromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PhysicalClientScriptPath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NormalizedClientScriptPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsRequestForRestrictedDirectory&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x193&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessDefaultDocumentRequest&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrepareResponse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
                &lt;span class="n"&gt;HttpRuntime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Hmmm&amp;#8230; that call to TryParseRequest()&amp;#8230; let&amp;#8217;s take a look:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;TryParseRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAllHeaders&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsLocal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x193&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_headerBytes&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_endHeadersOffset&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_headerByteStrings&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_headerByteStrings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseRequestLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsBadPath&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsVirtualPathInApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_isClientScriptPath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x194&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseHeaders&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParsePostedContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Busted! If the connection is not local, return a 403 and close the connection &amp;#8211; WriteErrorAndClose(0&amp;#215;193). Let&amp;#8217;s put this on our naughty list &amp;#8211; we&amp;#8217;ll get back to it later on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Hunt down the Loopbacks!  Here&amp;#8217;s Server.Start():&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;try&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_socket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSocketBindAndListen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InterNetwork&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Loopback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;SocketException&lt;/span&gt; &lt;span class="n"&gt;exception2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;SocketException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;exception2&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SocketErrorCode&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SocketError&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddressAlreadyInUse&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_socket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSocketBindAndListen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InterNetworkV6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IPv6Loopback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_socket&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;ThreadPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueueUserWorkItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_onStart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Those Loopbacks gotta go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; It&amp;#8217;s surgery time.  Use &lt;span class="caps"&gt;ILDASM&lt;/span&gt; to dump WebDev.WebServer.&lt;span class="caps"&gt;EXE&lt;/span&gt; and WebDev.WebHost40.dll to c:\temp\server\WebDev.WebServer.IL and c:\temp\host\WebDev.WebHost40.IL, respectively.  When prompted, tick each checkbox on the output options.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start with the host.  Open up WebDev.WebHost40.IL, preferably with a real text editor.  Let&amp;#8217;s first find those Loopbacks &amp;#8211; locate the Server.Start() method:&lt;/p&gt;
&lt;pre class="console"&gt;
  .method /*0600009B*/ public hidebysig instance void
          Start() cil managed
  // SIG: 20 00 01
  {
&lt;/pre&gt;
&lt;p&gt;Now, replace Loopback and IPV6Loopback with Any and IPV6Any, respectively. In other words, this:&lt;/p&gt;
&lt;pre class="console"
IL_0003:  /* 7E   | (0A)0000A4       */ ldsfld     class [System/*23000003*/]System.Net.IPAddress/*01000015*/ [System/*23000003*/]System.Net.IPAddress/*01000015*/::Loopback /* 0A0000A4 */
&lt;/pre&gt;

becomes:

&amp;lt;pre class="console"
IL_0003:  /* 7E   | (0A)0000A4       */ ldsfld     class [System/*23000003*/]System.Net.IPAddress/*01000015*/ [System/*23000003*/]System.Net.IPAddress/*01000015*/::Any /* 0A0000A4 */
&lt;/pre&gt;
&lt;p&gt;Great! Now it&amp;#8217;ll accept connections &amp;#8211; but it will still respond with a 403 and drop the connection &amp;#8211; no bueno!  Let&amp;#8217;s fix it.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the offending code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsLocal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteErrorAndClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x193&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That translates to the following IL (from the TryParseRequest() method):&lt;/p&gt;
&lt;pre class="console"&gt;
    IL_000c:  /* 02   |                  */ ldarg.0
    IL_000d:  /* 7B   | (04)00004E       */ ldfld      class Microsoft.VisualStudio.WebHost.Connection/*02000004*/ Microsoft.VisualStudio.WebHost.Request/*0200000B*/::_connection /* 0400004E */
    IL_0012:  /* 6F   | (06)000015       */ callvirt   instance bool Microsoft.VisualStudio.WebHost.Connection/*02000004*/::get_IsLocal() /* 06000015 */
    IL_0017:  /* 2D   | 12               */ brtrue.s   IL_002b

                                         // this._connection.WriteErrorAndClose(403); return;
    IL_0019:  /* 02   |                  */ ldarg.0
    IL_001a:  /* 7B   | (04)00004E       */ ldfld      class Microsoft.VisualStudio.WebHost.Connection/*02000004*/ Microsoft.VisualStudio.WebHost.Request/*0200000B*/::_connection /* 0400004E */
    IL_001f:  /* 20   | 93010000         */ ldc.i4     0x193
    IL_0024:  /* 6F   | (06)000023       */ callvirt   instance void Microsoft.VisualStudio.WebHost.Connection/*02000004*/::WriteErrorAndClose(int32) /* 06000023 */
    IL_0029:  /* 16   |                  */ ldc.i4.0
    IL_002a:  /* 2A   |                  */ ret

    // blah blah blah . . .
&lt;/pre&gt;
&lt;p&gt;Pretty simple, right? If the connection is local, branch &amp;#8211; go to IL_002b and continue processing. There&amp;#8217;s several ways you can fix this &amp;#8211; my suggestion is that you just replace the &amp;#8220;this._connection.WriteErrorAndClose(403)&amp;#8221; code with NOPs. Here&amp;#8217;s what you end up with:&lt;/p&gt;
&lt;pre class="console"&gt;
    IL_0019:   nop
    IL_001a:   nop
    IL_001b:   nop
    IL_001c:   nop
    IL_001d:   nop
    IL_001e:   nop
    IL_001f:   nop
    IL_0020:   nop
    IL_0021:   nop
    IL_0022:   nop
    IL_0023:   nop
    IL_0024:   nop
    IL_0025:   nop
    IL_0026:   nop
    IL_0027:   nop
    IL_0028:   nop
    IL_0029:   nop
    IL_002a:   nop
&lt;/pre&gt;
&lt;p&gt;Yay! One last little change:&lt;/p&gt;
&lt;pre class="console"&gt;
.assembly /*20000001*/ WebDev.WebHost40
{
  // blah blah blah
  .ver 10:0:0:0 // Let's bump this up to .ver 10:1:0:0
}
&lt;/pre&gt;
&lt;p&gt;Now, create a strong name key using Sn.exe. After you have your snk, compile the IL using:&lt;/p&gt;
&lt;pre class="console"&gt;
ilasm /dll /resource=webdev.webhost40.res /key=c:\temp\mykey.snk webdev.webhost40.il
&lt;/pre&gt;
&lt;p&gt;Install the assembly into the &lt;span class="caps"&gt;GAC&lt;/span&gt;:&lt;/p&gt;
&lt;pre class="console"&gt;
gacutil /i c:\temp\webdev.webhost.dll
&lt;/pre&gt;
&lt;p&gt;One assembly down, one more to go; we still need to update the web server&amp;#8217;s reference to the new WebDev.WebHost40.  Open up WebDev.WebServer40.IL and change this:&lt;/p&gt;
&lt;pre class="console"&gt;
.assembly extern /*23000005*/ WebDev.WebHost40  
{  
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )  
  .ver 10:0:0:0  
}  
&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre class="console"&gt;
.assembly extern /*23000005*/ WebDev.WebHost40  
{  
  .publickeytoken = (00 00 00 00 00 00 00 00 ) // put _YOUR_ public key here!!!  
  .ver 10:1:0:0  
}  
&lt;/pre&gt;
&lt;p&gt;Now it&amp;#8217;s time to compile using ilasm:&lt;/p&gt;
&lt;pre class="console"&gt;
ilasm /exe /resource=WebDev.WebServer40.res /key=c:\temp\mykey.snk WebDev.WebServer40.il
&lt;/pre&gt;
&lt;p&gt;Give it a test:&lt;/p&gt;
&lt;pre class="console"&gt;
c:\temp\server\WebDev.WebServer40.exe /port:1234 /path:c:\path\to\website /vpath:website [/ntlm]
&lt;/pre&gt;
&lt;p&gt;You&amp;#8217;re golden, Ponyboy! Create a backup folder in your DevServer\10.0 folder, then feel free to replace the original executable with your patched version.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Why Combinators? (pun intended)</title>
   <link href="http://cstrahan.com/2010/01/24/why-combinators.html" />
   <updated>2010-01-24T20:46:06-08:00</updated>
   <id>566ff8f0707a012e851b001fe16c6eb2</id>
   <content type="html">&lt;h2&gt;Y indeed!&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;What is a fixed-point? What is the fixed-point Y combinator? How can we utterly abuse the aforementioned concepts for fun and profit?&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re interested in delving into such Functional Programming topics, this blog post is for you. I would like to note, however, that ML programmers can skip this entire post and read &lt;a href="http://www.lfcs.inf.ed.ac.uk/reports/97/ECS-LFCS-97-375/"&gt;That About Wraps it Up&lt;/a&gt; by Bruce J. McAdam, which serves as the inspiration for much of this post; if you&amp;#8217;re a C# person, such as myself, you&amp;#8217;re in the right place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You&amp;#8217;ll find the related code on GitHub &lt;a href="https://github.com/cstrahan/cstrahan-lib-sharp/tree/master/src/CStrahan/Combinators"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What&amp;#8217;s in it for me?&lt;/h2&gt;
&lt;p&gt;Functional Programming is a bit mind bending for the uninitiated, so before we commit to anything, let&amp;#8217;s take a look at what we will gain by delving into this esoterrorism.&lt;/p&gt;
&lt;h2&gt;The &lt;del&gt;rent&lt;/del&gt; complexity is too&amp;#8230; damned&amp;#8230; high!&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s take a look at a (naïve) implementation of a Fibonacci number generator:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
Func&amp;lt;int, int&amp;gt; fib = null; fib = n =&amp;gt; n &amp;lt; n ? n : fib(n-2) + fib(n-1);
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While that works, it has some rather fundamental flaws:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;fib closes over itself, which can lead to some very strange issues.&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s slower than snot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first problem becomes apparent when do something like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// displays 8  &lt;/span&gt;
  
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fibCopy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibCopy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// displays 18! &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The problem that we&amp;#8217;re seeing here is that fib is not really recursive, as it does not inherently invoke itself – it just invokes whatever function is bound to the variable fib.&lt;br /&gt;
The second problem is a little more pronounced. Go ahead and invoke fib(2000)&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;#8230; assuming you&amp;#8217; haven&amp;#8217;t died of old age, let&amp;#8217;s consider some solutions. If we could wrap the recursive definition of fib such that the result of each computation was cached, we would have a much more efficient Fibonacci number generator without having to change our original definition (a technique called Memoization). Ideally, we should be able to do something as simple as follows (excepting some funky syntax):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Functional&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BigInteger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BigInteger&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;fibo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Memoize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
&lt;span class="cm"&gt;/* displays: &lt;/span&gt;
&lt;span class="cm"&gt;42246963333923048787067256023414827825798528402506810980102801373143085843701307 &lt;/span&gt;
&lt;span class="cm"&gt;07224123599639141511088446087538909603607640194711643596029271983312598737326253 &lt;/span&gt;
&lt;span class="cm"&gt;55580260699158591522949245390499872225679531698287448247299226390183371677806060 &lt;/span&gt;
&lt;span class="cm"&gt;70116154978867198798583114688708762645973690867228840236544222952433479644801395 &lt;/span&gt;
&lt;span class="cm"&gt;15349562972087652656069529806499841977448720155612802665404554171717881930324025 &lt;/span&gt;
&lt;span class="cm"&gt;204312082516817125 */&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Guess what? By the time you&amp;#8217;ve finished reading this, we will have implemented that very same code. If your interest is piqued, you&amp;#8217;ll probably enjoy the rest of this post; otherwise, this just might bore you to death.&lt;/p&gt;
&lt;h2&gt;Fixed-point whatsits&lt;/h2&gt;
&lt;p&gt;Fixed-point combinators are at the heart of the magic that we&amp;#8217;re going to perform. But before I scare you away with my academic vocabulary, let&amp;#8217;s break this down into several bite sized, tasty concepts. First, a definition of fixed point is in order. A fixed point of a function f is a value x such that f(x) = x. In graphical terms, this is any point where y=x. While this isn&amp;#8217;t horribly interesting to us when f is a function of simple types (integers and such), it is much more exciting when we consider higher order functions.&lt;/p&gt;
&lt;p&gt;To find the fixed point of a higher order function, we need something called a fixed-point combinator. A combinator is a function with no free variables, and a fixed-point combinator is a function g such that g(f)=p, where p is the fixed point. As it turns out, this is well charted territory; perhaps the most well known fixed-point combinator, Haskell Curry&amp;#8217;s Y combinator, is defined as follows:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
Y = λf.(λx.f (x x)) (λx.f (x x))
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While Y works well in the untyped lambda calculus, we&amp;#8217;ll run into some problems if we try to make a straight port to C#; C# is evaluated in applicative order, and thus Y would result in infinite series of invocations. Also, we&amp;#8217;d have to define some clever self-applicable delegate types to make the compiler happy. We&amp;#8217;ll look at two implementations – one that stays fairly true to the Y combinator, and another much simple example that cheats by using C#&amp;#8217;s syntactic support for recursion.&lt;/p&gt;
&lt;h2&gt;Let&amp;#8217;s Fix it&lt;/h2&gt;
&lt;p&gt;First, how can we define a recursive function without explicitly referring to itself? Well, we could require that the function be passed in like so, yielding the function that we want:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
Func&amp;lt;Func&amp;lt;int, int&amp;gt;, Func&amp;lt;int, int&amp;gt;&amp;gt; fib = fibo =&amp;gt; n =&amp;gt; n &amp;lt; 2 ? n : fibo(n-2) + fibo(n-1);
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230; but what exactly are we supposed to pass in?&lt;/p&gt;
&lt;p&gt;We need the fixed-point – where the same function going in is the same function coming out. Because the resulting function &lt;code&gt;(n =&amp;gt; n &amp;lt; 2 ? n : fibo(n-2) + fibo(n-1))&lt;/code&gt; references the function coming in (fibo), the fixed-point would be the recursive function we are after.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the easy way out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;fibo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// displays 8  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that we are recursing by calling Fix within the lambda; while that works, that isn&amp;#8217;t quite true to the original Y Combinator. Let&amp;#8217;s take a look at the Y Combinator again:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
Y = λf.(λx.f (x x)) (λx.f (x x))
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s a C# rendition:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;delegate&lt;/span&gt; &lt;span class="n"&gt;TResult&lt;/span&gt; &lt;span class="n"&gt;SelfApplicable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;SelfApplicable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SelfApplicable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;(&lt;/span&gt;  
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="c1"&gt;// ... we can make that a little more concise using the U combinator, which applies a given function to itself:  &lt;/span&gt;
  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;TResult&lt;/span&gt; &lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;SelfApplicable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Time to wrap it up&lt;/h2&gt;
&lt;p&gt;Now that we have a fixed-point combinator, we can pull off some interesting tricks by wrapping the original function using some reusable combinators. I promised that I&amp;#8217;d show you how to write a memoizing combinator, so lets take a look at that now:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Memoize&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  
    &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="n"&gt;TReturn&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TryGetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
  
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="p"&gt;};&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  
    &lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
        &lt;span class="n"&gt;Memoize&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;  
            &lt;span class="n"&gt;fibo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s pretty cool… but why stop there? Let&amp;#8217;s write a tracing wrapper and compare the memoized fib function against the unadulterated version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="c1"&gt;// Utility method, to allow for type inference.  &lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Functional&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Trace&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;recursionLevel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TReturn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;  
                    &lt;span class="p"&gt;{&lt;/span&gt;  
                        &lt;span class="n"&gt;recursionLevel&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;  
  
                        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recursionLevel&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
                        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
                        &lt;span class="n"&gt;TReturn&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  
                        &lt;span class="n"&gt;recursionLevel&lt;/span&gt;&lt;span class="p"&gt;--;&lt;/span&gt;  
  
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
                    &lt;span class="p"&gt;};&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
  
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fastFib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Functional&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;fibo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Memoize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fib({0}) = {1}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fastFib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  
&lt;span class="cm"&gt;/* OUTPUT: &lt;/span&gt;
&lt;span class="cm"&gt;  8 &lt;/span&gt;
&lt;span class="cm"&gt;    7 &lt;/span&gt;
&lt;span class="cm"&gt;      6 &lt;/span&gt;
&lt;span class="cm"&gt;        5 &lt;/span&gt;
&lt;span class="cm"&gt;          4 &lt;/span&gt;
&lt;span class="cm"&gt;            3 &lt;/span&gt;
&lt;span class="cm"&gt;              2 &lt;/span&gt;
&lt;span class="cm"&gt;                1 &lt;/span&gt;
&lt;span class="cm"&gt;                0 &lt;/span&gt;
&lt;span class="cm"&gt;fib(8) = 21 &lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;  
  
&lt;span class="c1"&gt;// (Notice that we&amp;#39;re not memoizing here)  &lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;slowFib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Functional&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;fibo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
             &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
  
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fib({0}) = {1}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slowFib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  
&lt;span class="cm"&gt;/* OUTPUT: &lt;/span&gt;
&lt;span class="cm"&gt;  8 &lt;/span&gt;
&lt;span class="cm"&gt;    7 &lt;/span&gt;
&lt;span class="cm"&gt;      6 &lt;/span&gt;
&lt;span class="cm"&gt;        5 &lt;/span&gt;
&lt;span class="cm"&gt;          4 &lt;/span&gt;
&lt;span class="cm"&gt;            3 &lt;/span&gt;
&lt;span class="cm"&gt;              2 &lt;/span&gt;
&lt;span class="cm"&gt;                1 &lt;/span&gt;
&lt;span class="cm"&gt;                0 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;            2 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;              0 &lt;/span&gt;
&lt;span class="cm"&gt;          3 &lt;/span&gt;
&lt;span class="cm"&gt;            2 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;              0 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;        4 &lt;/span&gt;
&lt;span class="cm"&gt;          3 &lt;/span&gt;
&lt;span class="cm"&gt;            2 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;              0 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;      5 &lt;/span&gt;
&lt;span class="cm"&gt;        4 &lt;/span&gt;
&lt;span class="cm"&gt;          3 &lt;/span&gt;
&lt;span class="cm"&gt;            2 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;              0 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;        3 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;          1 &lt;/span&gt;
&lt;span class="cm"&gt;    6 &lt;/span&gt;
&lt;span class="cm"&gt;      5 &lt;/span&gt;
&lt;span class="cm"&gt;        4 &lt;/span&gt;
&lt;span class="cm"&gt;          3 &lt;/span&gt;
&lt;span class="cm"&gt;            2 &lt;/span&gt;
&lt;span class="cm"&gt;              1 &lt;/span&gt;
&lt;span class="cm"&gt;              0 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;        3 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;          1 &lt;/span&gt;
&lt;span class="cm"&gt;      4 &lt;/span&gt;
&lt;span class="cm"&gt;        3 &lt;/span&gt;
&lt;span class="cm"&gt;          2 &lt;/span&gt;
&lt;span class="cm"&gt;            1 &lt;/span&gt;
&lt;span class="cm"&gt;            0 &lt;/span&gt;
&lt;span class="cm"&gt;          1 &lt;/span&gt;
&lt;span class="cm"&gt;        2 &lt;/span&gt;
&lt;span class="cm"&gt;          1 &lt;/span&gt;
&lt;span class="cm"&gt;          0 &lt;/span&gt;
&lt;span class="cm"&gt;fib(8) = 21 &lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Functional… or &lt;em&gt;dys&lt;/em&gt;functional?&lt;/h2&gt;
&lt;p&gt;How practical is any of this? Well, I&amp;#8217;m not really sure. The fact that you can &amp;#8220;hook into&amp;#8221; a recursive algorithm using some simple, reusable combinators is rather fascinating. On the other hand, I&amp;#8217;d be a little worried using this in production; the lack of tail-call optimization combined with each wrapper invocation will result in a StackOverflowException in a hurry. With that said, I do believe that this exercise has given me new insights into FP and programming patterns in general, so I&amp;#8217;d consider it a win.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ODBC via Ruby on Windows</title>
   <link href="http://cstrahan.com/2009/06/03/odbc-via-ruby-windows.html" />
   <updated>2009-06-03T21:38:29-07:00</updated>
   <id>a787d8017081012e851d001fe16c6eb2</id>
   <content type="html">&lt;p&gt;I &lt;em&gt;just&lt;/em&gt; got Ruby to connect to a database via &lt;span class="caps"&gt;ODBC&lt;/span&gt; and the &lt;a href="https://rubygems.org/gems/dbi"&gt;dbi&lt;/a&gt; gem (particularly, &lt;span class="caps"&gt;MSSQL&lt;/span&gt;). I ran into a few problems along the way, so here are some of my notes.&lt;/p&gt;
&lt;h2&gt;&lt;span class="caps"&gt;DBI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Make sure you have the dbi and dbd-odbc gems installed:&lt;/p&gt;
&lt;pre class="console"&gt;
gem install dbi 
gem install dbd-odbc
&lt;/pre&gt;
&lt;p&gt;Next, you&amp;#8217;ll want to make sure that you have the &lt;code&gt;odbc.so&lt;/code&gt; and &lt;code&gt;odbc_utf8.so&lt;/code&gt; files in your Ruby installation (check your &lt;code&gt;lib\ruby\1.8\i386-mingw32&lt;/code&gt; folder). If you do not have these, go grab &lt;code&gt;i386-msvcrt-ruby-odbc.zip&lt;/code&gt; from here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ch-werner.de/rubyodbc/"&gt;http://www.ch-werner.de/rubyodbc/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can now use dbi like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;  
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dbi&amp;#39;&lt;/span&gt;  
  
&lt;span class="no"&gt;DBI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DBI:ODBC:test_dsn&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;dbh&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;  
  &lt;span class="n"&gt;dbh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;select * from sys.tables&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;  
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;ActiveRecord&lt;/h2&gt;
&lt;p&gt;You can also use &lt;code&gt;active_record&lt;/code&gt;. First, go grab &lt;code&gt;odbc-rails&lt;/code&gt; from here:&lt;/p&gt;
&lt;p&gt;http://odbc-rails.rubyforge.org/&lt;/p&gt;
&lt;p&gt;If you go to the download page, you&amp;#8217;ll see that there are two versions: 1.5 and 2.0 for Rails 1.x and 2.x, respectively. Doing a gem install odbc-rails resulted in 1.5 being installed on my machine, so I downloaded the &amp;#8220;activerecord-odbc-adapter-2.0.gem&amp;#8221;http://rubyforge.org/frs/download.php/35985/activerecord-odbc-adapter-2.0.gem file from rubyforge and installed that. Once you&amp;#8217;ve installed the gem, you can follow the instructions on the odbc-rails homepage to use it from Rails, or you can use some code like the following if you want to use active_record outside of a Rails project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;  
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;active_record&amp;#39;&lt;/span&gt;  
  
&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
  &lt;span class="ss"&gt;:adapter&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;odbc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
  &lt;span class="ss"&gt;:dsn&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
  
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;  
  
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:all&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you&amp;#8217;re connecting specifically to &lt;span class="caps"&gt;SQL&lt;/span&gt; Server, it&amp;#8217;s probably a better idea to use the &lt;a href="https://rubygems.org/gems/activerecord-sqlserver-adapter"&gt;activerecord-sqlserver-adapter&lt;/a&gt; gem. Here&amp;#8217;s a good link on that topic:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rubyrailsandwindows.blogspot.com/2008/03/rails-2-and-sql-server-2008-on-windows_24.html"&gt;http://rubyrailsandwindows.blogspot.com/2008/03/rails-2-and-sql-server-2008-on-windows_24.html&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;p&gt;There are also a few other alternatives. Check these out:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyonwindows.blogspot.com/2007/09/using-ruby-sql-dmo-to-automate-sql.html"&gt;http://rubyonwindows.blogspot.com/2007/09/using-ruby-sql-dmo-to-automate-sql.html&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rubyonwindows.blogspot.com/2007/03/ruby-ado-and-sqlser"&gt;http://rubyonwindows.blogspot.com/2007/03/ruby-ado-and-sqlser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 
</feed>

