<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>geek#</title>
	<atom:link href="http://geeksharp.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://geeksharp.com</link>
	<description>techno-babble for the masses</description>
	<lastBuildDate>Thu, 21 Jan 2010 16:17:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mercurial Web with FastCGI &amp; Nginx</title>
		<link>http://geeksharp.com/2010/01/20/mercurial-web-with-fastcgi-nginx/</link>
		<comments>http://geeksharp.com/2010/01/20/mercurial-web-with-fastcgi-nginx/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 01:29:07 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Source Control]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2010/01/20/mercurial-web-with-fastcgi-nginx/</guid>
		<description><![CDATA[So I’ve finally decided to make the switch to a distributed source control system.&#160; The benefits are well-documented, and I&#8217;ve grown weary of Subversion.&#160; After some research, I decided Mercurial would be best for me.&#160; Since I have OCD, and I wanted to push via HTTP to my remote repository, I did some homework and [...]]]></description>
			<content:encoded><![CDATA[<p>So I’ve finally decided to make the switch to a distributed source control system.&#160; The benefits are well-documented, and I&#8217;ve grown weary of Subversion.&#160; After some research, I decided Mercurial would be best for me.&#160; Since I have OCD, and I wanted to push via HTTP to my remote repository, I did some homework and figured out how to get everything running on my VPS.&#160; If you’d like to see how I did it, read on.</p>
<h4>Step 1:&#160; Prerequisites</h4>
<p>Since my VPS runs Ubuntu Linux 9.10, there are a few packages to install before we get started.&#160; Run the following command to install them:</p>
<pre class="brush: plain;">sudo apt-get install python-setuptools acl python-dev spawn-fcgi</pre>
<p>Now you need to make sure your main partition has the acl system enabled in /etc/fstab.&#160; Modify the partition options to look something like this:</p>
<pre class="brush: plain;"># /etc/fstab: static file system information.
#
# &lt;file system&gt; &lt;mount point&gt;   &lt;type&gt;  &lt;options&gt;       &lt;dump&gt;  &lt;pass&gt;
proc            /proc           proc    defaults        0       0
/dev/xvda       /               ext3    noatime,errors=remount-ro,acl 0       1
/dev/xvdb       none            swap    sw              0       0</pre>
<p>Pay attention to that <b>acl</b> option in the default partition above.&#160; Now you can just remount the partition:</p>
<pre class="brush: plain;">sudo mount -o remount,acl /</pre>
<h4>Step 2:&#160; Install Mercurial and flup</h4>
<p>Mercurial is obvious, but flup might be new to you.&#160; Flup is a python module that allows us to create a WSGI server to host the repositories.</p>
<pre class="brush: plain;">sudo easy_install mercurial
sudo easy_install flup</pre>
<h4>Step 3:&#160; Create a user account to hold your repositories</h4>
<p>I prefer to place my repositories underneath a normal user account and then add www-data and myself to the group.&#160; Here are the commands to set it all up:</p>
<pre class="brush: plain;">sudo /usr/sbin/groupadd hg
sudo /usr/sbin/useradd -g hg -s /bin/false hg
sudo mkdir /var/hg
sudo chown hg:hg /var/hg
sudo /usr/sbin/usermod -G hg www-data
sudo /usr/sbin/usermod -G hg scott</pre>
<p>The next part deserves a little bit of explaining.&#160; Basically the whole /var/hg folder should be owned by the group <strong>hg</strong> that we just created.&#160; But what we need to ensure three things.&#160; First, the hg group should have write permissions to the root folder.&#160; Second, we need to make sure that any new files created under this folder will belong to the group <strong>hg</strong> also.&#160; And third, we need to make sure that the default permissions for this folder are read/write for the owner and the group.&#160; These two commands will ensure each of these rules is followed, which is why we added the <strong>acl</strong> package earlier and remounted the main filesystem.</p>
<p>I’m sure there are other ways to accomplish this (like running Nginx and the FastCGI process as the <strong>hg</strong> user), but this is the method I prefer, and it saves a lot of headaches down the road dealing with why a push won’t go.&#160; So here are the three commands you need to execute:</p>
<pre class="brush: plain;">sudo chmod -R g+rwxs,o+rx /var/hg
sudo setfacl -R -m d:u::rwx,d:g::rwx,d:m:rwx,d:o:r-x /var/hg</pre>
<h4>Step 4:&#160; Create the hgwebdir.cgi script</h4>
<p>This script is used to serve the incoming requests for the FastCGI interface, mine is <strong>/opt/hg-fastcgi/hgwebdir.fcgi</strong></p>
<pre class="brush: plain;">#!/usr/bin/env python
#
# An example CGI script to export multiple hgweb repos, edit as necessary

# adjust python path if not a system-wide install:
#import sys
#sys.path.insert(0, "/path/to/python/lib")

# enable demandloading to reduce startup time
from mercurial import demandimport; demandimport.enable()

# Uncomment to send python tracebacks to the browser if an error occurs:
#import cgitb
#cgitb.enable()

# If you'd like to serve pages with UTF-8 instead of your default
# locale charset, you can do so by uncommenting the following lines.
# Note that this will cause your .hgrc files to be interpreted in
# UTF-8 and all your repo files to be displayed using UTF-8.
#
#import os
#os.environ["HGENCODING"] = "UTF-8"

from mercurial.hgweb.hgwebdir_mod import hgwebdir
from flup.server.fcgi import WSGIServer

# The config file looks like this.  You can have paths to individual
# repos, collections of repos in a directory tree, or both.
#
# [paths]
# virtual/path1 = /real/path1
# virtual/path2 = /real/path2
# virtual/root = /real/root/*
# / = /real/root2/*
#
# [collections]
# /prefix/to/strip/off = /root/of/tree/full/of/repos
#
# paths example:
#
# * First two lines mount one repository into one virtual path, like
# '/real/path1' into 'virtual/path1'.
#
# * The third entry tells every mercurial repository found in
# '/real/root', recursively, should be mounted in 'virtual/root'. This
# format is preferred over the [collections] one, using absolute paths
# as configuration keys is not supported on every platform (including
# Windows).
#
# * The last entry is a special case mounting all repositories in
# '/real/root2' in the root of the virtual directory.
#
# collections example: say directory tree /foo contains repos /foo/bar,
# /foo/quux/baz.  Give this config section:
#   [collections]
#   /foo = /foo
# Then repos will list as bar and quux/baz.
#
# Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
# or use a dictionary with entries like 'virtual/path': '/real/path'

WSGIServer(hgwebdir('/var/hg/hgweb.config')).run()</pre>
<p>Make sure you set this script as executable with the following command:</p>
<pre class="brush: plain;">chmod +x /opt/hg-fastcgi/hgwebdir.fcgi</pre>
<h4>Step 5:&#160; Create the Mercurial hgweb.config</h4>
<p>There’s a simple INI-style config file we have to create.&#160; I called mine <strong>/var/hg/hgweb.config</strong>.&#160; If you decide to place yours elsewhere, you need to modify the last line of the <strong>hgwebdir.fcgi</strong> script you created in step 4.</p>
<pre class="brush: plain;">[web]
baseurl = /
allow_push = *
push_ssl = false

[collections]
/var/hg = /var/hg</pre>
<h4>Step 6:&#160; Create the FastCGI init.d script</h4>
<p>This script will not only handle starting and stopping your FastCGI process for Mercurial; it will also handle restarting the service on reboot.&#160; Make sure you save this as <strong>/etc/init.d/fcgi-hg.</strong></p>
<pre class="brush: plain;">#! /bin/sh
#
# fcgi-hg     Startup script for the nginx HTTP Server
#
# chkconfig: - 84 15
# description: Loading php-cgi using spawn-cgi
#	       HTML files and CGI.
#
# Author:  Ryan Norbauer &lt;ryan.norbauer@gmail.com&gt;
# Modified:     Geoffrey Grosenbach http://topfunky.com
# Modified:     David Krmpotic http://davidhq.com
# Modified:	Kun Xi http://kunxi.org
PATH=/opt/python/bin:$PATH
DAEMON=/usr/bin/spawn-fcgi
FCGIHOST=127.0.0.1
FCGIPORT=9003
FCGIUSER=www-data
FCGIGROUP=www-data
FCGIAPP=/opt/hg-fastcgi/hgwebdir.fcgi
PIDFILE=/var/run/fcgi-hg.pid
DESC="HG in FastCGI mode"

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
test -x $FCGIAPP || exit 0

start() {
	$DAEMON -a $FCGIHOST -p $FCGIPORT -u $FCGIUSER -g $FCGIGROUP -f $FCGIAPP -P $PIDFILE 2> /dev/null || echo -en "\n already running"
}

stop() {
	kill -QUIT `cat $PIDFILE` || echo -en "\n not running"
}

restart() {
	kill -HUP `cat $PIDFILE` || echo -en "\n can't reload"
}

case "$1" in
  start)
    echo -n "Starting $DESC: "
    start
  ;;
  stop)
    echo -n "Stopping $DESC: "
    stop
  ;;
  restart|reload)
    echo -n "Restarting $DESC: "
    stop
    # One second might not be time enough for a daemon to stop,
    # if this happens, d_start will fail (and dpkg will break if
    # the package is being upgraded). Change the timeout if needed
    # be, or change d_stop to have start-stop-daemon use --retry.
    # Notice that using --retry slows down the shutdown process somewhat.
    sleep 1
    start
  ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&#038;2
    exit 3
  ;;
esac

exit $?</pre>
<p>Now you need to update the rc.d directories so this service will start when you reboot your box.&#160; This simple command will do it for you:</p>
<pre class="brush: plain;">update-rc.d fcgi-hg defaults</pre>
<p>Now you’ll be able to start and stop your service like this:</p>
<pre class="brush: plain;">/etc/init.d/fcgi-hg start
/etc/init.d/fcgi-hg stop
/etc/init.d/fcgi-hg restart</pre>
<h4>Step 7:&#160; Create hguser.config for user setup</h4>
<p>I prefer not to keep my repositories open to everyone (for obvious reasons) so we need to create an htpasswd-style user configuration file.&#160; Note that since this will be used for <strong>basic</strong> authentication, credentials will be sent in plain text.&#160; If that matters to you, then you should configure your Nginx install to use SSL, but this is outside the scope of this article.&#160; Anyway, onward.&#160; You should put this file at <strong>/var/hg/hguser.config</strong></p>
<pre class="brush: plain;"># Format &lt;user&gt;:&lt;encrypted-password&gt;:&lt;comment&gt;
scott:myencryptedpassword:Scott Anderson</pre>
<p>Obviously you need to replace the username with your username, and the password with an appropriately encrypted value.&#160; If you have Ruby installed, this is easy, just launch <strong>irb</strong> and type the following command:</p>
<pre class="brush: plain;">&quot;password&quot;.crypt(&quot;salt&quot;)</pre>
<p>Copy the encrypted value into the file and you’re all set.</p>
<h4>Step 8:&#160; Modify your Nginx configuration</h4>
<p>There are about 100 ways to setup websites in Nginx, so I’ll assume you know where to place server sections.&#160; If you followed my previous tutorial, this will be in a file something like <strong>/usr/local/nginx/sites-enabled/geeksharp.com</strong>.&#160; The block should look something like this:</p>
<pre class="brush: plain;">server {
    listen 80;
    server_name dev.geeksharp.com;
    root /var/hg/;
    gzip on;

    location / {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9003;
        fastcgi_param DOCUMENT_ROOT /var/hg/;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_param SCRIPT_FILENAME /opt/hg-fastcgi/hgwebdir.fcgi;
        auth_basic 'geek# Source Control';
        auth_basic_user_file /var/hg/hgusers.config;
    }
}</pre>
<p>That’s it!&#160; You can edit all these miscellaneous files to suit your needs.&#160; If you did everything correctly, all you need to do is start the <strong>fcgi-hg</strong> script and then restart nginx.&#160; When you want to create a new repository, you should create it in <strong>/var/hg</strong> like so:</p>
<pre class="brush: plain;">hg init /var/hg/project</pre>
<p>Once you get everything running and you create a few repositories, you should see something like this:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2010/01/mercrepos.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="merc-repos" border="0" alt="merc-repos" src="http://geeksharp.com/wp-content/uploads/2010/01/mercrepos_thumb.png" width="636" height="294" /></a> </p>
<p>Hope this helps someone out there.&#160; If you have questions, or something doesn’t work, let me know and I try and help you out.&#160; Good luck! <img src='http://geeksharp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2010/01/20/mercurial-web-with-fastcgi-nginx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows + Ruby Native Gems (1.9.1)</title>
		<link>http://geeksharp.com/2010/01/18/windows-ruby-native-gems-1-9-1/</link>
		<comments>http://geeksharp.com/2010/01/18/windows-ruby-native-gems-1-9-1/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 22:30:02 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Useful Tricks]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2010/01/18/windows-ruby-native-gems-1-9-1/</guid>
		<description><![CDATA[A few weeks back I posted about getting the ruby-debug-ide gem installed in Windows under Ruby 1.8.6.&#160; In that post I outlined how hacking a header file and using the Visual C++ 2008 compiler could be leveraged to get the gem built and installed properly.&#160; Well, after a helpful comment from a reader and watching [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks back I posted about getting the <strong>ruby-debug-ide</strong> gem installed in Windows under Ruby 1.8.6.&#160; In that post I outlined how hacking a header file and using the Visual C++ 2008 compiler could be leveraged to get the gem built and installed properly.&#160; Well, after a helpful comment from a reader and watching a few screencasts over on TekPub, I actually found a way to do this with <a href="http://www.rubyinstaller.org" target="_blank">Ruby 1.9.1 from RubyInstaller.org</a>.</p>
<p>As you know, I swapped my Windows development environment for Mac OSX, and so far learning Rails has been a great pleasure thanks to <a href="http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition" target="_blank">Agile Web Development with Rails (Third Edition)</a> from <a href="http://www.pragprog.com/" target="_blank">The Pragmatic Programmers</a>.&#160; When I found this alternate method for installing <strong>ruby-debug-ide</strong> I decided to fire up my Windows 7 VM and give it a go.&#160; Here are the gems I have currently installed on my VM:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2010/01/rubydebugide1.9.1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ruby-debug-ide-1.9.1" border="0" alt="ruby-debug-ide-1.9.1" src="http://geeksharp.com/wp-content/uploads/2010/01/rubydebugide1.9.1_thumb.png" width="581" height="435" /></a> </p>
<p>To get this working on my VM, here’s the steps I followed:</p>
<ol>
<li>Install Ruby 1.9.1 from RubyInstaller.org.&#160; When you run the installer, make sure you pay attention to the checkboxes under the install path and check both of them:      <br /><a href="http://geeksharp.com/wp-content/uploads/2010/01/rubyinstallerassociations.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ruby-installer-associations" border="0" alt="ruby-installer-associations" src="http://geeksharp.com/wp-content/uploads/2010/01/rubyinstallerassociations_thumb.png" width="507" height="389" /></a> </li>
<li>Now that you have Ruby installed, you need to get the <a href="http://rubyforge.org/frs/?group_id=167" target="_blank">devkit package from Rubyforge</a>.&#160; You should see an archive in the “Development Kit” section of that page.&#160; The current version as of this writing is 3.4.5r3 (20091110). </li>
<li>Once you have the archive, you’ll need <a href="http://www.7-zip.org/" target="_blank">7-zip</a> to decompress it, so go get it and install it. </li>
<li>When you open the archive in 7-zip, click the <strong>Extract</strong> button and make sure you extract it to wherever you installed Ruby.&#160; In my case this was <strong>C:\Ruby19</strong>.       <br /><a href="http://geeksharp.com/wp-content/uploads/2010/01/rubydevkitextraction.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ruby-devkit-extraction" border="0" alt="ruby-devkit-extraction" src="http://geeksharp.com/wp-content/uploads/2010/01/rubydevkitextraction_thumb.png" width="516" height="291" /></a> </li>
<li>The last step is to make the devkit <strong>fstab</strong> file point to the proper Ruby folders.&#160; The <strong>fstab</strong> file is underneath your Ruby install.&#160; Mine was located at <strong>C:\Ruby19\devkit\msys\1.0.11\etc\fstab</strong>.&#160; Just open this file in notepad and change it.       <br /><a href="http://geeksharp.com/wp-content/uploads/2010/01/rubydevkitfstab.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ruby-devkit-fstab" border="0" alt="ruby-devkit-fstab" src="http://geeksharp.com/wp-content/uploads/2010/01/rubydevkitfstab_thumb.png" width="481" height="237" /></a> </li>
<li>Now the devkit is installed properly, all you have to do is open up a command prompt (make sure you <strong>Run As Administrator</strong>) and type the following commands (if you want to get the same gems as me):
<pre class="brush: plain;">gem install rails
gem install mongrel
gem install cucumber
gem install rspec
gem install ruby-debug-ide</pre>
</li>
</ol>
<p>That&#8217;s it!&#160; If you run into any weird issues, let me know in the comments.&#160; Enjoy your new Windows-based Ruby on Rails development environment running the latest and greatest Ruby 1.9.1! <img src='http://geeksharp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2010/01/18/windows-ruby-native-gems-1-9-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Switching to OSX Full-Time</title>
		<link>http://geeksharp.com/2010/01/14/switching-to-osx-full-time/</link>
		<comments>http://geeksharp.com/2010/01/14/switching-to-osx-full-time/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 03:33:12 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[VMWare]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2010/01/14/switching-to-osx-full-time/</guid>
		<description><![CDATA[I’ve been stuck for a while now.&#160; There are so many amazing technologies and frameworks out there, and I’ve finally decided to devote some serious time to one of the best (in my opinion) which is Rails.&#160; I know I’ve talked about this in the past, and, frankly, I’ve been either too busy or too [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been stuck for a while now.&#160; There are so many amazing technologies and frameworks out there, and I’ve finally decided to devote some serious time to one of the best (in my opinion) which is Rails.&#160; I know I’ve talked about this in the past, and, frankly, I’ve been either too busy or too lazy to seriously devote time to it.&#160; But this year I’ve decided to make a resolution to seriously learn Rails by rebuilding this blog with it.&#160; I know there are a million blog platforms out there, especially when you consider the fact that every geek seems to write their own.&#160; I know I’m going to be re-inventing the wheel here, and I am in no way disappointed with WordPress.&#160; But the best way for me to learn is to just dive in head-first and get my hands dirty, so that’s exactly what I’m doing.</p>
<p>In the spirit of truly immersing myself in Rails development, I’ve come to realize that even though it’s 100% possible to write Rails applications on Windows, the experience is less than ideal.&#160; I’m sure some of you out there are very successful Rails developers using Windows as your primary OS and more power to you!&#160; But this is my journey, and I feel like I really should use the best-of-breed development environment for the task at hand, and Windows just isn’t going to cut it.&#160; So… I decided that OSX was the best for me.&#160; It seems like the vast majority of the Rails community uses OSX for development, and I don’t mind following in their well-established footsteps!</p>
<p>“But wait!,” I hear you say, “Aren’t you a .NET developer, and don’t you have production websites running on ASP.NET MVC?”&#160; Ah, yes, my fair reader, you are correct!&#160; But in today’s world of virtualization, especially on an OSX host, there’s no reason you can’t run your entire .NET development environment inside a beefy VM, and my main machine is definitely beefy enough to handle it!&#160; See for yourself:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2010/01/vs2008onOSX.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="vs2008onOSX" border="0" alt="vs2008onOSX" src="http://geeksharp.com/wp-content/uploads/2010/01/vs2008onOSX_thumb.png" width="643" height="403" /></a> </p>
<p>On my main machine, I’m actually running Snow Leopard now.&#160; I installed OSX 10.6 from a retail DVD (thanks Apple Store!) and I’m loving every minute of it.&#160; My virtual machine is a Windows 7 32-bit install with the “Windows Classic” theme because it honestly looks cleaner to me.&#160; VMWare Fusion makes all of this possible, and I couldn’t be happier.&#160; My performance is rock solid, so far.&#160; And the best part is, now I can work in the best .NET environment through sweet virtualization, and the best Rails environment because let’s face it:&#160; TextMate on OSX is sexy as hell:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2010/01/railsdevosx.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="railsdevosx" border="0" alt="railsdevosx" src="http://geeksharp.com/wp-content/uploads/2010/01/railsdevosx_thumb.png" width="643" height="403" /></a> </p>
<p>If there’s interest in a more specific outline of how I got all this set up, I could definitely make a “How To” post or maybe a screencast that details everything.</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2010/01/14/switching-to-osx-full-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Ruby-Debug-IDE on Windows</title>
		<link>http://geeksharp.com/2009/12/18/installing-ruby-debug-ide-on-windows/</link>
		<comments>http://geeksharp.com/2009/12/18/installing-ruby-debug-ide-on-windows/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 18:24:53 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/12/18/installing-ruby-debug-ide-on-windows/</guid>
		<description><![CDATA[Lately I’ve been trying to find a good development environment for Rails on windows.&#160; I’ve tried several different environments, but so far, I haven’t found that sweet spot, yet.&#160; My latest trial environment is utilizing the new NetBeans version 6.8.&#160; I’ve used NetBeans in the past for PHP projects and I was very happy with [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I’ve been trying to find a good development environment for Rails on windows.&#160; I’ve tried several different environments, but so far, I haven’t found that sweet spot, yet.&#160; My latest trial environment is utilizing the new <a href="http://www.netbeans.org/" target="_blank">NetBeans</a> version 6.8.&#160; I’ve used NetBeans in the past for PHP projects and I was very happy with it, so I figured if the Rails support was at least as good as the PHP support, it would be a slam dunk.&#160; After installing NetBeans I noticed that it installs it’s own version of ruby (<a href="http://jruby.org/" target="_blank">JRuby</a>), which is fine for most people, I’m sure, but I prefer to have my own Ruby environment running the official Ruby releases for Windows.&#160; Something about a Java implementation of Ruby is a turn-off for me, and besides, if I ever wanted to run an alternative Ruby implementation, it would probably end up being <a href="http://www.ironruby.net" target="_blank">IronRuby</a> because Jon Lam and Jimmy Schementi are awesome, and being able to call the .NET framework from within Ruby is very sexy.</p>
<p>Before I get going with NetBeans, I want to make sure my Ruby environment is ready.&#160; The version of Ruby I have installed is from the one-click installer on <a href="http://www.ruby-lang.org/en/downloads/" target="_blank">ruby-lang.org</a>.&#160; The current version is 1.8.6 and it’s about 25 MB.&#160; During installation, it will give you the opportunity to install rubygems, and I always check that box.&#160; Once the installer is finished, you will notice that the “gem” and “ruby” executables have been added to your path.&#160; There are 3 packages that need to be installed after that to get your Rails environment ready:</p>
<pre class="brush: plain;">gem install rails
gem install mongrel
gem install sqlite3-ruby</pre>
<p>You’ll get a lot of various “No definition” warnings when installing sqlite3-ruby which can safely be ignored.&#160; When I’m developing locally, I tend to use sqlite3 for my Rails databases because it’s quick and painless.&#160; I also prefer the Mongrel webserver over the default WEBrick because it’s much faster.</p>
<p>Now that Ruby on Rails is ready, I loaded up NetBeans for the first time.&#160; One of the nice things about NetBeans is that it detected my default Rails environment almost immediately, however when examining the settings for this environment, I noticed that the “Classic Debugger” was installed:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2009/12/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://geeksharp.com/wp-content/uploads/2009/12/image_thumb.png" width="637" height="396" /></a> </p>
<p>When I tried to click the “Install Fast Debugger” button, gem spit out some nasty errors about not being able to build the packages from source.&#160; The error it specifically stated that it couldn’t find nmake, despite the fact that I have Visual C++ 2008 Professional installed.&#160; The fix for this error was easy.&#160; I popped open a Visual Studio 2008 Command Prompt:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2009/12/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://geeksharp.com/wp-content/uploads/2009/12/image_thumb1.png" width="411" height="476" /></a> </p>
<p>From this prompt, I attempted to install the package manually by running the following command:</p>
<pre class="brush: plain;">gem install ruby-debug-ide</pre>
<p>Which ultimately lead to this lovely error:</p>
<pre class="brush: plain;">c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal error C1189: #error :  MSC version unmatch
NMAKE : fatal error U1077: '&quot;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\cl.EXE&quot;' : return code '0x2'
Stop.</pre>
<p>At this point I do a little digging and find <a href="http://rubyforge.org/tracker/index.php?func=detail&amp;aid=16774&amp;group_id=1900&amp;atid=7436" target="_blank">this post on RubyForge</a> about building ruby-debug from scratch on Windows.&#160; I’m no C++ guru, but the last comment by Fred Seltzer says:</p>
<blockquote><p>Hmmm. I just hacked up my copy of config.h to no longer<br />
require the specific version of the C compiler and it built<br />
and ran just fine. I don&#8217;t want to go back and revisit<br />
this. Let&#8217;s call it closed&#8230; </p>
<p>Fredonrails&#8230;</p></blockquote>
<p>Aha!&#160; The light bulb in my head turns on and I decide to go check out this nefarious “config.h” sitting in my Ruby installation (you can see the full path in the error message above).&#160; When I open the config.h, I see the first 3 lines look something like this:</p>
<pre class="brush: cpp;">#if _MSC_VER != 1200
#error MSC version unmatch
#endif</pre>
<p>After I removed these 3 lines, I tried the command again, and alas, ruby-debug-ide installed!</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2009/12/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://geeksharp.com/wp-content/uploads/2009/12/image_thumb2.png" width="632" height="388" /></a> </p>
<p>I hope this helps other folks out there to get ruby-debug-ide installed.&#160; I know it’s sort of a pain in the rear, but it worked for me.&#160; I’m pretty sure this will work with Visual C++ 2008 Express, also, but I don’t have it installed so I couldn’t confirm for sure.&#160; If you don’t mind chewing up a little hard drive space, this method will save you some time in the long run.&#160; Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/12/18/installing-ruby-debug-ide-on-windows/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Nginx and Rails and PHP, Oh My!</title>
		<link>http://geeksharp.com/2009/12/09/nginx-and-rails-and-php-oh-my/</link>
		<comments>http://geeksharp.com/2009/12/09/nginx-and-rails-and-php-oh-my/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 05:45:14 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://geeksharp.com/?p=39</guid>
		<description><![CDATA[As you could probably guess, my blog (and several sites of my friends) are hosted on a lovely Linux VPS provided by Linode.  I honestly can’t say enough nice things about the service and reliability I’ve received from Linode (and no they don’t pay me to speak highly of them!).  But that’s not really the [...]]]></description>
			<content:encoded><![CDATA[<p>As you could probably guess, my blog (and several sites of my friends) are hosted on a lovely Linux VPS provided by <a href="http://www.linode.com/" target="_blank">Linode</a>.  I honestly can’t say enough nice things about the service and reliability I’ve received from Linode (and no they don’t pay me to speak highly of them!).  But that’s not really the point of this post.  The point is actually quite simple:  My VPS doesn’t have a lot of memory, and I’m always wary of my resource consumption.  A few months ago, I moved from <a href="http://www.apache.org/" target="_blank">Apache</a> to <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a> for this reason, alone.  Let’s face it… Apache is a memory hog, and that problem is well-documented, so I won’t really go into details here.  “Lighty” has served me well for the past few months, but for reasons I’m about to explain, I felt the need to move to a different platform.</p>
<p>So earlier this year I wrote a post about how I wanted to learn <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>.  For a while now, I’ve put that project on the back burner.  I decided after my last post on the subject that <a href="http://www.asp.net/mvc/" target="_blank">ASP.NET MVC</a> was more fitting for me because, let’s face it, I’m a .NET developer right?  And aren’t .NET developers supposed to stick with .NET stuff?  After deploying my first site using ASP.NET MVC, I came away with a feeling that it was a little heavier than I’d like it to be, and I really don’t like paying for another separate Windows VPS just to host one website!  There’s also the fact that Linux is way more efficient in limited resource deployments (like VPS’s).  All of this boils down to the fact that Rails called to me once again, and I decided that if I was going to do Rails development, I needed to figure out the deployment environment.</p>
<p>After doing some research, <a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition</a> and <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a> seemed like the obvious choice for production Rails deployment.  Both products value resource management in environments just like mine, and the numbers they claim to achieve were very impressive!  If you want to run Phusion Passenger, however, your choices in a web server are limited to Apache or <a href="http://nginx.net/" target="_blank">Nginx</a>.  Considering my previous encounters with Apache, I decided Nginx was the way to go.  That said, after hours of fussing getting this environment set up properly, I decided that it would be best if I contributed a guide to the community.  This wasn’t the easiest process in the world, and I hope this tutorial can help someone else avoid the headaches that I faced.</p>
<h4>Step 1: Environment and pre-requisites</h4>
<p>First and foremost, I use a 32-bit version of Ubuntu 9.10 Karmic Koala on my VPS.  the instructions you see are specific to my environment, but I’m sure they could be adapted for use in others.  On my server, there were some packages that were necessary pre-requisites.  Here are the steps to install them:</p>
<p>First, edit your /etc/apt/sources.list and remove the comment marks (#) in front of the universe repository lines</p>
<pre class="brush: plain;">deb http://us.archive.ubuntu.com/ubuntu/ karmic universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic universe
deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb http://security.ubuntu.com/ubuntu karmic-security universe
deb-src http://security.ubuntu.com/ubuntu karmic-security universe</pre>
<p>Next you need to issue the following commands to get all the rest of the packages you need:</p>
<pre class="brush: plain;">sudo apt-get update
sudo apt-get install build-essential libxml2-dev libssl-dev libbz2-dev curl libcurl4-openssl-dev libpng12-dev libmcrypt-dev mysql-server libmysqlclient-dev libxslt1-dev autoconf2.13 libltdl-dev libreadline5-dev libsqlite3-ruby postgresql-server-dev-8.4 libpcre3-dev</pre>
<p>Next you need to install libevent.  There is a version of this in the repository, but it&#8217;s pretty out of date, and PHP-FPM prefers the newer version.  For this requirement, I decided to compile from source.  Use the following commands to get this installed.</p>
<pre class="brush: plain;">wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure
make &amp;&amp; sudo make install</pre>
<h4>Step 2: Compiling PHP  from source with Suhosin and PHP-FPM</h4>
<p>So the reason I decided to compile PHP from source is because it&#8217;s the easiest way (for me) to apply the PHP-FPM patch and make sure I have everything I need.  I realize that there may be some Ubuntu packages out there at some point, but there weren&#8217;t any that were easily found when I performed these steps.  That said, our first step is to snag the PHP source and then apply the Suhosin patch.</p>
<pre class="brush: plain;">wget http://us2.php.net/get/php-5.3.1.tar.bz2/from/this/mirror
bzip2 -dc php-5.3.1.tar.bz2 | tar xf -
wget http://download.suhosin.org/suhosin-patch-5.3.1-0.9.8.patch.gz
gunzip suhosin-patch-5.3.1-0.9.8.patch.gz
patch -d php-5.3.1 -p1 &lt; suhosin-patch-5.3.1-0.9.8.patch</pre>
<p>Now we have to install the PHP-FPM patch.  In order to do this, we actually need a legacy version of autoconf and autoheader, because the PHP buildconf script relies on them.  Luckily, they were installed earlier when we grabbed stuff from the Ubuntu repositories.  All we have to do is set some environment variables to force the legacy versions to be used.  Then we can just apply the patch and compile PHP.</p>
<pre class="brush: plain;">export PHP_AUTOCONF=/usr/bin/autoconf2.13
export PHP_AUTOHEADER=/usr/bin/autoheader2.13
wget http://launchpad.net/php-fpm/master/0.6/+download/php-fpm-0.6~5.3.1.tar.gz
tar -zxf php-fpm-0.6~5.3.1.tar.gz
php-fpm-0.6-5.3.1/generate-fpm-patch
patch -d php-5.3.1 -p1 &lt; fpm.patch
cd php-5.3.1
./buildconf --force
./configure --enable-bcmath --with-bz2 --enable-calendar --with-fpm --with-libevent=shared --with-curl --enable-dba --enable-exif --enable-ftp --with-gd --with-gettext --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --with-openssl --with-pcre-regex --enable-shmop --enable-soap --enable-sockets --enable-sysvmsg --enable-wddx --enable-zip --with-zlib --enable-sysvsem --enable-sysvshm --with-mcrypt --enable-pcntl --enable-mbregex --with-mhash --with-xsl
sudo make all install</pre>
<h4>Step 3: Compiling Ruby Enterprise Edition and Nginx</h4>
<p>Now that PHP-FPM is installed, we need to get Nginx up and running.  The good part is that Ruby Enterprise Edition comes bundled with Phusion Passenger which will handle compiling Nginx for us.  We do, however, need to download the Nginx source manually because there are some options that we&#8217;d like to pass to the Nginx configure script.</p>
<pre class="brush: plain;">cd ..
wget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz
tar -zxf nginx-0.7.64.tar.gz
wget http://rubyforge.org/frs/download.php/66162/ruby-enterprise-1.8.7-2009.10.tar.gz
tar -zxf ruby-enterprise-1.8.7-2009.10.tar.gz
sudo ruby-enterprise-1.8.7-2009.10/installer</pre>
<p>The cool part about Ruby Enterprise Edition is that it&#8217;s completely isolated from the rest of your system, and it installs most of the default gems for you.  As a matter of fact, the only thing left to do is to actually install Nginx with Phusion Passenger support, and that&#8217;s exactly what we&#8217;re doing next!</p>
<pre class="brush: plain;">sudo /opt/ruby-enterprise-1.8.7-2009.10/bin/passenger-install-nginx-module</pre>
<p>While running through this installer, there are a series of prompts.  Be sure you answer the following:</p>
<pre class="brush: plain;">Enter your choice (1 or 2) or press Ctrl-C to abort: 2
Please specify the directory: &lt;enter your directory, in my case it was /home/scott/nginx-0.7.64&gt;
Please specify a prefix directory [/opt/nginx]: /usr/local/nginx
Extra arguments to pass to configure script: --sbin-path=/usr/local/sbin --with-http_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --with-http_gzip_static_module</pre>
<h4>Step 4: Configuration of PHP-FPM and Nginx</h4>
<p>Sweet!  At this point you should have a shiny new Nginx install.  Before we can start it up, though, there are a few configuration files we have to mess with.  First we need to configure PHP-FPM to run as the proper user and place a default php.ini file in the appropriate directory.  First, let&#8217;s edit php-fpm.conf.  There are 4 lines we need to change, so just search through the file and make sure they look like this:</p>
<pre class="brush: plain;">&lt;value name="owner"&gt;www-data&lt;/value&gt;
&lt;value name="group"&gt;www-data&lt;/value&gt;
&lt;value name="user"&gt;www-data&lt;/value&gt;
&lt;value name="group"&gt;www-data&lt;/value&gt;</pre>
<p>Next we need to copy in the default php.ini file from the source directory.</p>
<pre class="brush: plain;">sudo cp php-5.3.1/php.ini-production /usr/local/etc/php.ini</pre>
<p>Finally, we need to configure Nginx.  I don&#8217;t like having one huge configuration file, so I really like to split things up.  You can edit this to your liking, but here&#8217;s basically how I set my default config (found at /usr/local/nginx/conf/nginx.conf):</p>
<pre class="brush: plain;">user  www-data;
worker_processes  6;

events {
 worker_connections  1024;
}

http {
 include       mime.types;
 default_type  application/octet-stream;
 sendfile        on;
 keepalive_timeout  10 10;

 passenger_root /opt/ruby-enterprise-1.8.7-2009.10/lib/ruby/gems/1.8/gems/passenger-2.2.7;
 passenger_ruby /opt/ruby-enterprise-1.8.7-2009.10/bin/ruby;

 gzip  on;
 gzip_comp_level 1;
 gzip_proxied any;
 gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

 log_format main '$remote_addr - $remote_user [$time_local] '
 '"$request" $status  $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';

 access_log  /var/log/nginx_access.log main;

 error_log  /var/log/nginx_error.log crit;

 include /usr/local/nginx/sites-enabled/*;
}</pre>
<p>Now we need to set some default fastcgi options in /usr/local/nginx/conf/fastgci_params.  I just appended these to the end of the file.</p>
<pre class="brush: plain;">fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;</pre>
<p>Next, I like to create a &#8220;/usr/local/nginx/sites-enabled&#8221; directory that houses each website&#8217;s configuration details.  First I&#8217;ll show the configuration I used to handle URL rewrites for Wordpress (this blog).  I called the file /usr/local/nginx/sites-enabled/geeksharp.com.</p>
<pre class="brush: plain;">server {
 listen 80;
 server_name *.geeksharp.com *.geeksharp.info *.geeksharp.org geeksharp.info geeksharp.org;
 rewrite ^(.*) http://geeksharp.com$1 permanent;
}

server {
 listen 80;
 server_name geeksharp.com;
 location / {
 root   /var/www;  # absolute path to your WordPress installation
 index  index.php index.html index.htm;

 # this serves static files that exist without running other rewrite tests
 if (-f $request_filename) {
 expires 30d;
 break;
 }

 # this sends all non-existing file or directory requests to index.php
 if (!-e $request_filename) {
 rewrite ^(.+)$ /index.php?q=$1 last;
 }
 }

 location ~ \.php$ {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
 include fastcgi_params;
 }
}</pre>
<p>Here&#8217;s how I&#8217;d set up a rails site.  In this example, the file is called /usr/local/nginx/sites-enabled/geeksharp.net.</p>
<pre class="brush: plain;">server {
 listen 80;
 server_name *.geeksharp.net;
 rewrite ^(.*) http://geeksharp.net$1 permanent;
}

server {
 listen 80;
 server_name geeksharp.net;
 root /home/scott/geeksharp.net/public;
 passenger_enabled on;
 access_log /home/scott/geeksharp.net-access.log;
 error_log /home/scott/geeksharp.net-error.log;
}</pre>
<h4>Step 5: Startup scripts</h4>
<p>Finally, I like to ensure that all my stuff comes up when the system reboots, so here&#8217;s a neato Nginx init.d script that I found.  Place this file at /etc/init.d/nginx, and make sure you give it execute permissions (chmod +x!)</p>
<pre class="brush: plain;">#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
 . /etc/default/nginx
fi

set -e

case "$1" in
 start)
 echo -n "Starting $DESC: "
 start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
 --exec $DAEMON -- $DAEMON_OPTS
 echo "$NAME."
 ;;
 stop)
 echo -n "Stopping $DESC: "
 start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
 --exec $DAEMON
 echo "$NAME."
 ;;
 restart|force-reload)
 echo -n "Restarting $DESC: "
 start-stop-daemon --stop --quiet --pidfile \
 /usr/local/nginx/logs/$NAME.pid --exec $DAEMON
 sleep 1
 start-stop-daemon --start --quiet --pidfile \
 /usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
 echo "$NAME."
 ;;
 reload)
 echo -n "Reloading $DESC configuration: "
 start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
 --exec $DAEMON
 echo "$NAME."
 ;;
 *)
 N=/etc/init.d/$NAME
 echo "Usage: $N {start|stop|restart|force-reload}" &gt;&amp;2
 exit 1
 ;;
esac

exit 0</pre>
<p>Finally, make sure you update your rc.d</p>
<pre class="brush: plain;">sudo update-rc.d nginx defaults
sudo update-rc.d php-fpm defaults</pre>
<p>Please note that if for some reason nginx won&#8217;t start, chances are you have a config issue.  When you issue a restart command, the config errors usually will not be displayed.  The best way to track them down is to is to simply issue a stop command followed by a start command, and your errors will be displayed.  If you ever need to restart your services manually, you can use these commands (I find that restart can be buggy, which is why I explicity stop and start each one):</p>
<pre class="brush: plain;">sudo /etc/init.d/php-fpm stop &amp;&amp; sudo /etc/init.d/php-fpm start
sudo /etc/init.d/nginx stop &amp;&amp; sudo /etc/init.d/nginx start</pre>
<p>So that&#8217;s it! I know this is an epic post, but I hope it helps someone. Leave comments if you have specific questions or if I left out something particularly useful. Again, I understand that there&#8217;s probably a better way to do something, so feel free to share your thoughts!  As a final thought, I would like to thank <a href="http://interfacelab.com/nginx-php-fpm-apc-awesome/" target="_blank">Joshua Dorkin</a> for providing a great article on which I based a lot of this material!</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/12/09/nginx-and-rails-and-php-oh-my/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microsoft Web Platform Installer</title>
		<link>http://geeksharp.com/2009/11/29/microsoft-web-platform-installer/</link>
		<comments>http://geeksharp.com/2009/11/29/microsoft-web-platform-installer/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 23:20:00 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General Information]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Windows Server]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/11/29/microsoft-web-platform-installer/</guid>
		<description><![CDATA[A while back I wrote about my experiences installing SQL (and additionally .NET 3.5 SP1) on a Windows Server 2008 VPS.&#160; For various reasons I decided not to keep the VPS server at the time (mostly because of the cost, and the fact that I didn’t really have a strong need for it).&#160; Recently, however, [...]]]></description>
			<content:encoded><![CDATA[<p>A while back I wrote about my experiences installing SQL (and additionally .NET 3.5 SP1) on a Windows Server 2008 VPS.&#160; For various reasons I decided not to keep the VPS server at the time (mostly because of the cost, and the fact that I didn’t really have a strong need for it).&#160; Recently, however, I’ve really begun to ramp up my ASP.NET MVC development work, and it’s blatantly apparent that I need a Windows server full time.&#160; After shopping around for a while, I decided to go back to <a href="http://www.kickassvps.com/" target="_blank">KickAssVPS.com</a> and see what their packages looked like.&#160; Having ordered my shiny new VPS, the next step was to get the environment configured for hosting my MVC applications.</p>
<p>Earlier this year I attended MIX09, and one of the key takeaways was the <a href="http://www.microsoft.com/web/Downloads/platform.aspx" target="_blank">Microsoft Web Platform Installer</a>.&#160; Microsoft has realized that for the “average Joe,” setting up a new Windows-based web server with all the necessary configurations and supporting frameworks can be rather cumbersome.&#160; This is even more obvious when you begin to work with IIS7, given the fact that the administration system has changed drastically.&#160; The idea behind this specialized installer is to perform all of the work for you.&#160; Sounds neat, huh?&#160; Well after screwing around with my VPS for hours, I can tell you that things aren’t exactly as easy as they seem.&#160; To make a very long story quite a bit shorter, I’ve found through my troubles that things need to be installed in a very specific order:</p>
<ol>
<li>Grab the <a href="http://www.microsoft.com/web/Downloads/platform.aspx" target="_blank">Web Platform Installer</a>. </li>
<li>Open the “Web Platform” tab and ensure that you only install components from the “Web Server” and “Frameworks and Runtimes” sections.&#160; You might be tempted to add in SQL Server 2008 Express, but <strong>don’t</strong>.&#160; Trust me when I tell you this. </li>
<li>Once everything is finished (which will take forever), now you can attempt to install the SQL Server 2008 Express SP1 package, but don’t bother with the Express Management Studio because it will fail no matter what.&#160; If you must have this package, I recommend purchasing a license for Microsoft SQL Server Developer edition and installing only the client tools on the VPS.&#160; No matter which way I tried, I could never get the Express Management Studio to install properly. </li>
<li>Pray to the Microsoft gods that everything goes without a hitch. </li>
<li>If you’re lucky, you have a working Windows-based web server. </li>
</ol>
<p>Good luck to the brave souls that wish to venture into this territory.&#160; I had nothing but issues with it and I wonder if I wouldn’t have been more successful if I’d have just done it manually from the start.&#160; Perhaps these issues are just because of the VPS environment that I’m installing in, but I can’t be the only one out there that uses a virtual server for their web deployments!</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/11/29/microsoft-web-platform-installer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning Rails (and Ruby too!)</title>
		<link>http://geeksharp.com/2009/06/06/learning-rails-and-ruby-too/</link>
		<comments>http://geeksharp.com/2009/06/06/learning-rails-and-ruby-too/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 04:16:19 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/06/06/learning-rails-and-ruby-too/</guid>
		<description><![CDATA[Over the past couple days I’ve been reading what’s shaping up to be an excellent book about Ruby on Rails called “Agile Web Development with Rails (Third Edition).”&#160; This book takes a practical approach to teaching Rails by building a demonstration shopping cart application called “Depot.”&#160; I must say that, so far, learning Rails has [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past couple days I’ve been reading what’s shaping up to be an excellent book about <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a> called “<a href="http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition" target="_blank">Agile Web Development with Rails (Third Edition)</a>.”&#160; This book takes a practical approach to teaching Rails by building a demonstration shopping cart application called “Depot.”&#160; I must say that, so far, learning Rails has been a complete pleasure.&#160; I really enjoy the MVC methodology and the idea of “convention over configuration.”&#160; The basic idea behind Rails is that we (as web developers) generally know what we’re doing, and we can follow some simple default conventions to avoid the mountains of configuration files that are so common in other technologies and frameworks (ASP.NET is a prime example of those “other” technologies).</p>
<p>Over the next few weeks I plan on spending a lot more time with Rails and <a href="http://www.asp.net/mvc/" target="_blank">ASP.NET MVC</a>.&#160; My end goal is to present an overview of the benefits and faults of each technology, and hopefully I can provide a somewhat objective point of view for people new to MVC.&#160; Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/06/06/learning-rails-and-ruby-too/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Password Hashing in .NET</title>
		<link>http://geeksharp.com/2009/05/15/mysql-password-hashing-in-net/</link>
		<comments>http://geeksharp.com/2009/05/15/mysql-password-hashing-in-net/#comments</comments>
		<pubDate>Fri, 15 May 2009 15:01:08 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Useful Tricks]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Cryptography]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SHA1]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/05/15/mysql-password-hashing-in-net/</guid>
		<description><![CDATA[As I was surfing through StackOverflow today, I noticed a question that got me thinking.&#160; This developer had been working with a classic ASP application that used MySQL for it’s backend database.&#160; The project on his plate was to convert this application to ASP.NET with MS-SQL as the database.&#160; The only problem he encountered was [...]]]></description>
			<content:encoded><![CDATA[<p>As I was surfing through <a href="http://stackoverflow.com/questions/868482/simulating-mysqls-password-encryption-using-net-or-ms-sql/" target="_blank">StackOverflow</a> today, I noticed a question that got me thinking.&#160; This developer had been working with a classic ASP application that used MySQL for it’s backend database.&#160; The project on his plate was to convert this application to ASP.NET with MS-SQL as the database.&#160; The only problem he encountered was the fact that passwords were stored in the database using a MySQL-specific hashing algorithm called via the PASSWORD() function.&#160; He needed a way to convert these passwords to .NET.</p>
<p>Given that I have a MySQL database laying around, I decided to poke around in the source code to see exactly how MySQL’s PASSWORD() function really works.&#160; It didn’t take me long to find inside the file “libmysql/password.c” this little gem:</p>
<pre class="brush: objc;">/*
    MySQL 4.1.1 password hashing: SHA conversion (see RFC 2289, 3174) twice
    applied to the password string, and then produced octet sequence is
    converted to hex string.
    The result of this function is used as return value from PASSWORD() and
    is stored in the database.
  SYNOPSIS
    make_scrambled_password()
    buf       OUT buffer of size 2*SHA1_HASH_SIZE + 2 to store hex string
    password  IN  NULL-terminated password string
*/

void
make_scrambled_password(char *to, const char *password)
{
  SHA1_CONTEXT sha1_context;
  uint8 hash_stage2[SHA1_HASH_SIZE];

  mysql_sha1_reset(&amp;sha1_context);
  /* stage 1: hash password */
  mysql_sha1_input(&amp;sha1_context, (uint8 *) password, (uint) strlen(password));
  mysql_sha1_result(&amp;sha1_context, (uint8 *) to);
  /* stage 2: hash stage1 output */
  mysql_sha1_reset(&amp;sha1_context);
  mysql_sha1_input(&amp;sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
  /* separate buffer is used to pass 'to' in octet2hex */
  mysql_sha1_result(&amp;sha1_context, hash_stage2);
  /* convert hash_stage2 to hex string */
  *to++= PVERSION41_CHAR;
  octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE);
}</pre>
<p>As you can see, the password algorithm uses a double-SHA1 hash to format the password.&#160; The other little tidbit is that any passwords generated post-4.1 will be pre-pended with an asterisk (*).&#160; Given that I have spent a fair amount of time recently working with cryptography in .NET, it didn’t take long to adapt this code to C#.&#160; The following function produces the same output as the MySQL PASSWORD() function.</p>
<pre class="brush: csharp;">public string GeneralteMySQLHash(string key)
{
    byte[] keyArray = Encoding.UTF8.GetBytes(key);
    SHA1Managed enc = new SHA1Managed();
    byte[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray));
    StringBuilder myBuilder = new StringBuilder(encodedKey.Length);

    foreach (byte b in encodedKey)
        myBuilder.Append(b.ToString(&quot;X&quot;));

    return &quot;*&quot; + myBuilder.ToString();
}</pre>
<p>I hope this helps someone out there. I know it was kinda of fun to put on my super-slueth hat for a while <img src='http://geeksharp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Update 5/29/2009:</strong> I found a neat way to do this in T-SQL also.  It&#8217;s a bit ugly, but it works!</p>
<pre class="brush: sql;">SELECT '*' + SUBSTRING(master.dbo.fn_varbintohexstr(HASHBYTES('SHA1',HASHBYTES('SHA1','VALUE-TO-ENCRYPT-GOES-HERE'))),1,42)</pre>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/05/15/mysql-password-hashing-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET 3.5 SP1 on a Windows 2008 VPS</title>
		<link>http://geeksharp.com/2009/05/05/net-35-sp1-on-a-windows-2008-vps/</link>
		<comments>http://geeksharp.com/2009/05/05/net-35-sp1-on-a-windows-2008-vps/#comments</comments>
		<pubDate>Tue, 05 May 2009 16:42:39 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General Information]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[vps]]></category>
		<category><![CDATA[Windows Server]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/05/05/net-35-sp1-on-a-windows-2008-vps/</guid>
		<description><![CDATA[Recently I’ve been debating moving my site over to a Windows VPS.&#160; If I make this move, I’m hoping to take advantage of the new features available in Windows Server 2008 as well as .NET 3.5 SP1 and IIS 7.&#160; After some preliminary research, I decided to give KickAssVPS.com a try.&#160; Within a few hours [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I’ve been debating moving my site over to a Windows VPS.&#160; If I make this move, I’m hoping to take advantage of the new features available in Windows Server 2008 as well as .NET 3.5 SP1 and IIS 7.&#160; After some preliminary research, I decided to give <a href="http://www.kickassvps.com/" target="_blank">KickAssVPS.com</a> a try.&#160; Within a few hours of my order, they had my VPS up and running, and so far I’ve been fairly pleased with the performance.</p>
<p>When I logged into my VPS, one of the things I wanted to install right away was SQL Server 2008.&#160; In order for SQL Server 2008 to install, you must first have installed the Microsoft .NET Framework 3.5 SP1.&#160; I figured it was no big deal and decided to let SQL handle my install.&#160; Once the installer got going, it immediately halted and displayed an error message telling me it couldn’t be installed.&#160; After checking the log file, I found the following:</p>
<blockquote><p>WapUI: [2] DepCheck indicates Microsoft .NET Framework 2.0SP1 (x64) (CBS) is not installed. </p></blockquote>
<p>Obviously on Windows Server 2008 SP1, the .NET Framework 2.0SP1 is already installed by default.&#160; Just to prove it to myself, I downloaded and ran the installer.&#160; Sure enough, it failed before it even started, telling me that it could not be installed on Windows Vista.&#160; So I began to poke around the VPS.&#160; One of the things that jumped out at me was the fact that the Windows Update service was disabled.&#160; When I checked with my VPS provider’s documentation, they indicated that Windows updates must be disabled because they are slipstreamed into the OS build.&#160; Updating your VPS through Windows Update can (and probably will) break it.&#160; Yikes!</p>
<p>After a bit more searching, I found a solution to the problem.&#160; It turns out that the .NET Framework 3.5 SP1 installer requires the Windows Update service to be running, but you can still set your server to “Never check for updates.”&#160; By temporarily enabling the Windows Update service, I was able to install .NET 3.5 SP1 without a hitch.&#160; I hope this helps anyone else using a VPS, because it sure gave me a little bit of a headache!</p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/05/05/net-35-sp1-on-a-windows-2008-vps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delicious Toolbar Icon Woes</title>
		<link>http://geeksharp.com/2009/04/17/delicious-toolbar-icon-woes/</link>
		<comments>http://geeksharp.com/2009/04/17/delicious-toolbar-icon-woes/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 18:21:25 +0000</pubDate>
		<dc:creator>Scott Anderson</dc:creator>
				<category><![CDATA[Useful Tricks]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://geeksharp.com/2009/04/17/delicious-toolbar-icon-woes/</guid>
		<description><![CDATA[Recently I’ve begun using the popular bookmarking service <a href="http://www.delicious.com" target="_blank">Delicious</a>.  One of my favorite features of this service is that I can install the associated <a href="http://delicious.com/help/quicktour/firefox" target="_blank">Firefox add-on</a>, and this enables a handy bookmarks toolbar that stays synchronized between my home and work computers.  Recently, however, I’ve noticed a strange incompatibility with the theme I use in Firefox.  For some reason, while using the <a href="https://addons.mozilla.org/en-US/firefox/addon/4129" target="_blank">myFireFox theme</a>, the icons placed in the favorites bar are sometimes improperly sized which makes for a relatively ugly experience.  Read more to see the rest!]]></description>
			<content:encoded><![CDATA[<p>Recently I’ve begun using the popular bookmarking service <a href="http://www.delicious.com" target="_blank">Delicious</a>.  One of my favorite features of this service is that I can install the associated <a href="http://delicious.com/help/quicktour/firefox" target="_blank">Firefox add-on</a>, and this enables a handy bookmarks toolbar that stays synchronized between my home and work computers.  Recently, however, I’ve noticed a strange incompatibility with the theme I use in Firefox.  For some reason, while using the <a href="https://addons.mozilla.org/en-US/firefox/addon/4129" target="_blank">myFireFox theme</a>, the icons placed in the favorites bar are sometimes improperly sized which makes for a relatively ugly experience:</p>
<p><a href="http://geeksharp.com/wp-content/uploads/2009/04/brokendelicons.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Yes I know it looks just like IE8, but I like it that way!" src="http://geeksharp.com/wp-content/uploads/2009/04/brokendelicons-thumb.png" border="0" alt="Yes I know it looks just like IE8, but I like it that way!" width="606" height="443" /></a></p>
<p>Notice the huge icon next to my link for my Doctor’s Office in the photo above?  This was driving me crazy, so I started looking for ways to fix it without having to switch my theme (I know it looks just like IE8, and that’s on purpose!).  After searching for solutions, I really didn’t find any other instances of folks having the same problem, so I set out to devise my own solution.  This solution works best if you have the <a href="https://addons.mozilla.org/en-US/firefox/addon/2108" target="_blank">Stylish add-on</a> installed.</p>
<ol>
<li>Install Stylish</li>
<li>Navigate to <strong>Tools</strong> &gt; <strong>Add-ons</strong>, then find Sylish in the list and click <strong>Options</strong>.</li>
<li>Click the <strong>Write</strong> button and paste the following code:
<pre class="brush: css;">@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
@-moz-document url(chrome://browser/content/browser.xul) {
  #ybToolbar-bookmarksview{
    height:0px !important;
  }
  #ybToolbar .toolbarbutton-icon{
    height:16px !important;
    width:16px!important;
  }
  #ybToolbar-chevron .toolbarbutton-icon{
    height: 5px !important;
    width: 7px !important;
  }
}</pre>
</li>
<li>Save your script and enjoy your fixed delicious toolbar!</li>
</ol>
<p>Good luck, and happy hacking! <img src='http://geeksharp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://geeksharp.com/2009/04/17/delicious-toolbar-icon-woes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
