<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="https://www.w3.org/2005/Atom">

 <title>David Radcliffe</title>
 <link href="https://dwradcliffe.com/atom.xml" rel="self"/>
 <link href="https://dwradcliffe.com/"/>
 <updated>2022-07-23T18:55:33+00:00</updated>
 <id>https://dwradcliffe.com/</id>
 <author>
   <name>David Radcliffe</name>
   <email>david@etchdev.com</email>
 </author>

 
 <entry>
   <title>Testing TLS_FALLBACK_SCSV</title>
   <link href="https://dwradcliffe.com/2014/10/16/testing-tls-fallback.html"/>
   <updated>2014-10-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2014/10/16/testing-tls-fallback</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html&quot;&gt;POODLE is on the loose&lt;/a&gt; and we’re all trying to kill off SSLv3 and enable this new &lt;a href=&quot;https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00&quot;&gt;TLS_FALLBACK_SCSV&lt;/a&gt; thing. I had a hard time finding this information but it’s actually pretty easy to test TLS_FALLBACK_SCSV.&lt;/p&gt;

&lt;p&gt;You will need the latest version of &lt;a href=&quot;https://www.openssl.org/source/&quot;&gt;OpenSSL - 1.0.1j&lt;/a&gt;. I use homebrew, so it was easy to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew upgrade openssl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s_client&lt;/code&gt; command to initiate a connection:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ openssl s_client -connect www.example.com:443 -fallback_scsv -no_tls1_2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s what that means. We use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-connect&lt;/code&gt; param to specify the server and port we want to connect to. We use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-fallback_scsv&lt;/code&gt; param to send TLS_FALLBACK_SCSV in the ClientHello. The final param, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-no_tls1_2&lt;/code&gt; tells the client to not use TLSv1.2 and drop the protocol down to TLSv1.1. This assumes your server supports TLSv1.2. If not, you need to prevent the use of the best supported protocol.&lt;/p&gt;

&lt;p&gt;When we issue this command, we will get one of two responses. First let’s look at an example of a server that supports TLS_FALLBACK_SCSV properly:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ openssl s_client -connect www.google.com:443 -fallback_scsv -no_tls1_2
140735103538016:error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback:s23_clnt.c:770:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We see that the connection fails and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alert inappropriate fallback&lt;/code&gt; is returned.&lt;/p&gt;

&lt;p&gt;Now let’s look at a server that does not support TLS_FALLBACK_SCSV:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ openssl s_client -connect www.twitter.com:443 -fallback_scsv -no_tls1_2
CONNECTED(00000003)
...
SSL-Session:
Protocol  : TLSv1.1
Cipher    : ECDHE-RSA-AES128-SHA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The connection is successful even though we attempted a ‘fallback’ connection.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Chef DK alongside rbenv</title>
   <link href="https://dwradcliffe.com/2014/09/19/chefdk-with-rbenv.html"/>
   <updated>2014-09-19T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2014/09/19/chefdk-with-rbenv</id>
   <content type="html">&lt;p&gt;Chef recently released the &lt;a href=&quot;https://downloads.getchef.com/chef-dk/&quot;&gt;Chef Development Kit&lt;/a&gt; to help developers get their environment configured for Chef easily. This package includes Chef, Berkshelf, Test Kitchen and more. The idea is that to work on a cookbook or chef environment you wouldn’t need to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; or setup any other rubies/gems/dependencies to get started working. This is a great idea and probably the best side effect is that we don’t need to type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec&lt;/code&gt; anymore!&lt;/p&gt;

&lt;p&gt;However, Chef DK works best when it’s your primary and only ruby environment. This doesn’t play well with rbenv for ruby version management. My job involves both Chef development and non-Chef development. I use multiple ruby versions and that won’t be changing anytime soon. So I needed to find a way to make Chef DK work well with rbenv.&lt;/p&gt;

&lt;p&gt;Here is the root of the problem: my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$PATH&lt;/code&gt;. Chef DK places symlinks to it’s core binaries in /usr/bin for easy access - which is great. But if you have any of the chef &amp;amp; co gems installed in any ruby version, rbenv will create a shim that comes first in your PATH, preventing access to the Chef DK binaries.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ /usr/bin/knife --version
Chef: 11.14.6

$ which knife
/Users/david/.rbenv/shims/knife

$ echo $PATH
/Users/david/.rbenv/shims:/usr/local/bin:/usr/bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So what if I move the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/bin&lt;/code&gt; to the front of my PATH? Then the system gems will take precedent over the rbenv gems. That won’t work.&lt;/p&gt;

&lt;p&gt;The chef binaries in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/bin/&lt;/code&gt; are just symlinks… so where do they link to?&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ls -l /usr/bin/knife
lrwxr-xr-x  1 root  wheel  21 Sep  1 13:42 /usr/bin/knife -&amp;gt; /opt/chefdk/bin/knife
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So all the binaries are really in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/chefdk/bin/&lt;/code&gt;. Let’s add that to my PATH! Here is the relevenat snippet from my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.zshenv&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;eval &quot;$(rbenv init -)&quot;
export PATH=&quot;/opt/chefdk/bin:$PATH&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The order here is important; we need to make sure rbenv is setup before adding chefdk to the front of my PATH.&lt;/p&gt;

&lt;p&gt;Now everything works:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ echo $PATH
/opt/chefdk/bin:/Users/david/.rbenv/shims:/usr/local/bin:/usr/bin

$ which knife
/opt/chefdk/bin/knife

$ which gem
/Users/david/.rbenv/shims/gem
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Use Fastly as a CDN for Filepicker.io</title>
   <link href="https://dwradcliffe.com/2014/08/04/use-fastly-as-a-cdn-for-filepicker.html"/>
   <updated>2014-08-04T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2014/08/04/use-fastly-as-a-cdn-for-filepicker</id>
   <content type="html">&lt;p&gt;We’re using Filepicker.io for file uploads in the &lt;a href=&quot;https://www.trabian.com&quot;&gt;Trabian CMS&lt;/a&gt;. Filepicker is awesome and saves us a ton of headaches. We wanted to put a CDN in front of their domain when we serve the files on client sites.&lt;/p&gt;

&lt;p&gt;Our goals were:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Use a custom domain, with HTTPS&lt;/li&gt;
  &lt;li&gt;Speed up file requests&lt;/li&gt;
  &lt;li&gt;Cache file conversions to save time and money&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Filepicker.io &lt;a href=&quot;https://developers.filepicker.io/docs/cdn/&quot;&gt;suggests using CloudFront&lt;/a&gt;, which would have probably worked ok. However, Custom HTTPS is really expensive and we wanted a little more control. &lt;a href=&quot;https://www.fastly.com/&quot;&gt;Fastly&lt;/a&gt; is an awesome service, and gives us lots of control. Their support has been excellent so far and we are very please.&lt;/p&gt;

&lt;p&gt;Here’s how we configured Fastly to work with Filepicker.io.&lt;/p&gt;

&lt;h2 id=&quot;domains&quot;&gt;Domains&lt;/h2&gt;
&lt;p&gt;This is pretty simple, but we added our custom domain here.&lt;/p&gt;

&lt;h2 id=&quot;hosts&quot;&gt;Hosts&lt;/h2&gt;
&lt;p&gt;We needed to setup 2 backend hosts. One for http and one for https. The address field is the important one, along with the appropriate condition.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Address: www.filepicker.io:80
Conditions:
  Name: is non ssl
  Apply If: !req.http.Fastly-SSL
  Priority: 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Address: www.filepicker.io:443
Conditions:
  Name: is ssl
  Apply If: req.http.Fastly-SSL
  Priority: 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;settings&quot;&gt;Settings&lt;/h2&gt;
&lt;p&gt;It is important to set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Default Host&lt;/code&gt; field to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;www.filepicker.io&lt;/code&gt; so that Fastly sends a host header.
Under Cache Settings, we have two special rules setup. One for 404s, which sets the TTL to 300s. The other extends the TTL beyond the Filepicker default to 43200s for all valid responses.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Name: 404s
TTL: 300 sec
State TTL: 300 sec
Action: cache
Conditions:
  Name: is 404
  Apply If: beresp.status == 404
  Priority: 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Name: everything
TTL: 43200 sec
Stale TTL: 43200 sec
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;content&quot;&gt;Content&lt;/h2&gt;
&lt;p&gt;By default, Fastly won’t cache any responses that have Cookies set. So it’s important that we remove those headers.&lt;/p&gt;

&lt;p&gt;Under headers, we have a rule:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Name: Remove Set-Cookie headers
Type: cache
Action: delete
Destination: http.Set-Cookie
Source:
Ignore If Set: 0
Priority: 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Those are the configurations that we use in production. Hope this helps!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>User a password manager. Please.</title>
   <link href="https://dwradcliffe.com/2014/04/12/use-a-password-manager.html"/>
   <updated>2014-04-12T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2014/04/12/use-a-password-manager</id>
   <content type="html">&lt;p&gt;In the recent wake of Heartbleed, and many other security issues this year, people are once again thinking about passwords. We’ve all ben told this week to change all our passwords. We’ve been told again that we shouldn’t use the same password twice. We’ve been told again that our passwords should be long and as random as possible. There’s no arguing with that logic.&lt;/p&gt;

&lt;p&gt;If you’re anything like me, you have a lot of online accounts which means a lot of passswords. There’s no way I can remember them all, especially without repeating any. A password manager is a must.&lt;/p&gt;

&lt;p&gt;If you’re not familiar, a password manager will securly store all your passwords for all your services and websites. There’s one master password to get access to all the other passwords. There are also often browser helpers to make it easy to login to websites.&lt;/p&gt;

&lt;p&gt;I use &lt;a href=&quot;https://agilebits.com/onepassword&quot;&gt;1Password&lt;/a&gt;. It’s a great piece of software, works cross-platform, even on mobile devices. It can sync using multiple providers if you want. I’m able to keep all my accounts secure using long random passwords and 1Password will log me in automatically.&lt;/p&gt;

&lt;p&gt;tl;dr: Please please please use a password manager and don’t repeat your passwords!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tail your app logs with capistrano</title>
   <link href="https://dwradcliffe.com/2014/02/22/capistrano-tail-logs.html"/>
   <updated>2014-02-22T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2014/02/22/capistrano-tail-logs</id>
   <content type="html">&lt;p&gt;Recently I deployed a new app using capistrano, and I wanted to tail the app logs easily. My app was deployed to two nodes, which complicates things just a little bit. There are a few snippets out there which discribed how to setup a task to accomplish this. These worked but I wanted to improve on them. Here’s my modified snippet:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:logs&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;trap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'INT'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;last_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;tail -f &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shared_path&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/log/*.log&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n\033&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;[34m==&amp;gt; &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\033&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;[0m&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;last_host&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;last_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:err&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I just need to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cap logs&lt;/code&gt; to get a nicely foratted stream of the logs in real-time. Hope this helps someone.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Custom OpenSSL with nginx</title>
   <link href="https://dwradcliffe.com/2013/10/04/custom-openssl-with-nginx.html"/>
   <updated>2013-10-04T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2013/10/04/custom-openssl-with-nginx</id>
   <content type="html">&lt;p&gt;Recently, I wanted to deploy TLSv1.1 and TLSv1.2 to our nginx servers. According to the nginx docs, this requires OpenSSL version 1.0.1 or higher. We’re running CentOS 6.3 and the latest  version in the default respositories is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OpenSSL 1.0.0-fips 29 Mar 2010&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I looked around for another way to upgrade our OpenSSL package and couldn’t find anything that I trusted. (There were a few 3rd party repositories, but I didn’t totally trust them.) Even the latest CentOS (6.4) doesn’t have an upgraded OpenSSL package.&lt;/p&gt;

&lt;p&gt;After a little more digging I found that nginx can be compiled with a custom OpenSSL. At first I assumed this meant you had to first install the custom OpenSSL and point the nginx isntaller to that, but it turns out it’s even easier than that! This method doesn’t touch your system OpenSSL (which was one of my original concerns).&lt;/p&gt;

&lt;p&gt;All you need to do is download the OpenSSL source (from &lt;a href=&quot;http://www.openssl.org/source/&quot;&gt;www.openssl.org/source&lt;/a&gt;), extract the files, and add a config flag to the nginx build process. We were already &lt;a href=&quot;http://nginx.org/en/docs/configure.html&quot;&gt;building nginx from source&lt;/a&gt; so this was a simple change. Here’s the config flag:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;--with-openssl=/path/to/openssl-1.0.1e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The configure command might look like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./configure --with-http_ssl_module --with-openssl=/path/to/openssl-1.0.1e
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(Of course, you might need more flags for your specific installation.)&lt;/p&gt;

&lt;h3 id=&quot;bonus-for-chef-users&quot;&gt;Bonus for Chef users&lt;/h3&gt;

&lt;p&gt;I wrote a chef recipe that will download and include the OpenSSL source and flags when compiling nginx from source. The recipe has been &lt;a href=&quot;https://github.com/opscode-cookbooks/nginx/commit/869962e5d034ad5755094143dadf16ef64b0e0e3&quot;&gt;added&lt;/a&gt; to the &lt;a href=&quot;http://community.opscode.com/cookbooks/nginx&quot;&gt;official nginx cookbook&lt;/a&gt; and should be available in the next release. It can be used just like any other nginx module, by adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nginx::openssl_source&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node['nginx']['source']['modules']&lt;/code&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Vagrant to compile Jekyll</title>
   <link href="https://dwradcliffe.com/2013/04/12/vagrant-to-compile-jekyll.html"/>
   <updated>2013-04-12T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2013/04/12/vagrant-to-compile-jekyll</id>
   <content type="html">&lt;p&gt;So let’s say that you want to build a simple website using &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; but you don’t want to run the compile step on your computer for some reason. Maybe you are using Windows or don’t have ruby or something like that. It’s trivial to use &lt;a href=&quot;http://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt; to spin up a quick virtual machine to do the work for you.&lt;/p&gt;

&lt;p&gt;To start you will need to install Vagrant and VirtualBox. (Yes, I know you can use other providers such as VMware Fusion, but VirtualBox is free and easy.)&lt;/p&gt;

&lt;p&gt;Download Vagrant: &lt;a href=&quot;http://www.vagrantup.com/downloads.html&quot;&gt;www.vagrantup.com/downloads.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download VirtualBox: &lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot;&gt;www.virtualbox.org/wiki/Downloads&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will need a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Vagrantfile&lt;/code&gt; in your project root to configure Vagrant. Here is a boiled down version with everything you will need:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Vagrant.configure(&quot;2&quot;) do |config|

  config.vm.box = &quot;precise32&quot;
  config.vm.box_url = &quot;http://files.vagrantup.com/precise32.box&quot;
  config.vm.network :forwarded_port, host: 4000, guest: 4000
  config.vm.provision :shell,
    :inline =&amp;gt; &quot;sudo apt-get -y install build-essential &amp;amp;&amp;amp; sudo /opt/vagrant_ruby/bin/gem install jekyll rdiscount --no-ri --no-rdoc&quot;

end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you are ready to start your VM. From a command prompt in your project directory:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ vagrant up
$ vagrant ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you can start Jekyll on the VM:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cd /vagrant
$ jekyll serve --watch 4000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you should be able to use your own regular web browser to view the site at &lt;a href=&quot;http://localhost:4000&quot;&gt;http://localhost:4000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you’re done testing, just exit jekyll with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctl+c&lt;/code&gt; and exit the vm with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit&lt;/code&gt;. Finally you can &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant destroy&lt;/code&gt; to clean up.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using better_errors with Sublime Text 2</title>
   <link href="https://dwradcliffe.com/2013/01/18/better-errors-with-sublime-text.html"/>
   <updated>2013-01-18T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2013/01/18/better-errors-with-sublime-text</id>
   <content type="html">&lt;p&gt;I have been using &lt;a href=&quot;https://github.com/charliesome/better_errors&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;better_errors&lt;/code&gt;&lt;/a&gt; to provide a better error page on a few Rails 3 projects. It provides more information and gives me a live REPL at the source of the error.&lt;/p&gt;

&lt;p&gt;This week I realized that the file name is actually a link to open the source file in my editor.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2013/better_errors_filename.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The default link uses the TextMate handler (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;txmt://open?url=...&lt;/code&gt;), but since I’m using Sublime Text 2 I wanted to change the url and setup a handler on my system for ST.&lt;/p&gt;

&lt;p&gt;First, the system handler. I searched around and found this: &lt;a href=&quot;https://github.com/asuth/subl-handler&quot;&gt;https://github.com/asuth/subl-handler&lt;/a&gt;. After downloading and following the instructions, it works perfectly. Now ST responds to any &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subl://&lt;/code&gt; urls.&lt;/p&gt;

&lt;p&gt;Next, changing the URL on the error page. After some &lt;a href=&quot;https://github.com/charliesome/better_errors/pull/34/files&quot;&gt;digging&lt;/a&gt; I was able to find out how to change the url. It’s pretty simple; just add this to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config/environments/development.rb&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;BetterErrors.editor = :sublime
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And it works! Clicking on the filename will open the file to the exactly line in ST.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to install PostgreSQL's hstore to your default database template</title>
   <link href="https://dwradcliffe.com/2013/01/10/install-hstore-to-default-template.html"/>
   <updated>2013-01-10T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2013/01/10/install-hstore-to-default-template</id>
   <content type="html">&lt;p&gt;I’ve started using PostgreSQL’s hstore extention and data type. There are a few good resources out there about how to get this running in Rails.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://travisjeffery.com/b/2012/02/using-postgress-hstore-with-rails/&quot;&gt;http://travisjeffery.com/b/2012/02/using-postgress-hstore-with-rails/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/softa/activerecord-postgres-hstore&quot;&gt;https://github.com/softa/activerecord-postgres-hstore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was working well for development and production but when I ran my tests and reset my test database, I kept running into errors. Even though I created the extension in my migration, the schema file didn’t have that recorded so it failed every time:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PG::Error: ERROR: type &quot;hstore&quot; does not exist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first article I referenced suggested I add hstore to the default template. My first attempts failed because the only sql files I could find threw errors when I tried to add them to the default db template. So here’s what I did.&lt;/p&gt;

&lt;p&gt;I created &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hstore.sql&lt;/code&gt; in the contrib directory. (Mine was at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/Cellar/postgresql/9.2.1/share/postgresql/extension&lt;/code&gt;)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CREATE EXTENSION hstore;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I ran this command to add it to the template:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;psql -f /usr/local/Cellar/postgresql/9.2.1/share/postgresql/extension/hstore.sql -d template1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db:test:prepare&lt;/code&gt; works great!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Year, New Design</title>
   <link href="https://dwradcliffe.com/2013/01/04/new-year-new-design.html"/>
   <updated>2013-01-04T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2013/01/04/new-year-new-design</id>
   <content type="html">&lt;p&gt;To ring in the new year, I revamped the site design. Last year was a busy year, and I didn’t make much time for this site or writing. I’m trying to change that this year and so a refreshed look was a good way to start.&lt;/p&gt;

&lt;p&gt;The change was inspired mostly by a new headshot that I had taken by a good friend, Sarah Mayo. She takes excellent photos. She just finished rebranding and you can &lt;a href=&quot;http://www.facebook.com/SarahMayoPhotography&quot;&gt;follow her on Facebook&lt;/a&gt; or send her an email at &lt;a href=&quot;mailto:hello@sarahmayophotography.com&quot;&gt;hello@sarahmayophotography.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are a few of the shots she took:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center&quot;&gt;
&lt;img src=&quot;/images/2013/headshots/IMG_7911a.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/2013/headshots/IMG_7934.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;And of course my lovely wife:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center&quot;&gt;
&lt;img src=&quot;/images/2013/headshots/IMG_8052.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/2013/headshots/IMG_7879.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Check her out: &lt;a href=&quot;http://sarahmayophotography.com&quot;&gt;sarahmayophotography.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Geek Blog Progession</title>
   <link href="https://dwradcliffe.com/2012/04/15/geek-blog-progression.html"/>
   <updated>2012-04-15T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2012/04/15/geek-blog-progression</id>
   <content type="html">&lt;p&gt;Every geek has a blog. And every geek changes their blog. Here’s how it goes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Geocities&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;yay first website!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Cheap shared web hosting with some crappy html&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Blogger/Wordpress.com&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;real blog!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;[self-hosted] Wordpress&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;only a fool uses someone else’s blog service&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;and I can use all these awesome plugins!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Jekyll [on GitHub]&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;dynamic? pssh. static is so freaking fast!!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tumblr&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;it just works. nuf said.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Finding the pid file for mongodb</title>
   <link href="https://dwradcliffe.com/2012/01/23/mongodb-pid-file.html"/>
   <updated>2012-01-23T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2012/01/23/mongodb-pid-file</id>
   <content type="html">&lt;p&gt;For a while now I’ve been trying to monitor my mongodb instance with monit and obviously needed the pid file location. I read through my init script and looked in the places the script said the pid file was supposed to be, but it just wasn’t there.&lt;/p&gt;

&lt;p&gt;Finally I found that it’s stored in the data directory.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/data/mongodb/mongod.lock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Adding a simple file link will fix this up nicely for me:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ln -s /data/mongodb/mongod.lock /var/run/mongodb.pid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I hope this helps someone else!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Importing csv data to rails using rake</title>
   <link href="https://dwradcliffe.com/2011/12/29/import-csv.html"/>
   <updated>2011-12-29T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/12/29/import-csv</id>
   <content type="html">&lt;p&gt;Often part of building a website is being able to import static data into the database. Usually the data is in csv format. Here’s a quick example of how to make this work.&lt;/p&gt;

&lt;h2 id=&quot;files&quot;&gt;Files&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db/teams.csv&lt;/code&gt; - I like to drop my data here. If its a huge file, you might want to add it to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; file to keep it out of git.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib/tasks/import.rake&lt;/code&gt; - This is where we will define our rake task.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;task&quot;&gt;Task&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;require 'csv'

desc &quot;Import teams from csv file&quot;
task :import =&amp;gt; [:environment] do

  file = &quot;db/teams.csv&quot;
  
  CSV.foreach(file, :headers =&amp;gt; true) do |row|
    Team.create {
      :name =&amp;gt; row[1],
      :league =&amp;gt; row[2],
      :some_other_data =&amp;gt; row[4]
    }
  end

end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;/h2&gt;

&lt;p&gt;Make sure you carefully match up the rows. Remember the array is base 0.
If your file doesn’t have a header row, remove set :headers to false in the foreach.&lt;/p&gt;

&lt;h2 id=&quot;run&quot;&gt;Run!&lt;/h2&gt;

&lt;p&gt;From the terminal, change to the app directory and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rake import&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec rake import&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;

&lt;p&gt;CSV library docs - &lt;a href=&quot;http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html&quot;&gt;http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rake docs - &lt;a href=&quot;http://rake.rubyforge.org/&quot;&gt;http://rake.rubyforge.org/&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Joining Trabian Technology</title>
   <link href="https://dwradcliffe.com/2011/11/13/trabian-technology.html"/>
   <updated>2011-11-13T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/11/13/trabian-technology</id>
   <content type="html">&lt;p&gt;I’ve been doing some contract work for &lt;a href=&quot;http://www.trabian.com&quot;&gt;Trabian Technology&lt;/a&gt; for several months now but as of November 1st I’m officially part of the Trabian Team. I’ve enjoyed working with them and building the Trabian software and infrastructure and I’m excited about the work we’re going to do going forward.&lt;/p&gt;

&lt;p&gt;See the post on &lt;a href=&quot;http://www.trabian.com/articles/welcome-david&quot;&gt;Trabian’s blog&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Airbrake with Node.js and Express</title>
   <link href="https://dwradcliffe.com/2011/09/26/using-airbrake-with-node.html"/>
   <updated>2011-09-26T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/09/26/using-airbrake-with-node</id>
   <content type="html">&lt;p&gt;We’ve been building a new app using &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; and the &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express&lt;/a&gt; framework. We’re also using &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;CoffeeScript&lt;/a&gt;, so my examples will use that. Error notification is an important part of every app and we use &lt;a href=&quot;http://airbrakeapp.com/&quot;&gt;Airbrake&lt;/a&gt; in all our apps. So naturally we wanted to use Airbrake with this new Node.js app.&lt;/p&gt;

&lt;p&gt;There’s a great unofficial library for node.js but it wasn’t quite ready to use with Express. Here’s what I did to make it all work together. Also I’ve hooked up the deploy notifications with capistrano.&lt;/p&gt;

&lt;h2 id=&quot;install-packages&quot;&gt;Install packages&lt;/h2&gt;

&lt;p&gt;Add the airbrake node package. If you’ve got a package.json you can add&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&quot;airbrake&quot;: &quot;0.2.3&quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Otherwise you can just do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm install airbrake&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add the gems to your gemfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem 'capistrano'
gem 'airbrake'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And finally &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;add-airbrake-error-handler-middleware&quot;&gt;Add airbrake error handler middleware&lt;/h2&gt;

&lt;p&gt;The airbrake node package doesn’t yet have a built-in middleware piece for Express/connect, so I built one. It’s not perfect and I’m working on getting it included in the official package. For now you will need to copy this into the lib.&lt;/p&gt;

&lt;p&gt;Add this to the end of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node_modules/airbrake/lib/airbrake.js&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Airbrake.prototype.errorHandler = function() {
  var self = this;
  return function errorHandler(err, req, res, next){
    if (res.statusCode &amp;lt; 400) res.statusCode = 500;
    self.log('Airbrake: Uncaught exception, sending notification for:');
    self.log(err.stack);
    err.url = req.url;
    err.action = req.route.path;
    err.params = req.params;
    self.notify(err, function(notifyErr, url) {
      if (notifyErr) {
        self.log('Airbrake: Could not notify service.');
        self.log(notifyErr.stack);
      } else {
        self.log('Airbrake: Notified service: ' + url);
      }
      res.send(&quot;Error!&quot;);
    });
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;setup-in-express&quot;&gt;Setup in Express&lt;/h2&gt;

&lt;p&gt;In our main app file, we have a couple configure blocks.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app.configure 'development', -&amp;gt;
  app.use express.errorHandler dumpExceptions: true, showStack: true
app.configure 'production', -&amp;gt;
  airbrake = require('airbrake').createClient('YOUR-API-KEY')
  app.use airbrake.errorHandler()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here we are using the default express error handler in development mode to get nice error screens, and in production we are using airbrake.&lt;/p&gt;

&lt;h2 id=&quot;deploy-notification-with-capistrano&quot;&gt;Deploy notification with capistrano&lt;/h2&gt;

&lt;p&gt;To get this to work nicely, I used the official airbrake cap tasks and rolled my own rake task.&lt;/p&gt;

&lt;p&gt;Add this to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Capfile&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deploy/config.rb&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'airbrake/capistrano'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will give you the cap task:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cap -T
cap airbrake:deploy      # Notify Airbrake of the deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This task will call the rake task with the proper ENV variables set.&lt;/p&gt;

&lt;p&gt;In our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rakefile&lt;/code&gt;, we have the following task defined:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;namespace :airbrake do
  desc &quot;Notify Airbrake of a new deploy.&quot;
  task :deploy do
    system &quot;coffee lib/deploy.coffee&quot;
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now the real deploy notification uses the node airbrake library again. In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib/deploy.coffee&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;airbrake = require('airbrake').createClient(&quot;YOUR-API-KEY&quot;)

deployment =
  rev: process.env['REVISION'],
  repo: process.env['REPO'],
  env: process.env['TO'],
  user: process.env['USER']
  
airbrake.trackDeployment deployment, (err, params) -&amp;gt;
  throw err if err?
  console.log('Tracked deployment of %s to %s', params.rev, params.env)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That script will require the library, build the deployment data from the ENV variables, and send it off to Airbrake. To test you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cap airbrake:deploy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s all!&lt;/p&gt;

&lt;p&gt;I’ve got an example app built on github for reference: &lt;a href=&quot;https://github.com/dwradcliffe/airbrake-express-example&quot;&gt;github.com/dwradcliffe/airbrake-express-example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My fork of node-airbrake with the handler: &lt;a href=&quot;https://github.com/dwradcliffe/node-airbrake&quot;&gt;github.com/dwradcliffe/node-airbrake&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rails 3.1 (rc4) on Heroku</title>
   <link href="https://dwradcliffe.com/2011/07/20/rails-3.1-on-heroku.html"/>
   <updated>2011-07-20T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/07/20/rails-3.1-on-heroku</id>
   <content type="html">&lt;p&gt;I’ve been upgrading one of my apps to Rails 3.1 (rc4) this week and I attempted to deploy it to &lt;a href=&quot;http://www.heroku.com&quot;&gt;Heroku&lt;/a&gt; today. At first it was a miserable failure but I’ve been able to work through the bugs and its running well now. I’ll highlight the things I found so that maybe it won’t take you as long as it took me.&lt;/p&gt;

&lt;h2 id=&quot;new-relic&quot;&gt;New Relic&lt;/h2&gt;
&lt;p&gt;New Relic does not work with rails 3.1 rc4. If you’re using it (you should be), just comment out the gem for now. I’m sure they will get it working by full release time.&lt;/p&gt;

&lt;p&gt;“We do not work with the Rails 3.1 release candidate (RC4).”&lt;/p&gt;

&lt;p&gt;source: &lt;a href=&quot;https://support.newrelic.com/kb/ruby/new-relic-for-ruby&quot;&gt;https://support.newrelic.com/kb/ruby/new-relic-for-ruby&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;postgresql&quot;&gt;PostgreSQL&lt;/h2&gt;
&lt;p&gt;For some reason I need to specify the pg gem myself. Just add the following to your Gemfile:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem 'pg', :group =&amp;gt; :production
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;javascript-interpreter&quot;&gt;JavaScript interpreter&lt;/h2&gt;
&lt;p&gt;Rails 3.1 uses sprockets (which is awesome) which uses execjs which requires a javascript interpreter to run properly. There are several options but it seems that the only current option that works on Heroku is “The Ruby Racer” heroku build. You can add the following to your Gemfile:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem 'therubyracer-heroku', '0.8.1.pre3', :group =&amp;gt; :production
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;source: &lt;a href=&quot;http://quickleft.com/blog/rails-31-sprockets-and-heroku&quot;&gt;http://quickleft.com/blog/rails-31-sprockets-and-heroku&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>New blog</title>
   <link href="https://dwradcliffe.com/2011/05/22/new-blog.html"/>
   <updated>2011-05-22T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/05/22/new-blog</id>
   <content type="html">&lt;p&gt;I’ve been using WordPress for quite a while and it’s served me well. But it’s time to move on. I have no need for the bulk of what Wordpress offers. I live in the command line by day and try as I’m neck deep in ruby projects it only makes sense to try out one of the simple Ruby/Rack powered blog engines. I’ve heard lots of great things about toto (http://cloudhead.io/toto) and I was almost ready to give that a try but I wanted to take the change one step further. Toto runs a very thin Rack app. I wanted something that didn’t need to run any kind of app.&lt;/p&gt;

&lt;p&gt;The other option I was looking at was Jekyll (http://github.com/mojombo/jekyll). It’s a similar concept except it renders the entire site at once into a local directory. There’s nothing to run on the server - it’s just static html files.&lt;/p&gt;

&lt;p&gt;So, I’m giving it a try. I’m using github to host the site for now. It’s free - so why not?&lt;/p&gt;

&lt;p&gt;I was able to import my old WordPress posts without too much trouble but the formatting is a bit off. Maybe if I have time I’ll fix them later.&lt;/p&gt;

&lt;p&gt;That’s all for now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Configuring DiffMerge for use with git</title>
   <link href="https://dwradcliffe.com/2011/04/14/configuring-diffmerge-for-use-with-git.html"/>
   <updated>2011-04-14T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/04/14/configuring-diffmerge-for-use-with-git</id>
   <content type="html">The default git merge tool was getting annoying so I decided it was time to get a more user-friendly tool. Here are the easy steps:

&lt;ol&gt;
	&lt;li&gt;Download DiffMerge: &lt;a href=&quot;http://www.sourcegear.com/diffmerge/downloads.html&quot;&gt;http://www.sourcegear.com/diffmerge/downloads.html&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Install DiffMerge&lt;br /&gt;
I just followed the instructions in the README. Then I renamed diffmerge.sh to diffmerge.
&lt;/li&gt;
	&lt;li&gt;Setup git:

&lt;pre class=&quot;bash&quot;&gt;
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd &quot;diffmerge \&quot;\$LOCAL\&quot; \&quot;\$REMOTE\&quot;&quot;

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd &quot;diffmerge --merge --result=\&quot;\$MERGED\&quot;
\&quot;\$LOCAL\&quot; \&quot;\$BASE\&quot; \&quot;\$REMOTE\&quot;&quot;
git config --global mergetool.diffmerge.trustexitcode false
&lt;/pre&gt;
&lt;/li&gt;


&lt;/ol&gt;

</content>
 </entry>
 
 <entry>
   <title>Speak with Authority</title>
   <link href="https://dwradcliffe.com/2011/04/12/speak-with-authority.html"/>
   <updated>2011-04-12T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/04/12/speak-with-authority</id>
   <content type="html">&lt;iframe src=&quot;http://player.vimeo.com/video/3829682&quot; width=&quot;400&quot; height=&quot;270&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Installing the mysql gem on Ubuntu</title>
   <link href="https://dwradcliffe.com/2011/02/10/installing-the-mysql-gem-on-ubuntu.html"/>
   <updated>2011-02-10T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/02/10/installing-the-mysql-gem-on-ubuntu</id>
   <content type="html">If you're trying to install the mysql gem on Ubuntu (and possibly other distros) you need several packages installed prior to installing the gem. I keep forgetting so here they are. Hopefully this will help someone else too.

&lt;pre&gt;
$ apt-get install mysql-client
$ apt-get install libmysqlclient15-dev
$ gem install mysql
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving on</title>
   <link href="https://dwradcliffe.com/2011/01/15/moving-on.html"/>
   <updated>2011-01-15T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/01/15/moving-on</id>
   <content type="html">&lt;p&gt;Yesterday was my last day at FORUM Credit Union. I've learned a lot from the guys (and gals) at FORUM Solutions and I'm glad I spent the last couple years working beside them every day.&lt;/p&gt;

&lt;p&gt;I've always said that I wouldn't work in a cubical and starting next week I will no longer be confined to my two-walled cube. I will now be putting my full time efforts into building my company and doing contract web development.&lt;/p&gt;

&lt;p&gt;I will also be migrating into more open source environments, such as Ruby on Rails and PHP. The Microsoft .NET platform is great for some uses, but it isn't my passion and it was beginning to be a chore. Moving forward, I'm excited about what's ahead and the opportunities I will have.&lt;/p&gt;

&lt;p&gt;One last note - it was fitting that just 4 minutes after leaving FORUM for the last time I was ousted as mayor of FORUM Credit Union.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/Twitter_Sam_Lopez_ousted_dwradcliffe1.png&quot; alt=&quot;Sam Lopez - I just ousted @dwradcliffe on @foursquare!&quot; title=&quot;Sam Lopez - I just ousted @dwradcliffe on @foursquare!&quot; width=&quot;530&quot; height=&quot;181&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Managing multiple web app configs</title>
   <link href="https://dwradcliffe.com/2011/01/13/managing-multiple-web-app-configs.html"/>
   <updated>2011-01-13T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2011/01/13/managing-multiple-web-app-configs</id>
   <content type="html">&lt;p&gt;One of the most important things that you must do when building a web app is to keep distinct and separate configs for each environment. This is importnant because for one, your database will be different between development and production (and possibly testing and staging). You won't want to actually send emails in development, and you'll probably want to enable test mode for any payment providers or other third-party APIs. The list could go on - there are many use-cases and reasons why you should keep sepearate config. It boils down to this: you shouldn't have to worry about changing these things when you're ready to deploy or test.&lt;/p&gt;  &lt;div id='extendedEntryBreak' name='extendedEntryBreak'&gt;&lt;/div&gt;  &lt;p&gt;This concept, and how to accoplish it, is a no brainer for Rails developers and even some PHP developers.  In the .NET world this is a fiarly new concept and there hasn't been much support for anything of the sort until recently. With VisualStudio 2010 Microsoft brought us the idea of config transforms. I'm not going to go into the details but basically you have to write xml transformations to customize your main config file. That wasn't going to cut it for me so I set out to come up with a better plan. This is what I came up with.&lt;/p&gt;  &lt;p style=&quot;font-size:1em;font-weight:bold;&quot;&gt;NOTE: This is in the context of a ASP.NET MVC project.&lt;/p&gt;  &lt;p&gt;Inside our web project we have a standard web.config file. We also have a Config folder, with a folder insie for each environment. This one has four environments, development, production, staging and test.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://dwradcliffe.com/wp/wp-content/uploads/config-folders.png&quot; alt=&quot;&quot; title=&quot;config-folders&quot; width=&quot;253&quot; height=&quot;250&quot; class=&quot;alignnone size-full wp-image-4235&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Inside each of these env folders are section specific config files. .NET config files support including files from another location. This means our main web.config file is pretty lean. Here's a snippet:&lt;/p&gt;

&lt;pre class=&quot;xml&quot;&gt;
&amp;lt;appSettings configSource=&quot;Config\appsettings.config&quot; /&amp;gt;
&amp;lt;connectionStrings configSource=&quot;Config\connection_strings.config&quot; /&amp;gt;
&amp;lt;hibernate-configuration configSource=&quot;Config\nhibernate.config&quot; /&amp;gt;
&amp;lt;unity configSource=&quot;Config\unity.config&quot; /&amp;gt;
&lt;/pre&gt;

&lt;p&gt;If you look closely, you will notice that we are not pointing these files to a specific environment. This is very important. Now we can copy the config from any of the environment folders to the root Config folder and that config will be loaded.&lt;/p&gt;

&lt;p&gt;We took this one step further, and added rake to our toolkit. With a very short rake task we can now cleanup or change the config from the command line. All I have to do is type 'rake config' or 'rake config:production' to load the appropriate config.&lt;/p&gt;


&lt;pre class=&quot;ruby&quot;&gt;
desc &quot;Build the config files for the development environment.&quot;
task :config =&gt; &quot;config:development&quot;

namespace :config do
  [&quot;development&quot;, &quot;staging&quot;, &quot;production&quot;, &quot;test&quot;].each do |e|
    desc &quot;Build the config files for the #{e} environment.&quot;
    task e.downcase.intern do
       cp_r &quot;Web/Config/#{e}/.&quot;, 'Web/Config'
    end
  end

  desc &quot;Clean out all active config files&quot;
  task :clean do
    rm Dir.glob('Web/Config/*.config')
  end
end
&lt;/pre&gt;

&lt;p&gt;We have also added this to our build scripts so that when we build locally, the dev config is automatically installed. On our build server, the appropriate configs are installed as well.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Adeline Records Store</title>
   <link href="https://dwradcliffe.com/2010/12/21/project-launch-adeline-records-store.html"/>
   <updated>2010-12-21T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/12/21/project-launch:-adeline-records-store</id>
   <content type="html">&lt;p&gt;I recently wrapped up another project and after the initial traffic surge I'm happy to share with the world.&lt;/p&gt;

&lt;p&gt;Adeline Records wanted a &lt;a href=&quot;http://store.adelinerecords.net&quot;&gt;new online store&lt;/a&gt;. They had been using x-cart and although quite popular, it is a mess to administrate and the default templates are quite ugly. It wasn't hard to see why they wanted to make the change.&lt;/p&gt;

&lt;p&gt;After a bit of research we decided to go with &lt;a href=&quot;http://spreecommerce.com&quot;&gt;Spree&lt;/a&gt;. Magento was too much and almost everything else we found was old and outdated.  Spree, unlike most open source e-commerce packages, runs on Ruby on Rails. This was one of my first RoR projects so it was a bit of a learning experience. Spree is a great project and has TONS of flexibility to change things around to just the way you need.&lt;/p&gt;

&lt;p class=&quot;caption&quot;&gt;Main storefront&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/adeline-records-mailorder.png&quot; alt=&quot;Adeline Records&quot; title=&quot;adeline-records-mailorder.png&quot; border=&quot;0&quot; width=&quot;530&quot; height=&quot;379&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;caption&quot;&gt;Product view&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/adeline-records-tee.png&quot; alt=&quot;Adeline Records - Tee&quot; title=&quot;adeline-records-tee.png&quot; border=&quot;0&quot; width=&quot;530&quot; height=&quot;278&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;caption&quot;&gt;Admin interface&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/adeline-records-spree-admin.png&quot; alt=&quot;Spree Administration&quot; title=&quot;adeline-records-spree-admin.png&quot; border=&quot;0&quot; width=&quot;423&quot; height=&quot;307&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It was a fun project and hopefully it will continue to grow and change. I look forward to doing more Spree development soon.&lt;/p&gt;

&lt;p&gt;Take a look at the finished product: &lt;a href=&quot;http://store.adelinerecords.net&quot;&gt;store.adelinerecords.net&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Email newsletter WIN</title>
   <link href="https://dwradcliffe.com/2010/12/16/email-newsletter-win.html"/>
   <updated>2010-12-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/12/16/email-newsletter-win</id>
   <content type="html">&lt;img src=&quot;https://img.skitch.com/20101216-gchmrpkdbhcaxwyb16e3db92r1.png&quot; alt=&quot;Mint Newsletter&quot; /&gt;
</content>
 </entry>
 
 <entry>
   <title>Email newsletter fail</title>
   <link href="https://dwradcliffe.com/2010/12/16/email-newsletter-fail.html"/>
   <updated>2010-12-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/12/16/email-newsletter-fail</id>
   <content type="html">&lt;img src=&quot;https://img.skitch.com/20101216-dnb6tthekngw23gw7tbst8miaq.png&quot; alt=&quot;Happy Holidays from OpenDNS&quot; /&gt;
</content>
 </entry>
 
 <entry>
   <title>Doxo</title>
   <link href="https://dwradcliffe.com/2010/11/10/doxo.html"/>
   <updated>2010-11-10T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/11/10/doxo</id>
   <content type="html">&lt;p&gt;A few weeks ago I &lt;a href=&quot;http://www.netbanker.com/2010/10/launching_will_ebilling_startup_doxo_become_a_household_word.html&quot;&gt;read about Doxo&lt;/a&gt; on the netbanker blog. This service aims to be your online hub for organizing paper - bills, statements, receipts and other notices. This looked interesting so I found an invite and signed up.&lt;/p&gt;  &lt;p&gt;For those of you who appreciate good web apps with a good user interface, you will probably like Doxo. The UI is nice and clean and easy to use. There isn't a whole lot of extra fluff getting in the way. In fact, there really aren't many features.&lt;/p&gt;  &lt;p&gt;Once your account is created you are asked to add accounts or providers. The search and filter feels a lot like Mint. It was easy to find and add providers that I use and would like to use inside Doxo. An added bonus (for the earth) was that after I added 12 providers, Doxo planted a tree in my honor. Not really a feature, but it makes good sense as the app aims to reduce actual paper usage.&lt;/p&gt; &lt;img alt=&quot;Doxo interface&quot; src=&quot;http://dwradcliffe-blog.s3.amazonaws.com/images/2010/11/doxo-todo.png&quot; /&gt;   &lt;p&gt;Once my accounts are added they are listed along the left side of the screen. The main section has two important tabs: To Do items and Filed Docs. The to-do items tab contains any bills that you still need to pay and once they have been paid, (or if they are not a bill) they move into the filed docs tab. You can view by a specific account or all accounts aggregated together.&lt;/p&gt;  &lt;p&gt;Up until yesterday, if you wanted to use Doxo to organize your paper-filled life, you would have to possibly scan and upload each document to the Doxo web interface. This is a little clunky, as I don't have the time or equipment to effectively scan and upload EVERY document I have filed away. Doxo's plan is to partner with providers to automatically deliver your documents to Doxo. No scanning. No uploading.&lt;/p&gt; &lt;img alt=&quot;Doxo + Sprint&quot; src=&quot;http://dwradcliffe-blog.s3.amazonaws.com/images/2010/11/doxo-sprint.png&quot; /&gt;   &lt;p&gt;Yesterday Doxo announced their first commercial partner: Sprint. Users can now add their sprint account and seamlessly receive their statements and other documents directly in their Doxo account. This is a great first step for Doxo. I hope to see other providers added quickly.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://doxo.com&quot;&gt;Doxo&lt;/a&gt; is a great idea, a great interface and has great possibility. However, it remains to be seen whether or not it will really provide the service it claims will revolutionize the industry. I hope it does.&lt;/p&gt;  &lt;p&gt;&lt;span style=&quot;color: #888888&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Re-building Android apps in Eclipse</title>
   <link href="https://dwradcliffe.com/2010/10/18/re-building-android-apps-in-eclipse.html"/>
   <updated>2010-10-18T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/10/18/re-building-android-apps-in-eclipse</id>
   <content type="html">&lt;p&gt;Today I ran into a weird problem. I was working on our android mobile app and I wanted to make sure the .apk file I sent to QA was the most recent version. So I just dropped into the /bin directory and deleted the .apk. I assumed that the next build would absolutely re-create it with the most recent version. Instead, Eclipse gave me the following error: &lt;/p&gt;  &lt;pre&gt;java.io.IOException: Unable to upload file: Local file doesn't exist.&lt;/pre&gt;

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

&lt;p&gt;I tried just about everything to get it to work. I turned off automatic building and tried building myself. Nothing seemed to work. Finally I found the clean project menu item and tried that. Nothing seemed to happen but when I tried running again after that it finally worked.&lt;/p&gt;

&lt;p&gt;It seems that Eclipse must not replace the .apk file but instead attempts to open and edit the file. A bit weird – but I can deal with it. It also seems that Eclipse doesn’t actually check to see if the file exists before it attempts to open it. Only after a ‘clean’ command does Eclipse create the file.&lt;/p&gt;

&lt;p&gt;My final solution to be 100% sure the apk is current:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Manually delete the .apk file &lt;/li&gt;
  &lt;li&gt;Run the clean command from Eclipse &lt;/li&gt;
  &lt;li&gt;Run or debug the project &lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I hope this helps someone else!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Over to the dark side. Or, I bought a Mac.</title>
   <link href="https://dwradcliffe.com/2010/10/07/over-to-the-dark-side.-or,-i-bought-a-mac/html"/>
   <updated>2010-10-07T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/10/07/over-to-the-dark-side.-or,-i-bought-a-mac/over-to-the-dark-side.-or,-i-bought-a-mac.</id>
   <content type="html">&lt;p&gt;If you know me well you will know that I have been against Apple and Mac computers for as long as I can remember. I wont get into all the reasons why, but I had my reasons and I stuck to it.&lt;/p&gt;  &lt;p&gt;Until yesterday.&lt;/p&gt;  &lt;p&gt;Last night after work I went out and bought my first Apple computer. (First apple anything, actually.) I bought a nice 15&quot; MacBook Pro.&lt;/p&gt;  &lt;p&gt;I've been developing with some new technologies and I just kept running into a wall on my Windows machine. A lot of these issues I know &lt;em&gt;just work&lt;/em&gt; on a Mac and I'll actually be able to get some work done.&lt;/p&gt;  &lt;p&gt;I'm excited to get it up and running and see first-hand what it's capable of. I'll try to post the key things I use or packages that are super helpful.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Giving up on foursquare, almost.</title>
   <link href="https://dwradcliffe.com/2010/10/01/giving-up-on-foursquare,-almost/html"/>
   <updated>2010-10-01T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/10/01/giving-up-on-foursquare,-almost/giving-up-on-foursquare,-almost.</id>
   <content type="html">&lt;p&gt;I've been an avid fourquare user for some time now. I spent the first few months adding every venue I visited and collecting mayorships like it was my job.&lt;/p&gt;  &lt;p&gt;But it wasn’t. And I’m done.&lt;/p&gt;  &lt;p&gt;I’ve come to a place where I just don't see any benefit. Sure, there are the occasional venues that offer discounts. But who has time to visit that specific restaurant every day for 3 weeks just to get a dollar off their meal? I sure don’t. As more and more users join, it becomes harder and harder to be mayor, which dilutes the benefits even more.&lt;/p&gt;  &lt;p&gt;Granted, I’m not constantly traveling and going to meetings all across the city, country, or world like some people I know. That would make for a much more interesting data graph. For me, my foursquare checkins Monday through Friday consisted of not much more than work, home, and an occasional errand. Not very interesting.&lt;/p&gt;  &lt;p&gt;So I’ve stopped checking in wherever I go. The foursquare app no longer needs a parking spot on my home screen. I don’t feel the burden of 'having to checkin' before I do anything.&lt;/p&gt;  &lt;p&gt;That’s not to say that I closed my account and I’m purging my relationship with foursquare. I still may use it from time to time. When I'm on vacation it's still a usefull and interesting tool to see where I've been. (see &lt;a href=&quot;http://www.avc.com/a_vc/2010/07/foursquare-google-maps-mashup.html&quot;&gt;Fred Wison's write-up on this&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;I wonder …. am I the only one who has come to this conclusion? I doubt it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Customize Firefox Address Bar Search</title>
   <link href="https://dwradcliffe.com/2010/09/28/customize-firefox-address-bar-search.html"/>
   <updated>2010-09-28T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/28/customize-firefox-address-bar-search</id>
   <content type="html">&lt;p&gt;By default, when you type something into the address bar in Firefox it will use Google's &amp;quot;I'm feeling lucky&amp;quot; search to send you to the 'best' website. I never use this feature and (more importantly for me) my workplace blocks a certain parameter in this query so I wanted to change this behavior.&lt;/p&gt;  &lt;p&gt;This is so easy to change it's almost trivial. Simply open the &lt;strong&gt;about:config&lt;/strong&gt; page in Firefox and filter for &amp;quot;&lt;strong&gt;keyword.url&lt;/strong&gt;&amp;quot;. The one remaining preference will be the one you want to edit. Double click and replace the value with:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;http://www.google.com/search?q=&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This will cause Firefox to perform a nice vanilla Google search.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>QUOTE - Microsoft's LightSwitch</title>
   <link href="https://dwradcliffe.com/2010/09/14/quote-microsoft's-lightswitch.html"/>
   <updated>2010-09-14T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/14/quote---microsoft's-lightswitch</id>
   <content type="html">&lt;blockquote&gt;As an a side issue, it is hard to know if the problem is with LS or VS, because of all the problems that VS has &lt;em&gt;normally&lt;/em&gt;.&lt;/blockquote&gt; &lt;a href=&quot;http://bit.ly/cITQKt&quot;&gt;http://ayende.com/Blog/archive/2010/08/25/lightswitch-initial-thoughts.aspx&lt;/a&gt;
</content>
 </entry>
 
 <entry>
   <title>Future of Screen Technology</title>
   <link href="https://dwradcliffe.com/2010/09/14/future-of-screen-technology.html"/>
   <updated>2010-09-14T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/14/future-of-screen-technology</id>
   <content type="html">&lt;iframe width=&quot;586&quot; height=&quot;328&quot; src=&quot;http://www.youtube.com/embed/g7_mOdi3O5E?rel=0&amp;amp;hd=1&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content>
 </entry>
 
 <entry>
   <title>FORUM Credit Union Android App</title>
   <link href="https://dwradcliffe.com/2010/09/09/forum-credit-union-android-app.html"/>
   <updated>2010-09-09T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/09/forum-credit-union-android-app</id>
   <content type="html">I'm happy to announce that I just launched a new Android App for FORUM Credit Union. You can download it from the Market now!

&lt;strong&gt;Features:&lt;/strong&gt;
MANAGE FINANCES – check account balances, history, pay bills, transfer funds
CU ONLINE EMAIL – communicate securely with credit union staff
ALERTS – receive notification via email if certain account conditions occur
PROFILE – update email address, password, and account preferences

&lt;a href=&quot;market://details?id=com.forumcu.cuonline&quot;&gt;Download via Android Market&lt;/a&gt; now!
</content>
 </entry>
 
 <entry>
   <title>Update Rubygems to 1.3.7 on Ubuntu</title>
   <link href="https://dwradcliffe.com/2010/09/08/update-rubygems-to-1.3.7-on-ubuntu.html"/>
   <updated>2010-09-08T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/08/update-rubygems-to-1.3.7-on-ubuntu</id>
   <content type="html">This isn't the first or only place this is on the web but I keep forgetting so I'm posting this to remind myself. Maybe it will help someone else too.

The problem is that the packaged version of rubygems is stuck at 1.3.5 and rails 3.0 requires 1.3.6.  Here is the easy fix...

&lt;code&gt;sudo gem install rubygems-update --no-rdoc --no-ri&lt;/code&gt;
&lt;code&gt;sudo update_rubygems&lt;/code&gt;

Then you can use &lt;code&gt;gem -v&lt;/code&gt; to check!
</content>
 </entry>
 
 <entry>
   <title>VIDEO – learning revolution</title>
   <link href="https://dwradcliffe.com/2010/09/03/video-learning-revolution.html"/>
   <updated>2010-09-03T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/09/03/video-–-learning-revolution</id>
   <content type="html">&lt;object width=&quot;446&quot; height=&quot;326&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;param name=&quot;bgColor&quot; value=&quot;#ffffff&quot;&gt;&lt;/param&gt; &lt;param name=&quot;flashvars&quot; value=&quot;vu=http://video.ted.com/talks/dynamic/SirKenRobinson_2010-medium.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2010.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=865&amp;amp;introDuration=15330&amp;amp;adDuration=4000&amp;amp;postAdDuration=830&amp;amp;adKeys=talk=sir_ken_robinson_bring_on_the_revolution;year=2010;theme=the_creative_spark;theme=a_taste_of_ted2010;theme=the_rise_of_collaboration;theme=master_storytellers;theme=whipsmart_comedy;theme=how_the_mind_works;theme=how_we_learn;theme=new_on_ted_com;event=TED2010;&amp;amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;&quot; /&gt;&lt;embed src=&quot;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&quot; pluginspace=&quot;http://www.macromedia.com/go/getflashplayer&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; bgColor=&quot;#ffffff&quot; width=&quot;446&quot; height=&quot;326&quot; allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; flashvars=&quot;vu=http://video.ted.com/talks/dynamic/SirKenRobinson_2010-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2010.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=865&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=sir_ken_robinson_bring_on_the_revolution;year=2010;theme=the_creative_spark;theme=a_taste_of_ted2010;theme=the_rise_of_collaboration;theme=master_storytellers;theme=whipsmart_comedy;theme=how_the_mind_works;theme=how_we_learn;theme=new_on_ted_com;event=TED2010;&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
</content>
 </entry>
 
 <entry>
   <title>If they can do it in Paris...</title>
   <link href="https://dwradcliffe.com/2010/07/27/if-they-can-do-it-in-paris/html"/>
   <updated>2010-07-27T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/07/27/if-they-can-do-it-in-paris/if-they-can-do-it-in-paris...</id>
   <content type="html">&lt;p&gt;...why can't we do it here in the United States?&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.nytimes.com/2010/07/27/world/europe/27paris.html&quot;&gt;Daily Paper for Children Defies the Craze for Digital&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Every time I read something like this I'm embarrassed and depressed about the state of our education system. Do your kids read the newspaper? Maybe they should...&lt;/p&gt;  &lt;p&gt;&lt;span style=&quot;color: #888888&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Transloadit</title>
   <link href="https://dwradcliffe.com/2010/07/15/transloadit.html"/>
   <updated>2010-07-15T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/07/15/transloadit</id>
   <content type="html">&lt;p&gt;This is pretty cool. This week a small startup launched called &lt;a href=&quot;http://transloadit.com/&quot;&gt;Transloadit&lt;/a&gt;. Self titled as &quot;Fantastic file uploading for your web application,&quot; it seems like this might actually be pretty fantastic. Once you sign up for this (pay) web service you can point your upload forms to it and it will receive, resize and store your images to S3 for you.  They even provide a nifty little jQuery plugin to make nice upload forms.&lt;/p&gt;  &lt;p&gt;Image processing is always the hardest part of an app and this does all the hard work for you.  Take a look and see if it might help you!&lt;/p&gt;  &lt;p&gt;Launch Blog Post: &lt;a href=&quot;http://bit.ly/bIQhca&quot;&gt;http://kevin.vanzonneveld.net/techblog/article/announcing_transloadit/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Microsoft PivotViewer</title>
   <link href="https://dwradcliffe.com/2010/07/02/microsoft-pivotviewer.html"/>
   <updated>2010-07-02T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/07/02/microsoft-pivotviewer</id>
   <content type="html">&lt;p&gt;It's not often that I'm impressed by something from Microsoft. I use Microsoft tools and software all the time but I'm usually not too excited about it. However... The Silverlight PivotViewer is awesome. But don't take my word for it - take a look yourself. Basically this control allows you to visualize and sort thousands of items at once. I won't go into detail...if you want to read more you can read Scott Guthrie's blog post about it.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2010/06/29/silverlight-pivotviewer-now-available.aspx&quot;&gt;http://weblogs.asp.net/scottgu/archive/2010/06/29/silverlight-pivotviewer-now-available.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The sample app they built works against Netflix’s database of instant watch movies. It works well and it’s pretty neat – something I might actually use! Take a look: &lt;a href=&quot;http://netflixpivot.cloudapp.net/&quot;&gt;http://netflixpivot.cloudapp.net/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/images/netflixpivot.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;netflix-pivot&quot; border=&quot;0&quot; alt=&quot;netflix-pivot&quot; src=&quot;/images/netflixpivot_thumb.jpg&quot; width=&quot;644&quot; height=&quot;420&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>QUOTE – Simplicity</title>
   <link href="https://dwradcliffe.com/2010/04/30/quote-simplicity.html"/>
   <updated>2010-04-30T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/04/30/quote-–-simplicity</id>
   <content type="html">&lt;blockquote&gt;   &lt;p&gt;You’re not going to need to handle N kinds of book loan, you’re going to handle at most two, so don’t write some complicated code to handle the general case. You’re not going to need three classes, one interface and two event types for your “please wait” animation because there’s only ever going to be one and it’s always going to be while printing. Just write a function with a callback and release – the simpler it is, the quicker we can write it today and the more easily we can modify it tomorrow.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align=&quot;right&quot;&gt;- &lt;a href=&quot;http://coderoom.wordpress.com/2010/04/16/code-for-flexibility-a-manifesto/&quot;&gt;coderoom&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Outlook 2010 Ignore Conversation</title>
   <link href="https://dwradcliffe.com/2010/04/23/outlook-2010-ignore-conversation.html"/>
   <updated>2010-04-23T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/04/23/outlook-2010-ignore-conversation</id>
   <content type="html">Here is a really neat new feature of Outlook 2010! In addition to the threading features built into this version, outlook now has a tiny little &quot;Ignore&quot; button at the top left of the ribbon.

&lt;img class=&quot;alignnone size-full wp-image-262&quot; title=&quot;outlook-2010-ignore&quot; src=&quot;/images/outlook-2010-ignore.jpg&quot; alt=&quot;&quot; width=&quot;142&quot; height=&quot;147&quot; /&gt;

This button will delete the selected email and &lt;strong&gt;&lt;em&gt;also delete any future emails&lt;/em&gt;&lt;/strong&gt; in the same conversation!  This could be extremely useful in situations where reply all is overused. This happens in corporate environments all the time. Someone replies to everyone and soon there are 15 other emails replying to everyone. If you don't want to see them, now you don't have to!

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows Authentication in Firefox</title>
   <link href="https://dwradcliffe.com/2010/04/02/windows-authentication-in-firefox.html"/>
   <updated>2010-04-02T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/04/02/windows-authentication-in-firefox</id>
   <content type="html">Many .NET based web apps and enterprise web apps use Windows authentication so you don't have to ever login - your browser automatically uses your windows credentials. For a long time I assumed this only worked in Internet Explorer but I recently found that Firefox will do this too! All you need to do is tell it which websites are allowed to use the windows credentials and you all set. Here are the steps:
&lt;ol&gt;
	&lt;li&gt;Visit &lt;a href=&quot;about:config&quot;&gt;about:config&lt;/a&gt; in Firefox.&lt;/li&gt;
	&lt;li&gt;You might need to click the &quot;I'll be careful, I promise!&quot; button to continue.&lt;/li&gt;
	&lt;li&gt;Use the filter at the top to find the following three properties (one at a time)
&lt;ul&gt;
	&lt;li&gt;network.negotiate-auth.trusted-uris&lt;/li&gt;
	&lt;li&gt;network.negotiate-auth.delegation-uris&lt;/li&gt;
	&lt;li&gt;network.automatic-ntlm-auth.trusted-uris&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
	&lt;li&gt;Double click the property and add the URL of the site you are trying to use Windows authentication with to the value. If you have several sites, separate them with commas.&lt;/li&gt;
&lt;/ol&gt;

Thats it!

&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Emotions of those we serve</title>
   <link href="https://dwradcliffe.com/2010/03/18/emotions-of-those-we-serve.html"/>
   <updated>2010-03-18T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/03/18/emotions-of-those-we-serve</id>
   <content type="html">This morning I was reading a post by &lt;a href=&quot;http://bentilly.blogspot.com/&quot;&gt;Ben Tilly&lt;/a&gt; about addressing emotions in web forms. He has a great idea. Actually, Kevin Hale, the CEO of &lt;a href=&quot;http://wufoo.com/&quot;&gt;Wufoo&lt;/a&gt; had a great idea.
&lt;blockquote&gt;In the process of trying to fill out a ticket you have the option of reporting your emotional state. Which can be anything from &quot;Excited&quot; to &quot;Angry&quot;.&lt;/blockquote&gt;
I wonder if this idea could be implemented on any of our member-facing support forms or surveys? I think this idea is rock solid and might help make our members happier. A follow-up survey after the request was completed would check the emotions again. Is the member happy now? If not - we are doing something very wrong.

Read it all: &lt;a href=&quot;http://bentilly.blogspot.com/2010/03/address-emotions-in-your-forms.html&quot;&gt;http://bentilly.blogspot.com/2010/03/address-emotions-in-your-forms.html&lt;/a&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; @dwradcliffe.&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Congrats to Ryan Bingham</title>
   <link href="https://dwradcliffe.com/2010/03/08/congrats-to-ryan-bingham.html"/>
   <updated>2010-03-08T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/03/08/congrats-to-ryan-bingham</id>
   <content type="html">Tonight was the 82nd Oscars. I've never really paid much attention to events like this before but tonight I was glued to the TV watching to see who would win. One of my clients, Ryan Bingham, was nominated for Best Original Song for “The Weary Kind”, the theme from the film “Crazy Heart”.

If you also watched tonight you will already know that &lt;strong&gt;Ryan won&lt;/strong&gt;! I would like to congratulate Ryan Bingham for his excellent work over the past year and and congrats also to his crew and team that helped make this possible.

Visit Ryan Bingham's website at &lt;a href=&quot;http://www.binghammusic.com&quot;&gt;www.binghammusic.com&lt;/a&gt;.

If you didn't catch the awards ceremony, you can watch &lt;a href=&quot;http://oscar.go.com/video/index?playlistId=253172&amp;clipId=253199&quot;&gt;Ryan's acceptance speech&lt;/a&gt;.
</content>
 </entry>
 
 <entry>
   <title>UpdateModel requires properties</title>
   <link href="https://dwradcliffe.com/2010/02/24/updatemodel-requires-properties.html"/>
   <updated>2010-02-24T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/02/24/updatemodel-requires-properties</id>
   <content type="html">I was working on a feature at work this week on a ASP MVC project. I was attempting to use UpdateModel to update an object retrieved from the database with values from the POST. If you aren't familiar with it, ASP MVC has a &quot;magic method&quot; to map these POST values to an object. One simply needs to call 
&lt;pre lang=&quot;csharp&quot;&gt;UpdateModel(myObjectFromDatabase);&lt;/pre&gt;
 and the new values will be changed on the object.

That is all fine and dandy unless it doesn't work. I had checked everything. I could verify that the values were in the Request header. I could verify that UpdateModel was called and did not fail. The values simply were not updated.

I finally found the key (thanks to my supervisor). The object I was updating had a mix of auto-properties and fields. Apparently, UpdateModel will only update properties. A quick change from a field to an auto-property and everything worked as it should. Thanks Aaron!
</content>
 </entry>
 
 <entry>
   <title>Clean Phone Numbers</title>
   <link href="https://dwradcliffe.com/2010/02/20/clean-phone-numbers.html"/>
   <updated>2010-02-20T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/02/20/clean-phone-numbers</id>
   <content type="html">I've been working with a lot of person type data recently at work and I'm using data from multiple sources. Not just two databases but two separate systems with similar and yet incompatible data. One of the biggest messes was the phone numbers. I need to convert a phone number from a completely un-normalized format to a very strict format. I'm no regular expression genius so thankfully a quick Google search produced a nice PHP method of doing pretty much exactly what I was looking for. (&lt;a href=&quot;http://cnanney.com/journal/code/cleaning-phone-numbers-with-regex/&quot;&gt;http://cnanney.com/journal/code/cleaning-phone-numbers-with-regex/&lt;/a&gt;) I took that method and re-wrote it in C# and tweaked it a little for my application. I'm sure this isn't the absolute best way to do this but it works for me.

&lt;pre lang=&quot;csharp&quot; line=&quot;1&quot;&gt;
const string pattern = @&quot;\D*\(?(\d{3})?\)?\D*(\d{3})\D*(\d{4})\D*(\d{1,8})?&quot;;
string num, ext;
var matches = new Regex(pattern).Match(number).Groups;
if (matches.Count &gt; 0)
{
if (matches[3].Length &gt; 0)
{
if (matches[1].Length &gt; 0)
{
num = &quot;(&quot; + matches[1].Value + &quot;) &quot; + matches[2].Value + &quot;-&quot; + matches[3].Value;
}
else
{
num = matches[2].Value + &quot;-&quot; + matches[3].Value;
}
}
else
{
num = null;
}
ext = matches[4].Length &gt; 0 ? matches[4].Value : null;
}
else
{
num = null;
ext = null;
}
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Nominate Fishers for Google Fiber</title>
   <link href="https://dwradcliffe.com/2010/02/16/nominate-fishers-for-google-fiber.html"/>
   <updated>2010-02-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/02/16/nominate-fishers-for-google-fiber</id>
   <content type="html">Earlier this week I &lt;a href=&quot;http://www.dwradcliffe.com/2010/02/11/google-fiber.html&quot;&gt;blogged about how Google announced their Fiber internet access experiment&lt;/a&gt;. Later this year Google will pick one or more communities to build an experimental ultra-high-speed fiber network. This will deliver internet to residents at over 100 times faster than the current high-speed internet providers.

Since this post I have received amazing feedback from my local community and I have started working with the help of a few others to push this initiative along.

&lt;span style=&quot;font-size:1.5em;font-weight:bold;&quot;&gt;We want Google Fiber to come to Fishers, Indiana.&lt;/span&gt;
&lt;em&gt;And we can do it.&lt;/em&gt;

This is a two-fold plan. First the residents and anyone else that cares. And second, the town and it's official representatives.
&lt;div style=&quot;width:45%;float:left;padding:15px;&quot;&gt;
&lt;h3 style=&quot;text-decoration:underline;font-size:1.4em;&quot;&gt;Residents&lt;/h3&gt;
&lt;strong&gt;Nominate Fishers&lt;/strong&gt; - This is the most important. Google has a quick form for you to fill out to nominate Fishers and explain why Fishers would be a good choice. &lt;a href=&quot;http://www.google.com/appserve/fiberrfi/user/launch_exhibit_b&quot;&gt;http://www.google.com/appserve/fiberrfi/user/launch_exhibit_b&lt;/a&gt;

&lt;strong&gt;Join our Facebook Group&lt;/strong&gt; - We created a Facebook Group to show Google and the town of Fishers just how much we want this. &lt;a href=&quot;http://www.facebook.com/group.php?gid=462275585022&quot;&gt;http://www.facebook.com/group.php?gid=462275585022&lt;/a&gt;

&lt;strong&gt;Share&lt;/strong&gt; - this post, the Facebook group, and the Google form with all your friends and neighbors.

&lt;strong&gt;Contact&lt;/strong&gt; - anyone you know in the Fishers town government and tell them you want this. 

&lt;/div&gt;
&lt;div style=&quot;width:45%;float:left;padding:15px;&quot;&gt;
&lt;h3 style=&quot;text-decoration:underline;font-size:1.4em;&quot;&gt;Officials&lt;/h3&gt;
Google has specifically asked for an official response from the community. Google wants an authoritative voice to ask for this and tell Google about our community. The online forms can be found here: &lt;a href=&quot;https://www.google.com/appserve/fiberrfi/user/list_applications&quot;&gt;https://www.google.com/appserve/fiberrfi/user/list_applications&lt;/a&gt;. Many other cities and communities have already begun this process and we want Fishers to have a chance. This will be a huge benefit to the community. It will be great for Fishers’ publicity and image. It will probably bring jobs to Fishers.  If you have any questions about what this is all about please &lt;a href=&quot;http://www.dwradcliffe.com/contact&quot;&gt;contact &lt;/a&gt;me and I will be happy to explain it.
&lt;/div&gt;
&lt;div style=&quot;clear:both;height:10px;&quot;&gt;&lt;/div&gt;


&lt;h3&gt;UPDATE&lt;/h3&gt;
The IndyStar ran and article about this! &lt;a href=&quot;http://www.indystar.com/article/20100211/LOCAL0102/2110496/-1/LOCAL0102/Fishers-group-tries-to-attract-Google-project&quot;&gt;http://www.indystar.com/article/20100211/LOCAL0102/2110496/&lt;/a&gt;
Indy.com ran the same article here: &lt;a href=&quot;http://www.indy.com/posts/fishers-man-leads-effort-to-attract-google-project&quot;&gt;http://www.indy.com/posts/fishers-man-leads-effort-to-attract-google-project&lt;/a&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Fiber</title>
   <link href="https://dwradcliffe.com/2010/02/11/google-fiber.html"/>
   <updated>2010-02-11T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/02/11/google-fiber</id>
   <content type="html">Google recently announced that they are planning an experiment to make Internet access &quot;better and faster for everyone.&quot;  Google will pick one or more communities to build and test a high-speed fiber network.  This network will feature speeds of up to and over 1 gigabit. This is much faster than most household internet connections, which typically range from 1 megabit to 15 megabits.
&lt;!--more--&gt;
&lt;h3&gt;Why does this matter?&lt;/h3&gt;
The average person doesn't really notice the difference between fiber or DSL or cable internet connection. Browsing websites, reading email, or using social networks like Facebook don't require a super high speed connection. On the other hand, there are a few uses that will make a difference. One of those is streaming video. Services like Hulu or Netflix require a high speed connection, and yet even with a high speed connection sometimes we have to wait for the video to buffer, or load.  With a super connection like Google's new fiber service, there would not be a need to wait for these streaming video services. This is the direction the TV and movie industry is headed - It's been months since I've rented a movie from somewhere like Blockbuster and soon I believe that all of our television and movies will be delivered over the internet. There's no reason to rely on traditional sources like cable or over-the-air broadcast. We want content now, we want content in HD, and we want choices. The internet provides a delivery channel for those exact needs.  A fiber network provides the framework for this to be possible.

Watch this quick video about Google's plan:

&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; width=&quot;640&quot; height=&quot;385&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;src&quot; value=&quot;http://www.youtube.com/v/wusklcNKDZc&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;hd=1&quot; /&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; width=&quot;640&quot; height=&quot;385&quot; src=&quot;http://www.youtube.com/v/wusklcNKDZc&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;hd=1&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;h4&gt;What can I do?&lt;/h4&gt;
From now until March 26th Google is accepting nominations for your city.  After this, Google will decide where they will place this test network. From there all we can do is wait and see how it goes!  You can read more about this and nominate your city here:

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.google.com/appserve/fiberrfi/&quot;&gt;http://www.google.com/appserve/fiberrfi/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size:0.9em;&quot;&gt;
You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on Twitter&lt;/a&gt; or &lt;a href=&quot;http://feeds.feedburner.com/dwradcliffe&quot;&gt;subscribe to my blog&lt;/a&gt; for the latest information.
&lt;/span&gt;
</content>
 </entry>
 
 <entry>
   <title>On Apple's iPad</title>
   <link href="https://dwradcliffe.com/2010/02/03/on-apple's-ipad.html"/>
   <updated>2010-02-03T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/02/03/on-apple's-ipad</id>
   <content type="html">Apple recently announced their newest product, the &lt;a href=&quot;http://www.apple.com/ipad/&quot;&gt;iPad&lt;/a&gt;. Every blog now has a review, and either loves it or hates it. I'm going to take a different approach and just link to a few really good reviews and points of view. I hope you enjoy these, as they are hopefully a little different than most of the common reviews.
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://stevenf.tumblr.com/post/359224392/i-need-to-talk-to-you-about-computers-ive-been&quot;&gt;http://stevenf.tumblr.com/post/359224392/i-need-to-talk-to-you-about-computers-ive-been&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.lukew.com/ff/entry.asp?990&quot;&gt;http://www.lukew.com/ff/entry.asp?990&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.1938media.com/you-deserve-to-be-fired/&quot;&gt;http://www.1938media.com/you-deserve-to-be-fired/&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

I'll try to update this list as I find new ones.

&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt;.&lt;/span&gt;
</content>
 </entry>
 
 <entry>
   <title>Conan O’Brien on cynicism</title>
   <link href="https://dwradcliffe.com/2010/01/25/quote-conan-o-brien.html"/>
   <updated>2010-01-25T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/01/25/quote-conan-o’brien</id>
   <content type="html">&lt;blockquote&gt;All I ask of you is one thing: please don’t be cynical. I hate cynicism — it’s my least favorite quality and it doesn’t lead anywhere. Nobody in life gets exactly what they thought they were going to get. But if you work really hard, and you’re kind, amazing things will happen.&lt;br /&gt;
-Conan O’Brien
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>2009 - Year in Review</title>
   <link href="https://dwradcliffe.com/2010/01/16/2009-year-in-review.html"/>
   <updated>2010-01-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/01/16/2009-year-in-review</id>
   <content type="html">Well I guess it's about time I write about what has happened in the last 12 months. This past year has been the biggest year of changes in my life thus far. Here is the rundown:
&lt;ul&gt;
	&lt;li&gt;Started January at IWU, my final semester of college, living off campus (since September 2008)&lt;/li&gt;
	&lt;li&gt;February 25th I&lt;a href=&quot;http://twitter.com/dwradcliffe/statuses/1248267266&quot;&gt; joined&lt;/a&gt; Twitter&lt;/li&gt;
	&lt;li&gt;In February I &lt;a href=&quot;http://twitter.com/dwradcliffe/statuses/1248279921&quot;&gt;began&lt;/a&gt; my job search&lt;/li&gt;
	&lt;li&gt;February 16th I took and passed the &lt;a href=&quot;http://www.dwradcliffe.com/2009/02/17/zend-php-5-certified-engineer.html&quot;&gt;Zend PHP 5 Certification&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;In April I was hired by FORUM Credit Union&lt;/li&gt;
	&lt;li&gt;April 25th I graduated from Indiana Wesleyan University with a B.S. in Computer Internet Development&lt;/li&gt;
	&lt;li&gt;April 26th I moved to Indianapolis, IN&lt;/li&gt;
	&lt;li&gt;April 29th I &lt;a href=&quot;http://www.dwradcliffe.com/2009/04/29/forum-credit-union.html&quot;&gt;began my new job at FORUM&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;May 21st I proposed to Katie Stipe, and she said YES!&lt;/li&gt;
	&lt;li&gt;In August we had &lt;a href=&quot;http://www.dwradcliffe.com/2009/08/22/engagement-photos.html&quot;&gt;engagement photos&lt;/a&gt; taken&lt;/li&gt;
	&lt;li&gt;June, July, August, September and October was a blur of wedding preparations&lt;/li&gt;
	&lt;li&gt;October 17th I got married! (&lt;a href=&quot;http://www.dwradcliffe.com/2009/11/10/wedding-pictures.html&quot;&gt;photos&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;In December we took a vacation to &lt;a href=&quot;http://www.daveandkate.us/2010/01/disney-versus-reality/&quot;&gt;Disney in Florida&lt;/a&gt; (I hadn't been there since I was 6)&lt;/li&gt;
&lt;/ul&gt;
It has been a great, full year.  I'm very much looking forward to a slower yet just as fulfilling 2010.

&lt;span style=&quot;color: #888888;&quot;&gt;You should &lt;a href=&quot;http://www.twitter.com/dwradcliffe&quot;&gt;follow me on twitter&lt;/a&gt; to get the latest from 2010.&lt;/span&gt;
</content>
 </entry>
 
 <entry>
   <title>jQuery 1.4 Released!</title>
   <link href="https://dwradcliffe.com/2010/01/15/jquery-1.4-released!.html"/>
   <updated>2010-01-15T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2010/01/15/jquery-1.4-released!</id>
   <content type="html">Today, the jQuery team released the next version of their revolutionary JavaScript framework. Today is also the 4th birthday of jQuery although it has only recently (in the last year or so) become almost standard among web developers. jQuery has made developing in JavaScript fun again, for me, and hopefully you too.

You can read all about it on the &lt;a href=&quot;http://jquery14.com/day-01/jquery-14&quot;&gt;14 days of jQuery site&lt;/a&gt;.  The links to download the files are right on that page, or you can also use the following links:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.jquery.com/jquery-1.4.min.js&quot;&gt;jQuery Minified&lt;/a&gt; (23kb Gzipped)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.jquery.com/jquery-1.4.js&quot;&gt;jQuery Regular&lt;/a&gt; (154kb)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;Google AJAX APIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Traffic Light + Progress Bar</title>
   <link href="https://dwradcliffe.com/2009/12/31/traffic-light-+-progress-bar.html"/>
   <updated>2009-12-31T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/12/31/traffic-light-+-progress-bar</id>
   <content type="html">&lt;a href=&quot;http://relogik.com/eko&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-49&quot; title=&quot;eko&quot; src=&quot;/images/traffic-light-progress.jpg&quot; alt=&quot;&quot; width=&quot;460&quot; /&gt;&lt;/a&gt;

What happens when you mix a traditional traffic light with a progress bar? The folks at Relogik created a concept that's pretty interesting. Read about it here: &lt;a href=&quot;http://relogik.com/eko&quot; target=&quot;_blank&quot;&gt;http://relogik.com/eko&lt;/a&gt;.

What do you think? Do you think this would work?
</content>
 </entry>
 
 <entry>
   <title>TeuxDeux</title>
   <link href="https://dwradcliffe.com/2009/12/10/teuxdeux.html"/>
   <updated>2009-12-10T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/12/10/teuxdeux</id>
   <content type="html">It seems like these days everyone is always finding some new product or tool to help get things done.  There are many apps out there - a lot of good and a lot of bad apps.  I recently found one of the best.  The problem is simple - we can't keep track of what we need to do - so the solution should be simple too.

Enter TeuxDeux:

&lt;a href=&quot;http://www.teuxdeux.com&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-126&quot; title=&quot;TeuxDeux&quot; src=&quot;/images/teuxdeux_screenshot.png&quot; alt=&quot;&quot; width=&quot;540&quot; height=&quot;307&quot; /&gt;&lt;/a&gt;

TeuxDeux is probably the simplest to-do app you have ever seen.  It consists of a list, for each day. That's it. (Well, there's also a &quot;someday&quot; list too.)  Sign-up and give it a try. You will be amazed at how simple and usable this app is.

&lt;a href=&quot;http://www.teuxdeux.com&quot;&gt;http://www.teuxdeux.com&lt;/a&gt;
</content>
 </entry>
 
 <entry>
   <title>Thanksgiving!</title>
   <link href="https://dwradcliffe.com/2009/11/29/thanksgiving!.html"/>
   <updated>2009-11-29T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/11/29/thanksgiving!</id>
   <content type="html">Ahh... full of turkey. It's been a long weekend of many thanksgiving meals - a great time with friends and family and my wife.
</content>
 </entry>
 
 <entry>
   <title>FORUM Solutions is hiring!</title>
   <link href="https://dwradcliffe.com/2009/11/16/forum-solutions-is-hiring!.html"/>
   <updated>2009-11-16T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/11/16/forum-solutions-is-hiring!</id>
   <content type="html">FORUM Solutions is looking for a senior level .NET developer to join our team.

You can look at our official &lt;a href=&quot;http://forumsolutions.com/2009/11/16/forum-solutions-is-hiring&quot;&gt;blog post&lt;/a&gt;.

The official job posting is on &lt;a href=&quot;http://hostedjobs.openhire.com/epostings/submit.cfm?fuseaction=app.jobinfo&amp;amp;jobid=290028&amp;amp;company_id=15726&amp;amp;version=1&amp;amp;source=ONLINE&amp;amp;jobOwner=1006512&amp;amp;aid=1&quot;&gt;FORUM's openhire site&lt;/a&gt;.

If you're interested I encourage you to submit your resume and contact us!
&lt;div id=&quot;_mcePaste&quot; style=&quot;overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;&quot;&gt;

FORUM Solutions is currently looking for a senior level (5+ years) .NET developer.

&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Wedding Pictures</title>
   <link href="https://dwradcliffe.com/2009/11/10/wedding-pictures.html"/>
   <updated>2009-11-10T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/11/10/wedding-pictures</id>
   <content type="html">The day has come, our wedding pictures have finally arrived. Well, arrived to our screen.

&lt;a href=&quot;http://twitter.com/jrvanandel&quot;&gt;Jeremy&lt;/a&gt; has been working hard to go through our thousands of photos and he has now opened up the gates and we can look at all of them. There are a few different places you can look, starting with Facebook and his blog post and then also a slideshow (~400 photos) and the full gallery (~850 photos). The full gallery will also allow you to purchase prints of many sizes if you wish. Enjoy!
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.facebook.com/album.php?aid=2082509&amp;amp;id=57103613&quot; target=&quot;_blank&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jeremyvanandelphoto.blogspot.com/2009/11/davekate-married.html&quot; target=&quot;_blank&quot;&gt;Blog&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://rebelwagon.com/jeremyvan/DKWedSlideshow-1/&quot; target=&quot;_blank&quot;&gt;Slideshow&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://jvphoto.nextproof.com/galleries/dave-kate-wedding&quot; target=&quot;_blank&quot;&gt;Gallery&lt;/a&gt; (password: radcliffe)&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;http://jeremyvanandelphoto.blogspot.com/2009/11/davekate-married.html&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;Katie and her girls&quot; src=&quot;http://img.photobucket.com/albums/v51/jervanandel/DaveKateWed/JVP20091017-DKEWed-065.jpg&quot; alt=&quot;&quot; width=&quot;450&quot; /&gt;&lt;/a&gt;
</content>
 </entry>
 
 <entry>
   <title>Sept26</title>
   <link href="https://dwradcliffe.com/2009/09/26/sept26.html"/>
   <updated>2009-09-26T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/09/26/sept26</id>
   <content type="html">I'm getting married in 3 weeks!﻿
</content>
 </entry>
 
 <entry>
   <title>Engagement Photos</title>
   <link href="https://dwradcliffe.com/2009/08/22/engagement-photos.html"/>
   <updated>2009-08-22T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/08/22/engagement-photos</id>
   <content type="html">&lt;a href=&quot;http://twitter.com/jrvanandel&quot;&gt;Jeremy&lt;/a&gt; just posted our engagement photos!  They look AWESOME and we are super excited to have him take our wedding photos.  You can view the photos on &lt;a href=&quot;http://www.facebook.com/album.php?aid=2076537&amp;amp;id=57103613&quot;&gt;Facebook &lt;/a&gt;or &lt;a href=&quot;http://jeremyvanandelphoto.blogspot.com/2009/08/katie-dave-engaged.html&quot;&gt;Jeremy's blog&lt;/a&gt;.

&lt;a href=&quot;http://jeremyvanandelphoto.blogspot.com/2009/08/katie-dave-engaged.html&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;Katie &amp;amp; Dave&quot; src=&quot;http://img.photobucket.com/albums/v51/jervanandel/KatieDaveENGAGE/2009-08-09-KDE-WEB-10.jpg&quot; alt=&quot;&quot; width=&quot;460&quot; /&gt;&lt;/a&gt;
</content>
 </entry>
 
 <entry>
   <title>Forum Credit Union</title>
   <link href="https://dwradcliffe.com/2009/04/29/forum-credit-union.html"/>
   <updated>2009-04-29T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/04/29/forum-credit-union</id>
   <content type="html">Today I started a full time position at &lt;a href=&quot;http://www.forumcu.com&quot; target=&quot;_blank&quot;&gt;FORUM Credit Union&lt;/a&gt; working within their subsidiary called &lt;a href=&quot;http://www.forumsolutions.com&quot; target=&quot;_blank&quot;&gt;Forum Solutions&lt;/a&gt;.  I'm doing .NET development working on several internal solutions to improve efficiency.  So far I'm really enjoying this position.
</content>
 </entry>
 
 <entry>
   <title>Zend PHP 5 Certified Engineer</title>
   <link href="https://dwradcliffe.com/2009/02/17/zend-php-5-certified-engineer.html"/>
   <updated>2009-02-17T00:00:00+00:00</updated>
   <id>https://dwradcliffe.com/2009/02/17/zend-php-5-certified-engineer</id>
   <content type="html">I took the Zend PHP 5 Certification exam today and I passed! That makes me the newest Zend PHP 5 Certified Engineer in the world! (I know its a mouthful so I'll understand when you don't refer to that title). This means I am certified to know the syntax and usage of the PHP language. On to bigger and better things!

&lt;a href=&quot;http://www.zend.com/zce.php?c=ZEND010138&amp;amp;r=229045065&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-3&quot; title=&quot;php5-zce-logo-new&quot; src=&quot;/images/php5-zce-logo-new.gif&quot; alt=&quot;php5-zce-logo-new&quot; width=&quot;73&quot; height=&quot;68&quot; /&gt;&lt;/a&gt;
</content>
 </entry>
 

</feed>
