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

<channel>
	<title>Ryan Pfister</title>
	<atom:link href="http://www.ryanpfister.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ryanpfister.com</link>
	<description>Programmer, Pontificator, Prognosticator</description>
	<pubDate>Fri, 24 Jul 2009 15:11:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to sort by date with Nutch</title>
		<link>http://www.ryanpfister.com/2009/04/how-to-sort-by-date-with-nutch/</link>
		<comments>http://www.ryanpfister.com/2009/04/how-to-sort-by-date-with-nutch/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 20:23:06 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=71</guid>
		<description><![CDATA[I&#8217;ve been working with a team over the last few months to create a search engine that could sort by date for the local student newspaper. Among the open-source search engines available, Nutch seems to be the easiest to set up. However, I couldn&#8217;t find any tutorials on sorting by date so I decided to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working with a team over the last few months to create a search engine that could sort by date for the local student newspaper. Among the open-source search engines available, <a href="http://lucene.apache.org/nutch/">Nutch</a> seems to be the easiest to set up. However, I <a href="http://www.google.com/search?q=nutch+sort+by+date">couldn&#8217;t find</a> any tutorials on sorting by date so I decided to write this one.</p>
<p>Nutch, in its default configuration, will sort pages by relevance using <a href="http://jayant7k.blogspot.com/2006/07/document-scoringcalculating-relevance_08.html">Lucene scores</a>. You can get Nutch to sort by another field in its index using the <code>sort</code> parameter, but first, you need a field to sort by. (For an example of how sorting works, add <code>&#038;sort=url</code> to the end of your Nutch query. Obviously sorting by url isn&#8217;t very useful, but you can see how the query works. Note that you can also add <code>&#038;reverse=true</code> to sort the results in reverse order.)</p>
<p>Sorting by date in Nutch essentially involves two parts: first, using a plugin to get Nutch to index dates into a new field in your index, and second, getting your query page to add the additional parameter to search queries.</p>
<p><strong>Indexing dates with a Nutch plugin</strong></p>
<p><em>NOTE:</em> I figured out most of the information here from the tutorial on <a href="http://wiki.apache.org/nutch/WritingPluginExample-0.9">writing a Nutch plugin</a> available on the <a href="http://wiki.apache.org/nutch/PluginCentral">Nutch Wiki</a>. If you need more detailed information on any of the steps here I recommend reading that tutorial.</p>
<p>All Nutch plugins implement an interface. These interfaces are called extension points. The Nutch Wiki has a list of available <a href="http://wiki.apache.org/nutch/AboutPlugins">extension points</a>. The goal of our plugin is to add an additional date field to the Lucene index, so we want to implement the <a href="http://lucene.apache.org/nutch/apidocs/org/apache/nutch/indexer/IndexingFilter.html">IndexingFilter</a> interface.</p>
<p>Nutch plugins consist of xml description files and your Java source code files. File structure is as follows:</p>
<pre>
/nutch-dir
  /src
    /plugin
      /yourpluginname
        build.xml
        plugin.xml
        /src
          /org
            /apache
              /nutch
                /yourpluginname
                  ImplementationClassName.java
</pre>
<p>Here&#8217;s an example <code>build.xml</code> file:</p>
<pre>
&lt;?xml version="1.0"?&gt;
&lt;project name="yourpluginname" default="jar"&gt;
  &lt;import file="../build-plugin.xml"/&gt;
&lt;/project&gt;
</pre>
<p>And here&#8217;s an example plugin.xml file:</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;plugin
   id="yourpluginname"
   name="longer/human-readable name of your plugin"
   version="0.0.1"
   provider-name="your_website"&gt;

   &lt;runtime&gt;
      &lt;library name="yourpluginname.jar"&gt;
         &lt;export name="*"/&gt;
      &lt;/library&gt;
   &lt;/runtime&gt;

   &lt;extension id="org.apache.nutch.urldateindexer.yourpluginname"
              name="longer/human-readable name of your plugin"
              point="org.apache.nutch.indexer.IndexingFilter"&gt;
      &lt;implementation id="ImplementationClassName"
                      class="org.apache.nutch.yourpluginname.ImplementationClassName"/&gt;
   &lt;/extension&gt;
&lt;/plugin&gt;
</pre>
<p>NOTE: I had some trouble using my own package name, but it might have been due to another problem. When in doubt I recommend sticking with <code>org.apache.nutch.yourpluginname</code>.</p>
<p>And here&#8217;s the code for the Java source file, <code>ImplementationClassName.java</code>. (You&#8217;ll want to change it to your own name to match what you put in the <code>plugin.xml</code> file.)</p>
<pre>
package org.apache.nutch.yourpluginname;

//imports
import java.util.Date;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.DateTools.Resolution;
import org.apache.nutch.crawl.CrawlDatum;
import org.apache.nutch.crawl.Inlinks;
import org.apache.nutch.indexer.IndexingException;
import org.apache.nutch.indexer.IndexingFilter;
import org.apache.nutch.parse.Parse;

public class UrlDateIndexer implements IndexingFilter {

  private Configuration conf;

  public UrlDateIndexer() {
  }

  //this is where your code to add a new field to the index goes
  public Document filter(Document doc, Parse parse, Text url,
    CrawlDatum datum, Inlinks inlinks)
    throws IndexingException {

    // Get url from the method inputs
    String urlString = url.toString();

    // Use regex to identify type of date and parse date from url format (code for the TdcDateParser class not shown)
    TdcDateParser tdcDateParser = new TdcDateParser();
    Date publishedDate = tdcDateParser.parseUrl(urlString);

    // Store date in field
    if (null != publishedDate){
    	//create a new field
      Field publishedDateField = new Field("published_date",DateTools.dateToString(publishedDate, Resolution.DAY),
           Field.Store.YES, Field.Index.UN_TOKENIZED);

      //add the field to the index
    	doc.add(publishedDateField);
    }

    return doc;
  }

  public void setConf(Configuration conf) {
    this.conf = conf;
  }

  public Configuration getConf() {
    return this.conf;
  }
}
</pre>
<p>In the case of the plugin I build, the goal was to parse the date from the url of a page. You&#8217;ll need to modify this method to get the date from wherever is appropriate for your search engine. The basic flow is to create a field, add that field to a document and then return the document.</p>
<p>There are a few things to note about the line that creates the new field:</p>
<pre>
Field publishedDateField = new Field("published_date",DateTools.dateToString(publishedDate, Resolution.DAY),
    Field.Store.YES, Field.Index.UN_TOKENIZED);
</pre>
<ul>
<li><em>dateToString</em>: More recent versions of Lucene don&#8217;t store dates in the index directly. Therefore, you need to use the <code>dateToString</code> method to store dates. </li>
<li>
<em>Field.Store.YES</em>: This stores the text of the field in the index. You wouldn&#8217;t do this for a long field that you don&#8217;t need to view in its entirety in the search engine (e.g. page content). I believe setting <code>Field.Store</code> to <code>YES</code> is mandatory to be able to sort by a field.</li>
<li><em>Field.Index.UN_TOKENIZED</em>: Tells Lucene not to break up the field into individual words, as it would with a page&#8217;s content. I also believe this is mandatory to be able to sort by a field.</li>
</ul>
<p>Now that you have finished creating your files, upload them to the nutch directory on your server if you haven&#8217;t already done so. Then, add a line like the following to the <code>build.xml</code> file in the <code>/nutch-dir/src/plugin</code> directory:</p>
<pre>
  &lt;ant dir="yourpluginname" target="deploy"/&gt;
</pre>
<p>Then launch <code>ant</code> from the command line in that same directory (<code>/nutch-dir/src/plugin</code>). This should compile the classes and jar file for your plugin and place them in the <code>/nutch-dir/build</code> directory. It should also place a copy of the jar file and <code>plugin.xml</code> file in the <code>/nutch-dir/plugins</code> directory.</p>
<p>NOTE: I had to modify the <code>deploy.dir</code> property in the <code>/nutch-dir/src/plugin/build-plugin.xml</code> file to get ant to put the jar and plugin.xml file in the right plugins directory. Originally it was set to put them in <code>build/plugins</code>. I&#8217;m not sure which directory is formally correct, but the <code>/nutch-dir/plugins</code> directory is where Nutch was set to read from on my system. If this is the case for you, just remove <code>/build</code> from the <code>deploy.dir</code> line. My resulting <code>deploy.dir</code> line is as follows:</p>
<pre>
&lt;property name="deploy.dir" location="${nutch.root}/plugins/${name}"/&gt;
</pre>
<p>Next, you need to modify the <code>/nutch-dir/conf/nutch-site.xml</code> file to recognize your new plugin. Just add your plugin name to the <code>plugin.includes</code> property. For example:</p>
<pre>
&lt;property&gt;
  &lt;name&gt;plugin.includes&lt;/name&gt;
  &lt;value&gt;yourpluginname|protocol-http|urlfilter-regex|parse-(text|html|js)|index
-basic|query-(basic|site|url)|summary-basic|scoring-opic|urlnormalizer-(pass|reg
ex|basic)&lt;/value&gt;
&lt;/property&gt;
</pre>
<p>Launch a Nutch crawl of just a few pages to test your new plugin. To see if the plugin was activated by Nutch, open <code>/nutch-dir/logs/hadoop.log</code> and look for a line like the following:</p>
<pre>
2009-04-17 10:54:27,477 INFO  plugin.PluginRepository - Indexer of dates from URLs (urldateindexer)
</pre>
<p>If the plugin didn&#8217;t show up, make sure your plugin jar and xml files are in the directory indicated in these log file lines:</p>
<pre>
2009-04-17 10:54:23,617 INFO  plugin.PluginRepository - Plugins: looking in: /nutch-0.9/plugins
2009-04-17 10:54:24,062 INFO  plugin.PluginRepository - Plugin Auto-activation mode: [true]
2009-04-17 10:54:24,062 INFO  plugin.PluginRepository - Registered Plugins:
</pre>
<p>Finally, test to see whether your plugin actually added fields to the index. You can do this using <a href="http://www.getopt.org/luke/">Luke</a>. Download the yourcrawl/index directory from your crawl to your local machine and open it with Luke. Check that the name of your new field is listed in the fields list and that the field holds the expected values for your sample documents. If not, modify your source code, run ant in the <code>/nutch-dir/src/plugin</code> directory to rebuild the jar file and run your crawl again.</p>
<p><strong>Sorting by date from your query page</strong></p>
<p>You&#8217;re almost done! Now that your new field is in the index, you just need to modify your query page to sort by the new field. The default nutch query pages are <code>/apache-tomcat-6.0.14/webapps/ROOT/search.jsp</code> and <code>(language)/search.html</code> in that directory.</p>
<p>If you always want to sort by date, just find the line of code with <code>input name="query"</code> in it and add a parameter to sort by date after it. For example:</p>
<pre>
&lt;input name="query" size="44" />&nbsp;&lt;input type="submit" value="Search" />
&lt;input type="hidden" name="sort" value="published_date" /&gt;
</pre>
<p>Note that you may also want to add the following parameter to make Nutch put the most recent dates first.</p>
<pre>
&lt;input type="hidden" name="reverse" value="true" /&gt;
</pre>
<p>If you want to do something more sophisticated, like only sort by date in certain situations, you can modify the code in <code>search.jsp</code>. Look for the following line, and modify it as needed:</p>
<pre>
String sort = request.getParameter("sort");
</pre>
<p>For instance, I added a checkbox to my site that let users chose whether to sort by date or not. Since this checkbox returned a value only if it was checked, I wrote code that used the presence of that parameter to determine whether to assign a value to sort.</p>
<pre>
  if (request.getParameter("sort_by_date") != null){
    sort = "published_date";
    reverse = true;
  }
</pre>
<p>Good luck with your own Nutch sorting projects! Feel free to leave a comment or contact me if you have any questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2009/04/how-to-sort-by-date-with-nutch/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Closed List: Getting Things Done, with boundaries</title>
		<link>http://www.ryanpfister.com/2009/03/the-closed-list-getting-things-done-with-boundaries/</link>
		<comments>http://www.ryanpfister.com/2009/03/the-closed-list-getting-things-done-with-boundaries/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 05:39:56 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=69</guid>
		<description><![CDATA[Just finished reading Do It Tomorrow and Other Secrets of Time Management by Mark Forster. I&#8217;m a big fan of David Allen&#8217;s Getting Things Done system, so I&#8217;m a little skeptical about new time management approaches. However, this book&#8217;s ideas seem to complement the GTD system very well.
The basic idea of Do It Tomorrow is [...]]]></description>
			<content:encoded><![CDATA[<p>Just finished reading <a href="http://www.amazon.com/Tomorrow-Other-Secrets-Time-Management/dp/0340909129/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1238041871&#038;sr=8-1">Do It Tomorrow and Other Secrets of Time Management</a> by Mark Forster. I&#8217;m a big fan of David Allen&#8217;s <a href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1238042064&#038;sr=1-1">Getting Things Done</a> system, so I&#8217;m a little skeptical about new time management approaches. However, this book&#8217;s ideas seem to complement the GTD system very well.</p>
<p>The basic idea of <em>Do It Tomorrow</em> is that you have a defined task list to accomplish each day. It&#8217;s a &#8220;closed list&#8221; because you aren&#8217;t supposed to add new items to it unless they absolutely must be done that day (and even then, you&#8217;re supposed to put them on a separate list so you don&#8217;t lose sight of your original goals). Whenever possible, you&#8217;re supposed to put off any new work until &#8220;tomorrow.&#8221; The theory is that most time management problems come from the fact that we spend too much of our day doing unplanned things. Pushing new work off until a future time gives you a &#8220;buffer&#8221; that allows you to plan when to do it.</p>
<p>I think this approach solves one of the key problems I&#8217;ve been having with GTD. GTD is an excellent knowledge capture and task creation system, but I don&#8217;t think it fully addresses what (or how much) to do on a particular day. With the closed list, you have a defined list of goals for each day. It stops you from overworking, but it also stops you from slacking off.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2009/03/the-closed-list-getting-things-done-with-boundaries/feed/</wfw:commentRss>
		</item>
		<item>
		<title>FriendFlash &#8212; Recognize your Facebook friends on sight</title>
		<link>http://www.ryanpfister.com/2008/11/friendflash/</link>
		<comments>http://www.ryanpfister.com/2008/11/friendflash/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 01:01:32 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=59</guid>
		<description><![CDATA[I&#8217;ve completed my first Facebook application: FriendFlash. It displays a photo of one of your friends and you have to pick which one it is from a list of choices. I built it because I have a lot of random Facebook friends and sometimes I have trouble remembering what they all look like.
Check it out!
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve completed my first Facebook application: FriendFlash. It displays a photo of one of your friends and you have to pick which one it is from a list of choices. I built it because I have a lot of random Facebook friends and sometimes I have trouble remembering what they all look like.</p>
<p><a href="http://apps.facebook.com/friendflash/">Check it out</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/11/friendflash/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Speak and print your daily tasks and events</title>
		<link>http://www.ryanpfister.com/2008/11/speak-and-print-your-daily-tasks-and-events/</link>
		<comments>http://www.ryanpfister.com/2008/11/speak-and-print-your-daily-tasks-and-events/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 02:03:28 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=52</guid>
		<description><![CDATA[I keep track of my tasks using Remember The Milk and my calendar using Google Calendar. However, I don&#8217;t have a Blackberry or other phone with Internet access, so sometimes it&#8217;s nice of have a paper copy of what I have to do on a particular day.
I created a Ruby script that reads in my [...]]]></description>
			<content:encoded><![CDATA[<p>I keep track of my tasks using <a href="http://www.rememberthemilk.com">Remember The Milk</a> and my calendar using <a href="http://calendar.google.com">Google Calendar</a>. However, I don&#8217;t have a Blackberry or other phone with Internet access, so sometimes it&#8217;s nice of have a paper copy of what I have to do on a particular day.</p>
<p>I created a Ruby script that reads in my tasks from the RTM private feed and my events from the Google Calendar private ical feed. It then assembles a text file of everything happening that day and prints it out. For fun, I rigged it up with the Microsoft text-to-speech API, so you can have your agenda read to you too.</p>
<p>If you&#8217;re interested in using it, I&#8217;ve released a copy of the source code under the Apache 2.0 license. <a href="http://www.ryanpfister.com/wp-content/agenda_code.txt">Get it here</a>.</p>
<p>Note that you&#8217;ll need a copy of the <a href="http://icalendar.rubyforge.org/">Ruby iCalendar library</a> for this to work.</p>
<p>Here&#8217;s a sample of the <a href="http://www.ryanpfister.com/wp-content/agenda_sample.txt">printer output</a> and the <a href="http://www.ryanpfister.com/wp-content/agenda_demo.mp3">speech output</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/11/speak-and-print-your-daily-tasks-and-events/feed/</wfw:commentRss>
<enclosure url="http://www.ryanpfister.com/wp-content/agenda_demo.mp3" length="468950" type="audio/mpeg" />
		</item>
		<item>
		<title>Full Contact Search Code &#8212; Lessons in Google Authentication</title>
		<link>http://www.ryanpfister.com/2008/10/full-contact-search-code-lessons-in-google-authentication/</link>
		<comments>http://www.ryanpfister.com/2008/10/full-contact-search-code-lessons-in-google-authentication/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 16:43:07 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=45</guid>
		<description><![CDATA[Here&#8217;s the main code file for my Full Contact Search Application:
fullcontactsearch_code
I&#8217;m releasing it under the Apache license. Some of it is originally inspired from Google tutorials anyway. The portion of the code you may find useful is the self.GetAuthentication method. Basically, what you need to be able to do to permanently authenticate a user is:

Get [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s the main code file for my Full Contact Search Application:<br />
<a href='http://www.ryanpfister.com/wp-content/fullcontactsearch_code.txt'>fullcontactsearch_code</a></p>
<p>I&#8217;m releasing it under the Apache license. Some of it is originally inspired from Google tutorials anyway. The portion of the code you may find useful is the <code>self.GetAuthentication</code> method. Basically, what you need to be able to do to permanently authenticate a user is:</p>
<ol>
<li>Get the user to sign in to a Google account.</li>
<li>Get the user to approve your Web site for access to a url scope (in my case, the Google Contacts feed)</li>
<li>Upgrade the single use token that Google returns to a session token.</li>
<li>Store that token in a database (in Google App Engine&#8217;s case, just use the built-in datastore).</li>
</ol>
<p>Then, next time a user visits the Web site, just look up the session key from your database and you&#8217;re good to go.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/10/full-contact-search-code-lessons-in-google-authentication/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Full Contact Search: Search all the fields of your Gmail contacts</title>
		<link>http://www.ryanpfister.com/2008/10/full-contact-search-search-all-the-fields-of-your-gmail-contacts/</link>
		<comments>http://www.ryanpfister.com/2008/10/full-contact-search-search-all-the-fields-of-your-gmail-contacts/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 16:11:43 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=40</guid>
		<description><![CDATA[I&#8217;ve created a new Web site called Full Contact Search using Google App Engine that allows you to search all fields from your Gmail contacts, not just name and e-mail. Check it out at http://fullcontactsearch.appspot.com.
When Google upgraded to a new version of its contact manager, it bizarrely took away the ability to search fields like [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created a new Web site called <a href="http://fullcontactsearch.appspot.com">Full Contact Search</a> using Google App Engine that allows you to search all fields from your Gmail contacts, not just name and e-mail. Check it out at <a href="http://fullcontactsearch.appspot.com">http://fullcontactsearch.appspot.com</a>.</p>
<p>When Google upgraded to a new version of its contact manager, it bizarrely took away the ability to search fields like &#8220;notes&#8221; and &#8220;company.&#8221; For anyone who files people by company or puts contact &#8220;tags&#8221; in the notes field like I do, this was a major inconvenience. One work around to this problem is to open up the <a href="http://mail.google.com/mail/?ui=1">old version of Gmail</a> (just type ?ui=1 after the gmail url) and use that contact manager, but who knows how long that&#8217;s going to be around.</p>
<p>So, until Google comes out with the be-all, end-all of contact managers, this Web site should serve as a nice holdover.</p>
<p>UPDATE: I&#8217;ve <a href="http://www.ryanpfister.com/2008/10/full-contact-search-code-lessons-in-google-authentication/">posted the source code</a> with some notes. Based on my experience, I think some of Google App Engine&#8217;s <a href="http://code.google.com/appengine/docs/gettingstarted/">tutorials </a>need updating.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/10/full-contact-search-search-all-the-fields-of-your-gmail-contacts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Drop.io - very cool file sharing</title>
		<link>http://www.ryanpfister.com/2008/09/dropio-very-cool-file-sharing/</link>
		<comments>http://www.ryanpfister.com/2008/09/dropio-very-cool-file-sharing/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 01:55:46 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=37</guid>
		<description><![CDATA[If you ever have to share files on the Internet, check out Drop.io. It&#8217;s the simplest, quickest way I&#8217;ve seen to get a file uploaded and a link sent out. And check out the Firefox extension, which allows drag-and-drop uploads from your computer. Sounds like a prime Google takeover target to me&#8230;
I&#8217;m probably going to [...]]]></description>
			<content:encoded><![CDATA[<p>If you ever have to share files on the Internet, check out <a href="http://drop.io/">Drop.io</a>. It&#8217;s the simplest, quickest way I&#8217;ve seen to get a file uploaded and a link sent out. And check out the Firefox extension, which allows drag-and-drop uploads from your computer. Sounds like a prime Google takeover target to me&#8230;</p>
<p>I&#8217;m probably going to use this for group projects this semester.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/09/dropio-very-cool-file-sharing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Executor: My new application launcher</title>
		<link>http://www.ryanpfister.com/2008/09/executor-my-new-application-launcher/</link>
		<comments>http://www.ryanpfister.com/2008/09/executor-my-new-application-launcher/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 01:51:40 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=34</guid>
		<description><![CDATA[I read about executor on lifehacker the other day. It&#8217;s a utility that enables you to launch programs using keyboard commands, such as &#8220;excel&#8221; for Excel. In the past, I&#8217;ve used Mike Lin&#8217;s MCL to do this. I&#8217;ve experimented with other launchers like Launchy, but I&#8217;ve found they&#8217;re too bloated and index way too many [...]]]></description>
			<content:encoded><![CDATA[<p>I read about <a href="http://executor.dk/">executor</a> on <a href="http://lifehacker.com/400566/executor-is-impressive-full+featured-app-launcher">lifehacker</a> the other day. It&#8217;s a utility that enables you to launch programs using keyboard commands, such as &#8220;excel&#8221; for Excel. In the past, I&#8217;ve used Mike Lin&#8217;s <a href="http://www.mlin.net/MCL.shtml">MCL</a> to do this. I&#8217;ve experimented with other launchers like Launchy, but I&#8217;ve found they&#8217;re too bloated and index way too many things. I usually just want to create a keyword that launches a specific shortcut. It needs to be fast and lean.</p>
<p>My main issue with MCL was that it was annoying to create keywords. Executor fixes that problem: you can either add shortcuts to a folder it scans, drag and drop shortcuts into its dialog box, or right-click a shortcut and hit &#8220;Send To&#8230;Executor.&#8221; Very handy. Plus, it has some great built in keywords. For instance, typing in &#8220;ip&#8221; will make your IP address appear in the bar, ready to be copy and pasted.</p>
<p>In terms of memory, it takes up less than 10 MB. Not as small as MCL, but acceptable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/09/executor-my-new-application-launcher/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Shell commands to upgrade to WordPress 2.6.1</title>
		<link>http://www.ryanpfister.com/2008/08/shell-commands-to-upgrade-to-wp-261/</link>
		<comments>http://www.ryanpfister.com/2008/08/shell-commands-to-upgrade-to-wp-261/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 02:26:27 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=31</guid>
		<description><![CDATA[Just upgraded this blog to WordPress 2.6.1 via ssh. Went just fine (knock on wood). Here&#8217;s the commands I used, for my own reference as much as anyone else&#8217;s:

wget http://wordpress.org/latest.tar.gz
rm -rf wp-includes
rm -rf wp-admin
tar -xzvf latest.tar.gz
cp -rpf wordpress/* .
rm latest.tar.gz

Of course, you&#8217;ll want to replace &#8220;.&#8221; in the second-to-last line with the address of your [...]]]></description>
			<content:encoded><![CDATA[<p>Just upgraded this blog to WordPress 2.6.1 via ssh. Went just fine (knock on wood). Here&#8217;s the commands I used, for my own reference as much as anyone else&#8217;s:</p>
<p><code><br />
wget http://wordpress.org/latest.tar.gz<br />
rm -rf wp-includes<br />
rm -rf wp-admin<br />
tar -xzvf latest.tar.gz<br />
cp -rpf wordpress/* .<br />
rm latest.tar.gz<br />
</code></p>
<p>Of course, you&#8217;ll want to replace &#8220;.&#8221; in the second-to-last line with the address of your wordpress directory. In my case, I use the root directory.</p>
<p><strong>UPDATE:</strong> Another tip I thought of to make this process even more streamlined: paste all of the above commands into a text file and call it &#8220;wp-upgrade&#8221; or something like that. Then type in:<br />
<code>chmod 755 wp-upgrade</code><br />
That will make the file executable. From then on, all you have to do to upgrade WordPress is type <code>./wp-upgrade</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/08/shell-commands-to-upgrade-to-wp-261/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Adding a subject to a text message sent to an e-mail address</title>
		<link>http://www.ryanpfister.com/2008/08/adding-a-subject-to-a-text-message-sent-to-an-e-mail-address/</link>
		<comments>http://www.ryanpfister.com/2008/08/adding-a-subject-to-a-text-message-sent-to-an-e-mail-address/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 02:06:41 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=28</guid>
		<description><![CDATA[Here&#8217;s a tip for text messengers that I discovering when configuring Remember The Milk for my cell phone:
If you are sending a text message to an e-mail address and put words in parentheses at the start of your message, they will show up as the subject of the e-mail.
For example:
(this is the subject) this is [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a tip for text messengers that I discovering when configuring Remember The Milk for my cell phone:</p>
<p>If you are sending a text message to an e-mail address and put words in parentheses at the start of your message, they will show up as the subject of the e-mail.</p>
<p>For example:<br />
<code>(this is the subject) this is the body</code></p>
<p>I haven&#8217;t tested this on other phones, but it works on my old Samsung phone on the Verizon Wireless network. I spent quite a bit of time Googling this before I just tried sending an email to my cell phone with a subject and then copied the syntax of how it appeared.</p>
<p>This feature is especially handy when using <a href="http://www.rememberthemilk.com">Remember The Milk&#8217;</a>s &#8220;e-mail a task&#8221; feature. RTM gives you a unique e-mail address. Any e-mails sent to the address will be added to your task list. According to <a href="http://www.rememberthemilk.com/help/answers/sending/emailinbox.rtm">the documentation</a>, you&#8217;re supposed to put the task name as the subject and any other information (e.g. due date) in the body.</p>
<p>My problem was I wanted the tasks to show up as due today, rather than due anytime. So, using the text message subject syntax, I wrote:</p>
<p><code>(remember the milk) due: today</code></p>
<p>Another alternative is to use the twitter interface for RTM, but it stopped working for me recently.</p>
<p>A productivity tip: Store the RTM e-mail as &#8220;@Task&#8221; in your phone contact list. That way, you won&#8217;t have to scroll through your contacts list to get to it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/08/adding-a-subject-to-a-text-message-sent-to-an-e-mail-address/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
