<?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>Sun, 29 Jan 2012 17:01:07 +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>The Hobo Box: Adventures in Refrigeration-Free Microwave Cooking</title>
		<link>http://www.ryanpfister.com/2012/01/the-hobo-box-adventures-in-refrigeration-free-microwave-cooking/</link>
		<comments>http://www.ryanpfister.com/2012/01/the-hobo-box-adventures-in-refrigeration-free-microwave-cooking/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 16:34:26 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/?p=100</guid>
		<description><![CDATA[During the past two years, I spent a lot of time on the road and lived in many different places. I often didn&#8217;t have access to a stove, refrigerator or freezer. Not wanting to eat out all the time, I started researching food that would keep indefinitely and that could be eaten either without cooking [...]]]></description>
			<content:encoded><![CDATA[<p>During the past two years, I spent a lot of time on the road and lived in many different places. I often didn&#8217;t have access to a stove, refrigerator or freezer. Not wanting to eat out all the time, I started researching food that would keep indefinitely and that could be eaten either without cooking or using only a microwave.</p>
<p>The result of this research is the hobo box.<br />
<span id="more-100"></span></p>
<p><strong>What is a hobo box?</strong></p>
<p>A hobo box is a collection of food items and cooking tools that you can use to prepare meals wherever you are. All the items last six months or more without refrigeration, and all can be eaten either cold or with only a microwave.</p>
<p>Originally, my thought was to have one authoritative hobo box with a fixed complement of items, but I&#8217;ve since come to believe that customization is important &#8212; as in , &#8220;What&#8217;s in <em>your</em> hobo box?&#8221;. Therefore, I have provided a number of different options below. Select the ones you like best.</p>
<p><strong>When might you want to use a hobo box?</strong></p>
<ul>
<li>If you&#8217;re gone from your home for long periods and want to be able to eat when you get home without having to go to the grocery store first.</li>
<li>If you refrigerator and/or freezer are often full (especially common if you have roommates) and you need to be able to store ingredients without refrigeration.</li>
<li>If you travel in your car frequently and want an emergency meal without having to go to a restaurant.</li>
<li>If you spontaneously go to visit a friend that doesn&#8217;t want to eat out but doesn&#8217;t have food in the kitchen. (Just grab a meal from the car.)</li>
<li>If you want an emergency meal at work because you forgot your lunch or you&#8217;re working late. Just store a few meals in your desk. Even if your office has a refrigerator, it might be cleaned regularly and is therefore not a good option for storing emergency food that you might not eat for weeks.</li>
</ul>
<p><strong>What&#8217;s in a hobo box?</strong></p>
<p><strong>Tools:</strong><br />
Silverware: You can use regular or plastic silverware if you want. However, I recommend either a titanium spork or a swiss army-style collapsible fork, knife, spoon and can opener.</p>
<p>Here&#8217;s a good spork that I own:<br />
<iframe src="http://rcm.amazon.com/e/cm?t=ryanpfis-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=B000AR2N76&#038;ref=tf_til&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>Here&#8217;s a good swiss army silverware set that I own:<br />
<iframe src="http://rcm.amazon.com/e/cm?t=ryanpfis-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=B000XFHJW4&#038;ref=tf_til&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>Can opener: Not mandatory, but much, much easier to open cans with than the tiny knife one that comes with the hobo fork, knife and spoon, above.</p>
<p>I just purchased a can opener at the store, but this one is highly rated online:</p>
<p><iframe src="http://rcm.amazon.com/e/cm?t=ryanpfis-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=B00004OCMM&#038;ref=tf_til&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p>Containers: Use them to prepare, heat up and store your meals. I recommend plastic containers as they are microwave safe but also light and durable. It&#8217;s nice to have a large one for preparing meals and a smaller one for leftovers.</p>
<p>Here&#8217;s a large container I&#8217;ve used that works well:<br />
<iframe src="http://rcm.amazon.com/e/cm?t=ryanpfis-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=B000WEMFOS&#038;ref=tf_til&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<p><strong>Meals:</strong><br />
* = optional item that requires refrigeration</p>
<p><em>1. Tuna Roma</em><br />
2 cans tuna<br />
Ziti pasta<br />
can of mushrooms<br />
Jar of mushroom spaghetti sauce (see if can find in a can instead of glass)<br />
Parsley<br />
* Mozzarella Cheese<br />
	** technically you don’t have to refrigerate Parmesan cheese, so you could use it in the winter</p>
<p>Optionally add on a can of vegetables as a side dish.</p>
<p>Cook pasta, then add it, tuna and sauce (and half the cheese if you have it) in a bowl and cook in microwave for four minutes. (Add the remaining cheese if you have it). Let stand for a few minutes, then serve.</p>
<p><em>2. Tuna Noodle Casserole</em><br />
2 cans tuna<br />
1 can of mixed veggies<br />
1 can of mushroom soup<br />
1 can of sliced mushrooms<br />
Bread crumbs<br />
* milk (could use dehydrated milk and water if desired)</p>
<p>Mix all ingredients except for breadcrumbs in dish, then top with the bread crumbs. Cook in casserole dish for 12 minutes. Optionally, stir halfway through the cooking. Let stand for 5 minutes before serving.</p>
<p><em>3. Spanish rice and canned chicken</em><br />
1 can cashews<br />
1 can tomatoes<br />
1 can peas<br />
1 can chicken<br />
1 box Spanish rice</p>
<p>Mix Spanish rice, tomatoes, peas and chicken. Microwave for 10-15 minutes. Top with cashews.</p>
<p><em>4. Bean Chili</em><br />
2 cans of tomato sauce<br />
1 can of kidney beans<br />
1 envelope chili seasoning mix<br />
* Chicken, corn and/or sliced tomatoes<br />
* 1/2 pound ground beef</p>
<p>(Heat meat if you have it, with seasoning mix). Combine seasoning mix, tomato sauce and kidney beans. Heat for 6-8 minutes.</p>
<p><em>5. Creamed chicken</em><br />
Bowtie pasta<br />
Cream of mushroom soup<br />
Sliced mushrooms<br />
Canned asparagus<br />
Olive oil<br />
* Sour cream<br />
* Chopped onion</p>
<p>Heat pasta into water for 10 minutes, then remove. Heat Chicken in olive oil (with onions, if you have them) for 1 minute. Add soup and mushrooms; heat for 10 minutes. Serve over noodles.</p>
<p><strong>Soup cans</strong><br />
Soup cans are great if you need a very quick meal. They can even be eaten cold if you don&#8217;t have a microwave.</p>
<p>The one issue with soup cans is that many of them contain large amounts of sodium. Store brands tend to be especially bad here. Therefore, I recommend sticking with the &#8220;healthy&#8221; versions of brand name soups &#8212; Campbell&#8217;s Select Harvest, for example. Prices can vary widely depending on if there&#8217;s a sale going on, so watch them and stock up when they&#8217;re cheap (ideally, $1.50/can or less).</p>
<p><strong>Chef Boyardee canned pastas</strong> (e.g. Beefaroni) are also good in an emergency, but they&#8217;re also very salty.</p>
<p><strong>Breakfast/snacks</strong></p>
<ul>
<li>Granola bars</li>
<li>Protein bars (I like Cliff Builder bars)</li>
<li>Raisins</li>
<li>Carrots</li>
<li>Dehydrated milk</li>
<li>Nuts</li>
</ul>
<p><strong>Other questions:</strong></p>
<p><strong>Are hobo box meals healthy?</strong><br />
Not particularly. You shouldn&#8217;t subsist on an exclusively hobobox diet. However, a hobo box meal is healthier than just eating chips or some types of fast food - which is what you might have eaten if you didn&#8217;t have a hobo box meal. You can also make hobo box meals healthier by purchasing low sodium versions of ingredients.</p>
<p><strong>Hobo box alternatives</strong></p>
<p>If you have access to a freezer, you can purchase and freeze meat and vegetables, which often taste better than their canned counterparts and last just as long. Of course, frozen items are not portable like canned goods are.</p>
<p><strong>Credits</strong><br />
Some of these recipes are inspired by (but not identical to) the ones in <a href="http://www.amazon.com/gp/product/B000RK718W/ref=as_li_tf_tl?ie=UTF8&#038;tag=ryanpfis-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B000RK718W">A Man, a Can, a Plan: 50 Great Guy Meals Even You Can Make</a><img src="http://www.assoc-amazon.com/e/ir?t=ryanpfis-20&#038;l=as2&#038;o=1&#038;a=B000RK718W" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2012/01/the-hobo-box-adventures-in-refrigeration-free-microwave-cooking/feed/</wfw:commentRss>
		</item>
		<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[Featured]]></category>

		<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>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><strong>Update</strong>: 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>
<p><strong>Second Update</strong>: Google&#8217;s <a href="http://gmailblog.blogspot.com/2010/08/updates-to-contacts-and-slightly-new.html">updated contact manager</a> has restored the ability to search all fields, making my Full Contact Search application obsolete for most practical purposes. Therefore, I haven&#8217;t been maintaining it. However, if you want to play around with it and have trouble, feel free to leave a comment and I&#8217;ll see what I can do to help. </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[Update, January 2012: drop.io has been shut down. I recommend using ge.tt instead.
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. [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update, January 2012:</strong> drop.io has been shut down. I recommend using <a href="http://ge.tt">ge.tt</a> instead.</em></p>
<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>

