<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Art of Mission - Blog</title>
  <id>tag:www.artofmission.net,2009:mephisto/articles</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  
  <link href="http://www.artofmission.net/articles" rel="alternate" type="text/html" />
  <updated>2009-06-24T18:02:43Z</updated>
  <geo:lat>34.034714</geo:lat><geo:long>-117.173056</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/2.0/" /><link rel="self" href="http://feeds.feedburner.com/artofmission" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-06-19:4445</id>
    <published>2009-06-19T18:00:00Z</published>
    <updated>2009-06-24T18:02:43Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/Ddgsds0OTjk/ie8-acid-3-fail" rel="alternate" type="text/html" />
    <title>IE8 Acid 3 Fail</title>
<content type="html">
            &lt;p&gt;Out of curiousity I thought i’d run the Acid3 test on &lt;span class="caps"&gt;IE 8&lt;/span&gt;. It has a funny web address (&lt;a href="http://acid3.acidtests.org/"&gt;acid3.acidtests.org&lt;/a&gt;), so I searched for it in the explorer address bar. Which, of course goes to Ding. Or Bing. Whaever.&lt;/p&gt;


	&lt;p&gt;Strangely, &lt;a href="http://www.bing.com/search?q=acid3&amp;go=&amp;form=QBLH"&gt;Bing has no reference to the Acid3 test&lt;/a&gt;! Plenty of references to drugs, but no Acid3. How bizarre!&lt;/p&gt;


	&lt;p&gt;Maybe this is why:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://artofmission.com/assets/2009/6/19/acid_fail_1.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;For comparison, mobile Safari scores 97/100 on Acid3&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://artofmission.com/assets/2009/6/19/u39.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE 2&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Nothing could have prepared me for &lt;span class="caps"&gt;IE 7&lt;/span&gt;’s epic fail. Un. Be. Lievable. (Thanks David)&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://artofmission.com/assets/2009/6/24/ie7fail.png" alt="" /&gt;&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=Ddgsds0OTjk:QHkJX2WsQyg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=Ddgsds0OTjk:QHkJX2WsQyg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=Ddgsds0OTjk:QHkJX2WsQyg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=Ddgsds0OTjk:QHkJX2WsQyg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/6/19/ie8-acid-3-fail</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-05-31:4437</id>
    <published>2009-05-31T21:00:00Z</published>
    <updated>2009-05-31T21:58:27Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/tCX8bljQ4VU/parse-full-names-with-ruby" rel="alternate" type="text/html" />
    <title>Parse Full Names with Ruby</title>
<content type="html">
            &lt;p&gt;We do a lot of &lt;a href="http://www.donortools.com/about/data_migration"&gt;data migrations&lt;/a&gt; for Donor Tools – a lot of folks are coming to us from other systems, and they need their data ported over. Depending on the kind of system they were using, this can be anywhere from a quick script to a major data transformation headache.&lt;/p&gt;


	&lt;p&gt;Recently I needed a quick way to parse a full name string into name parts. Given a name like “Dr. Joe Donor, M.D.”, I wanted to end up with a name object with a prefix of “Dr.”, a suffix of “M.D.”, a first name of “Joe”, and a last name of “Donor”. Complicating matters, it also needed to be able to handle odd permutations like “Dr. and Mrs. Joe and Jane Donor”, etc.&lt;/p&gt;


	&lt;p&gt;The main problem that I had was with the “and”. If there was an “and”, it should put the preceding and following words together to form a single word. This turned out to be nearly impossible with regular expressions, but pretty easy with a combination of Ruby and regex. Here’s how it looks.&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Name&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.parse(name)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;false&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; name.is_a?(&lt;span class="co"&gt;String&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# First, split the name into an array&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    parts = name.split&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# If any part is &amp;quot;and&amp;quot;, then put together the two parts around it&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# For example, &amp;quot;Mr. and Mrs.&amp;quot; or &amp;quot;Mickey and Minnie&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    parts.each_with_index &lt;span class="r"&gt;do&lt;/span&gt; |part, i|&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;if&lt;/span&gt; [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;].include?(part) &lt;span class="r"&gt;and&lt;/span&gt; i &amp;gt; &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        p3 = parts.delete_at(i&lt;span class="i"&gt;+1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;        p2 = parts.at(i)&lt;tt&gt;
&lt;/tt&gt;        p1 = parts.delete_at(i&lt;span class="i"&gt;-1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;        parts[i&lt;span class="i"&gt;-1&lt;/span&gt;] = [p1, p2, p3].join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# Build a hash of the remaining parts&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    {&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:suffix&lt;/span&gt; =&amp;gt; (s = parts.pop &lt;span class="r"&gt;unless&lt;/span&gt; parts.last !~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;(&lt;/span&gt;&lt;span class="ch"&gt;\w&lt;/span&gt;&lt;span class="k"&gt;+&lt;/span&gt;&lt;span class="ch"&gt;\.&lt;/span&gt;&lt;span class="k"&gt;|[IVXLM]+|[A-Z]+)$&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;),&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:last_name&lt;/span&gt;  =&amp;gt; (l = parts.pop),&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:prefix&lt;/span&gt; =&amp;gt; (p = parts.shift &lt;span class="r"&gt;unless&lt;/span&gt; parts[&lt;span class="i"&gt;0&lt;/span&gt;] !~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;^&lt;/span&gt;&lt;span class="ch"&gt;\w&lt;/span&gt;&lt;span class="k"&gt;+&lt;/span&gt;&lt;span class="ch"&gt;\.&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;),&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:first_name&lt;/span&gt; =&amp;gt; (f = parts.shift),&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="sy"&gt;:middle_name&lt;/span&gt; =&amp;gt; (m = parts.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;    }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Here’s the output:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="co"&gt;Name&lt;/span&gt;.parse &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Mr. Joe Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; {&lt;span class="sy"&gt;:middle_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:prefix&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Mr.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:last_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:suffix&lt;/span&gt;=&amp;gt;&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="sy"&gt;:first_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Name&lt;/span&gt;.parse &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Dr. and Mrs. Joe Donor, M.D.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; {&lt;span class="sy"&gt;:middle_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:prefix&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Dr. and Mrs.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:last_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Donor,&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:suffix&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;M.D.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:first_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Name&lt;/span&gt;.parse &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe and Jane Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; {&lt;span class="sy"&gt;:middle_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:prefix&lt;/span&gt;=&amp;gt;&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="sy"&gt;:last_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:suffix&lt;/span&gt;=&amp;gt;&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="sy"&gt;:first_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe and Jane&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Name&lt;/span&gt;.parse &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe and Jane Major-Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; {&lt;span class="sy"&gt;:middle_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:prefix&lt;/span&gt;=&amp;gt;&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="sy"&gt;:last_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Major-Donor&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:suffix&lt;/span&gt;=&amp;gt;&lt;span class="pc"&gt;nil&lt;/span&gt;, &lt;span class="sy"&gt;:first_name&lt;/span&gt;=&amp;gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Joe and Jane&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=tCX8bljQ4VU:Zv8J7ssUYUg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=tCX8bljQ4VU:Zv8J7ssUYUg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=tCX8bljQ4VU:Zv8J7ssUYUg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=tCX8bljQ4VU:Zv8J7ssUYUg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/5/31/parse-full-names-with-ruby</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-05-06:4431</id>
    <published>2009-05-06T17:00:32Z</published>
    <updated>2009-05-06T17:34:49Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/1xP4jfclz4k/gist-first-impressions" rel="alternate" type="text/html" />
    <title>Gist First Impressions</title>
<content type="html">
            &lt;p&gt;After publicly swooning over Gist, I finally got my Gist invite yesterday! What a treat! I wanted to share a few quick first impressions.&lt;/p&gt;


	&lt;p&gt;First impression is that this is really, really cool. I put in a couple key bits of information (my Facebook auth and my Twitter name [&lt;a href="http://twitter.com/donortools"&gt;@donortools&lt;/a&gt;]), and it started sucking down my friends and followers (doesn’t that make me sound cool). After a while it had imported all my contacts, and put together a sort of aggregate “wall” for each.&lt;/p&gt;


	&lt;p&gt;Since many of my contacts were from Twitter, many have just their tweets in their contact wall. For example, I follow Guy Kawasaki, and since he doesn’t know I exist all I have on his wall is his prolific list of recent tweets. This is minorly useful, but I think it will start to get a lot more informative after I hook in more services and provide more detail about my contacts. However, for a few of my contacts I have a lot more information, such as rss feeds and such, which makes their contact record bristle with information.&lt;/p&gt;


	&lt;p&gt;One of the things I’m hoping for is Apple Mail integration. Currently they have an Outlook plugin, which looks promising but doesn’t work for me as a Mac user. Also, I had a bit of trouble connecting to my Google Apps account. Might have been a &lt;span class="caps"&gt;PBKAC&lt;/span&gt; (Problem Between Keyboard And Chair) error though.&lt;/p&gt;


	&lt;p&gt;All in all I’m very impressed. They’ve got an awesome service and I can’t wait to see how it develops.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=1xP4jfclz4k:aHD1gIEIW2E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=1xP4jfclz4k:aHD1gIEIW2E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=1xP4jfclz4k:aHD1gIEIW2E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=1xP4jfclz4k:aHD1gIEIW2E:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/5/6/gist-first-impressions</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-05-05:4429</id>
    <published>2009-05-05T20:34:08Z</published>
    <updated>2009-05-05T20:34:58Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/VJglMp06_2M/donor-tools-is-growing" rel="alternate" type="text/html" />
    <title>Donor Tools is Growing</title>
<content type="html">
            &lt;p&gt;This is an exciting time for Donor Tools! We’re growing, and &lt;strong&gt;I’m so pleased to welcome Chris Dumas to the Donor Tools team&lt;/strong&gt;!&lt;/p&gt;


	&lt;p&gt;Chris is joining Donor Tools to head up business development. Chris has a tremendous amount of positive energy, and he knows his stuff. This is an exciting time at Donor Tools. We’re growing, momentum is building, and we’re excited about the new things that we have to offer in the coming months.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.donortools.com/2009/05/04/the-new-guy-at-donor-tools/"&gt;Read Chris’ remarks over on the Donor Tools blog &amp;rarr;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Welcome Chris! It’s great to have you on board!&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=VJglMp06_2M:DQDqmYyHYvY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=VJglMp06_2M:DQDqmYyHYvY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=VJglMp06_2M:DQDqmYyHYvY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=VJglMp06_2M:DQDqmYyHYvY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/5/5/donor-tools-is-growing</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-05-05:4428</id>
    <published>2009-05-05T16:00:41Z</published>
    <updated>2009-05-05T20:27:51Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/9Z-qzo6UUHY/gist" rel="alternate" type="text/html" />
    <title>Gist</title>
<content type="html">
            &lt;p&gt;I am itching to try &lt;a href="http://gist.com"&gt;Gist&lt;/a&gt;. The idea, as I understand it, is that Gist gives you a web’s-eye view of the people who you email with. So you could see blog articles, tweets (maybe?), news, etc. about the person who just sent you a message. Pretty idea.&lt;/p&gt;


	&lt;p&gt;I haven’t gotten my invite yet, but I’m waiting with baited breath (hint hint). I’ll be sure to let you all know how it goes if I get an early invite to the beta.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=9Z-qzo6UUHY:nw5kyLWxT48:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=9Z-qzo6UUHY:nw5kyLWxT48:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=9Z-qzo6UUHY:nw5kyLWxT48:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=9Z-qzo6UUHY:nw5kyLWxT48:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/5/5/gist</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-03-23:4421</id>
    <published>2009-03-23T16:39:00Z</published>
    <updated>2009-03-23T16:42:55Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/JFFG4Cme9bo/web-forms-submit-or-save" rel="alternate" type="text/html" />
    <title>Web Forms: Submit or Save?</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;Submit&lt;/strong&gt; (v) 1 [ intrans. ] accept or yield to a superior force or to the authority or will of another, 2 [ trans. ] present (a proposal, application, or other document) to a person or body for consideration or judgment…&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Save&lt;/strong&gt; (v): 1 [ trans. ] keep safe or rescue (someone or something) from harm or danger, 2 keep and store up (something, esp. money) for future use…&lt;/p&gt;


	&lt;p&gt;Hmmm…&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;Source: Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; Dictionary&lt;/em&gt;&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=JFFG4Cme9bo:Emq7_x3GNqY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=JFFG4Cme9bo:Emq7_x3GNqY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=JFFG4Cme9bo:Emq7_x3GNqY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=JFFG4Cme9bo:Emq7_x3GNqY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/3/23/web-forms-submit-or-save</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2009-02-10:4407</id>
    <published>2009-02-10T00:20:00Z</published>
    <updated>2009-02-10T00:25:05Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/GgPaftwcE5g/rearrange-your-os-x-menu-bar" rel="alternate" type="text/html" />
    <title>Rearrange Your OS X Menu Bar</title>
<content type="html">
            &lt;p&gt;Did you know you can rearrange the icons in your menu bar in &lt;span class="caps"&gt;OS X&lt;/span&gt;? I just figured this out by accident. Hold down the Command key, and drag the icon to move it. If you drag it out of the menu bar, it will poof and go away. Boom!&lt;/p&gt;


	&lt;p&gt;Apparently the only icon that can’t be moved is the Spotlight icon. It’s a super icon.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://artofmission.com/assets/2009/2/10/move-icons.png" alt="" /&gt;&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=GgPaftwcE5g:dvuL-Mi6wtA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=GgPaftwcE5g:dvuL-Mi6wtA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=GgPaftwcE5g:dvuL-Mi6wtA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=GgPaftwcE5g:dvuL-Mi6wtA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2009/2/10/rearrange-your-os-x-menu-bar</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-12-17:4400</id>
    <published>2008-12-17T19:01:00Z</published>
    <updated>2008-12-17T19:08:32Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/6WAMa2p5dFE/application-octet-stream-wtf" rel="alternate" type="text/html" />
    <title>application/octet-stream WTF?</title>
<content type="html">
            &lt;p&gt;Lately I’ve been having this problem with uploaded files using the &lt;a href="http://www.thoughtbot.com/projects/paperclip"&gt;Paperclip plugin&lt;/a&gt; (though I don’t think it has anything to do with the plugin).&lt;/p&gt;


	&lt;p&gt;My customers are trying to upload &lt;span class="caps"&gt;CSV&lt;/span&gt; files to their Donor Tools account. Normally, when you upload a .csv file, the content type is set to “text/csv” or some variation of “text/*”.&lt;/p&gt;


	&lt;p&gt;Here’s the problem: when uploading .csv files in Windows using any version of IE or Firefox, the content type is set to “application/octet-stream”.&lt;/p&gt;


	&lt;p&gt;What the flip?&lt;/p&gt;


	&lt;p&gt;This only occurs with IE or Firefox. Safari for Windows uploads the exact same file with the content type set correctly to “text/csv”.&lt;/p&gt;


	&lt;p&gt;To get around the problem I’ve temporarily turned off the file type validation, which I don’t like because I really don’t want to be accepting uploaded binary files.&lt;/p&gt;


	&lt;p&gt;Has anyone seen this problem before? How did you deal with it?&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=6WAMa2p5dFE:SMGyKSTta40:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=6WAMa2p5dFE:SMGyKSTta40:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=6WAMa2p5dFE:SMGyKSTta40:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=6WAMa2p5dFE:SMGyKSTta40:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/12/17/application-octet-stream-wtf</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-12-10:4395</id>
    <published>2008-12-10T03:16:00Z</published>
    <updated>2008-12-10T03:23:37Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/fW15jO6TIR4/break-up-big-migrations-with-willpaginate" rel="alternate" type="text/html" />
    <title>Break Up Big Migrations with WillPaginate</title>
<content type="html">
            &lt;p&gt;Have a big migration that would take too long to complete? It would be too bad to inadvertently bring down your whole server by loading a big dataset into memory.&lt;/p&gt;


	&lt;p&gt;A very simple solution is to use &lt;a href="http://github.com/mislav/will_paginate/tree/master"&gt;will_paginate&lt;/a&gt;. I was just combing through the plugin code, and found out that will_paginate has a nice method called &lt;a href="http://github.com/mislav/will_paginate/tree/master/lib/will_paginate/finder.rb#L99"&gt;&lt;code&gt;paginated_each&lt;/code&gt;&lt;/a&gt;, which “Iterates through all records by loading one page at a time. This is useful for migrations or any other use case where you don’t want to load all the records in memory at once.”&lt;/p&gt;


	&lt;p&gt;So instead of writing &lt;code&gt;for article in Article.find(all)&lt;/code&gt;, you’re better off using &lt;code&gt;Article.paginated_each do |article|&lt;/code&gt;. Your migrations will finish faster and with less memory usage.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=fW15jO6TIR4:tyFPeKVP6YI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=fW15jO6TIR4:tyFPeKVP6YI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=fW15jO6TIR4:tyFPeKVP6YI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=fW15jO6TIR4:tyFPeKVP6YI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/12/10/break-up-big-migrations-with-willpaginate</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-11-10:4197</id>
    <published>2008-11-10T17:50:00Z</published>
    <updated>2008-11-10T17:57:43Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/5NsR5btJ9bA/eversave-the-missing-autosave-for-os-x-apps" rel="alternate" type="text/html" />
    <title>EverSave - The Missing Autosave for OS X Apps</title>
<content type="html">
            &lt;p&gt;&lt;img class="right" src="http://www.artofmission.com/assets/2008/11/10/eversave.jpg" alt="" /&gt; I hate to admit it, but I have lost documents while working on my mac. You know how it happens – typing a long document in Pages, with 35 tabs open in Safari, checking Mail, downloading attachments, then open Photoshop and… Boom. It crashes. And I forgot to save.&lt;/p&gt;


	&lt;p&gt;Strangely, there is no auto-save feature in Apple Pages or Keynote, nor any number of other &lt;span class="caps"&gt;OS X&lt;/span&gt; apps. TextMate has this feature, and I rely heavily on it. Every time I make a change to a file, I switch to the browser to check it out, and TextMate automatically saves my file. I barely even think about it, until it’s not there.&lt;/p&gt;


	&lt;p&gt;Today I discovered EverSave, a free app that auto-saves your documents for you.&lt;/p&gt;


&lt;blockquote&gt;
	&lt;p&gt;EverSave is a clever tool which allows you to save all of your documents – if possible – in a specific time interval or by changing the frontmost application. This means no more data loss if applications crash.&lt;/p&gt;

&lt;/blockquote&gt;




	&lt;p&gt;This should &lt;strong&gt;definitely&lt;/strong&gt; be built into all new &lt;span class="caps"&gt;OS X&lt;/span&gt; apps.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://www.tool-forcesw.com/eversave/"&gt;Download it here&lt;/a&gt;&lt;/h3&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=5NsR5btJ9bA:rnYVqPfSRR4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=5NsR5btJ9bA:rnYVqPfSRR4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=5NsR5btJ9bA:rnYVqPfSRR4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=5NsR5btJ9bA:rnYVqPfSRR4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/11/10/eversave-the-missing-autosave-for-os-x-apps</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-10-31:4194</id>
    <published>2008-10-31T19:17:00Z</published>
    <updated>2008-10-31T19:18:33Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/HkVdi8XHBi0/spike" rel="alternate" type="text/html" />
    <title>Spike</title>
<content type="html">
            &lt;p&gt;Wow! Donor Tools peaked at almost 2000 visitors yesterday thanks to linkage from &lt;a href="http://tinyurl.com/bestwebgallery-donortools"&gt;Best Web Gallery&lt;/a&gt; and &lt;a href="http://tinyurl.com/cssmania-donortools"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; Mania&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://www.artofmission.com/assets/2008/10/31/spike_1.png" alt="" /&gt;&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=HkVdi8XHBi0:J8L3N-S6It8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=HkVdi8XHBi0:J8L3N-S6It8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=HkVdi8XHBi0:J8L3N-S6It8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=HkVdi8XHBi0:J8L3N-S6It8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/10/31/spike</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-10-31:4193</id>
    <published>2008-10-31T17:19:00Z</published>
    <updated>2008-10-31T17:20:15Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/rMuJEf4Cl4E/parenting-theory" rel="alternate" type="text/html" />
    <title>Parenting Theory</title>
<content type="html">
            &lt;p&gt;As our children are developing into ever more sophisticated and rational human beings, we are degenerating – devolving into shadowy cave-people, with heightened reflexes but incapable of forming a complete sentence or retaining a memory for more than 15 seconds. No. Complete. Sentence. Ungh! But! We can catch a glass jar tipped by a toddler as it hurtles its way to the ground. Me kung-fu cave dad.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=rMuJEf4Cl4E:0DbO0TKfxL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=rMuJEf4Cl4E:0DbO0TKfxL0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=rMuJEf4Cl4E:0DbO0TKfxL0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=rMuJEf4Cl4E:0DbO0TKfxL0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/10/31/parenting-theory</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-10-30:4184</id>
    <published>2008-10-30T17:07:00Z</published>
    <updated>2008-11-03T23:57:43Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/uO91L150jkw/track-referrals-in-your-rails-app" rel="alternate" type="text/html" />
    <title>Track Referrals in Your Rails App</title>
<content type="html">
            &lt;p&gt;Here’s a quick and easy way to track exactly where your signups are coming from, and who referred any given customer, without having to cross-reference your analytics program.&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;before_filter: set_referer&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;set_referer&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  cookies[&lt;span class="sy"&gt;:referer&lt;/span&gt;] = request.env[&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;HTTP_REFERER&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;] &lt;span class="r"&gt;if&lt;/span&gt; cookies[&lt;span class="sy"&gt;:referer&lt;/span&gt;].nil?&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;The &lt;code&gt;set_referer&lt;/code&gt; method sets up a session variable that keeps the original referrer with your customer, no matter how many pages they click through before signing up.&lt;/p&gt;


	&lt;p&gt;You can email this variable to yourself when they sign up, or store it in the database to keep track of who came from where.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=uO91L150jkw:tW8WNNN7lAM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=uO91L150jkw:tW8WNNN7lAM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=uO91L150jkw:tW8WNNN7lAM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=uO91L150jkw:tW8WNNN7lAM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/10/30/track-referrals-in-your-rails-app</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-10-24:4116</id>
    <published>2008-10-24T05:07:00Z</published>
    <updated>2008-10-24T05:29:07Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/wta1-hsClQM/wildcard-searches-with-thinking-sphinx" rel="alternate" type="text/html" />
    <title>Wildcard (*) Searches With Thinking Sphinx</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://railscasts.com/episodes/120-thinking-sphinx"&gt;Ryan Bates has a helpful screencast&lt;/a&gt; about the using the excellent Thinking Sphinx Rails plugin for the Sphinx search engine.&lt;/p&gt;


	&lt;p&gt;There seems to be a bit of confusion over how to enable wildcard (star) searches with Thinking Sphinx. Wildcard searches would let you search for partial words, so “thin*” would match “Thinking Sphinx” and “Thinner”. This is pretty useful, and for &lt;a href="http://www.donortools.com"&gt;Donor Tools&lt;/a&gt; it is essential.&lt;/p&gt;


	&lt;p&gt;Turns out it’s really easy to turn on wildcard search. There is no need to make any changes to your Sphinx setup or add a &lt;code&gt;config/sphinx.yml&lt;/code&gt; file.  In your &lt;code&gt;define_index&lt;/code&gt; block, simply add &lt;code&gt;enable_star&lt;/code&gt; and &lt;code&gt;min_prefix_len&lt;/code&gt; like so:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;define_index &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ...&lt;tt&gt;
&lt;/tt&gt;  set_property &lt;span class="sy"&gt;:enable_star&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_property &lt;span class="sy"&gt;:min_prefix_len&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;3&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;&lt;code&gt;enable_star&lt;/code&gt; simply turns on wildcard searching. However, this won’t do much good unless you also enable prefix indexing using &lt;code&gt;min_prefix_len&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;min_prefix_len&lt;/code&gt; sets the minimum number of letters that Sphinx will index. From the Sphinx docs:&lt;/p&gt;


&lt;blockquote&gt;
	&lt;p&gt;...indexing a keyword “example” with min_prefix_len=3 will result in indexing “exa”, “exam”, “examp”, “exampl” prefixes along with the word itself.&lt;/p&gt;

&lt;/blockquote&gt;




	&lt;p&gt;You can also set &lt;code&gt;min_infix_len&lt;/code&gt;, which does the same thing as &lt;code&gt;min_prefix_len&lt;/code&gt;, except it does it on the middle of the word.&lt;/p&gt;


&lt;blockquote&gt;
	&lt;p&gt;Infix indexing allows to implement wildcard searching by ‘start*’, ’*end’, and ’*middle*’ wildcards.&lt;/p&gt;

&lt;/blockquote&gt;




	&lt;p&gt;Caution: Infix indexing can cause your index to grow, and may slow down searching.&lt;/p&gt;


	&lt;p&gt;Now, re-run &lt;code&gt;rake thinking_sphinx:configure&lt;/code&gt;, re-index (&lt;code&gt;rake ts:in&lt;/code&gt;), and restart the Sphinx daemon (&lt;code&gt;rake ts:run&lt;/code&gt;), and it should work.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=wta1-hsClQM:PhrN8e0wfFk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=wta1-hsClQM:PhrN8e0wfFk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=wta1-hsClQM:PhrN8e0wfFk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=wta1-hsClQM:PhrN8e0wfFk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/10/24/wildcard-searches-with-thinking-sphinx</feedburner:origLink></entry>
  <entry xml:base="http://www.artofmission.net/">
    <author>
      <name>Ryan</name>
    </author>
    <id>tag:www.artofmission.net,2008-10-20:4069</id>
    <published>2008-10-20T18:10:00Z</published>
    <updated>2008-10-25T14:48:07Z</updated>
    <category term="Blog" />
    <link href="http://feedproxy.google.com/~r/artofmission/~3/IPaXspdRQGY/chuck-baldwin-for-president" rel="alternate" type="text/html" />
    <title>Chuck Baldwin for President</title>
<content type="html">
            &lt;p&gt;I love change. I love hope. And I love choices. But something about the way our electoral process works really rubs me the wrong way. Sure, it’s great that we get to vote for our President. But someone out there – someone with power – has picked my two choices for me, and for the past year has been hammering it into my head that if I don’t choose one of these two prescribed choices, then I’m throwing my vote away. You know what I realized? Aside from minor policy differences, like what percent of a tax cut the middle class will get, and whether we should invade this country or that country, there really is very little difference between the two mainstream candidates. Both Senators Obama and McCain voted in support of  &lt;span class="caps"&gt;FISA&lt;/span&gt;, the Patriot Act, and the Bailout Bill, three of the most odious and nefarious acts of legislation that have done incredible damage to the American way. Neither of these two candidates provide any real solutions, and when put to the test, we see that in the end, a vote for McCain is the same as a vote for Obama; and neither will bring about any real change or mitigate or destroy the corruption that now gnaws away at the character of our government, nor will they stop the cancerous expansion of government powers that make our current government look and act more and more like the government of King George, from whom we won our Independence.&lt;/p&gt;


	&lt;p&gt;So if there is no real difference between the two, and I’m only voting for one or the other because I want to be on the winning side, or because I want to vote for one so the other won’t win, then I am truly &lt;a href="http://www.chuckbaldwinlive.com/c2008/cbarchive_20081010.html"&gt;wasting my vote&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;What’s a patriot to do?&lt;/p&gt;


	&lt;p&gt;Well, did you know that there are actually &lt;a href="http://en.wikipedia.org/wiki/U.S._presidential_election,_2008"&gt;six noteworthy candidates&lt;/a&gt; (plus a few others) for president this election? 
“But”, you say, “none of these candidates can win. Why bother voting at all?” You’re right, we might as well just give up. No sense in playing if we can’t be on the winning team, right? Look, the whole country is saying that. Everybody is just rolling over and letting the political establishment have its way with them. If we all just comply then we’re going to get exactly what people with power want to give us. That’s what the American Revolution was about folks! In a way, the American Revolution continues to this day. The fight against tyranny and oppression will go on as long as there are good and evil (and I don’t mean the “axis of evil” – I mean real evil, and people who would use power to harm other people). As long as we’re here on this earth we each have a responsibility to fight to maintain our freedom and our individual rights and to preserve and protect our Constitution against all enemies, foreign and domestic. The Constitution (&lt;a href="http://www.law.cornell.edu/constitution/constitution.overview.html"&gt;read it, it’s good&lt;/a&gt;) limits the government’s power, and it grants the government power only by the consent of the governed. Our responsibility as citizens is to give that consent, to withhold our consent to tyranny, and to keep the government accountable by electing officials that respect the people and their position as representatives of the people.&lt;/p&gt;


	&lt;p&gt;One of the most obvious ways that we fulfill this responsibility is by choosing our executive, our President. If we believe in the Constitution, then we ought to elect a president who shares our reverence of liberty, freedom, and the Constitution, and who has demonstrated an understanding of these tenets, and who will do the most to uphold these precious things.&lt;/p&gt;


	&lt;p&gt;That is why I have decided to support &lt;a href="http://www.baldwin08.com/"&gt;Chuck Baldwin&lt;/a&gt; for President of the United States.&lt;/p&gt;


	&lt;p&gt;Baldwin does not have as much political experience as Obama or McCain, but in this case I think that might be a good thing. He certainly is not part of the political establishment. Based on his writings, his history, and his character recommendations, I believe that Chuck Baldwin is the candidate best suited to execute the office of President of the United States.&lt;/p&gt;


	&lt;p&gt;- Ryan Heneise&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=IPaXspdRQGY:uO0IebFDnFM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=IPaXspdRQGY:uO0IebFDnFM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=IPaXspdRQGY:uO0IebFDnFM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/artofmission?a=IPaXspdRQGY:uO0IebFDnFM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/artofmission?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>  <feedburner:origLink>http://www.artofmission.net/articles/2008/10/20/chuck-baldwin-for-president</feedburner:origLink></entry>
</feed>
