<?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 &#187; Uncategorized</title>
	<atom:link href="http://www.ryanpfister.com/category/uncategorized/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>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>Ryan Pfisters: we&#8217;re not the only ones that share a name</title>
		<link>http://www.ryanpfister.com/2008/04/ryan-pfisters-were-not-the-only-ones-that-share-a-name/</link>
		<comments>http://www.ryanpfister.com/2008/04/ryan-pfisters-were-not-the-only-ones-that-share-a-name/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 01:39:52 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/blog/?p=10</guid>
		<description><![CDATA[Check out this New York Times article on people with the same name that keep track of each other on the Internet.
Obvious quote of the day:
&#8220;Why do so many feel a connection — be it kinship or competition — with utter strangers just because they share a name? Social science, it turns out, has an [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.nytimes.com/2008/04/10/us/10names.html">Check out this New York Times article</a> on people with the same name that keep track of each other on the Internet.</p>
<p>Obvious quote of the day:</p>
<p>&#8220;Why do so many feel a connection — be it kinship or competition — with utter strangers just because they share a name? Social science, it turns out, has an answer. It is because human beings are unconsciously drawn to people and things that remind us of ourselves.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/04/ryan-pfisters-were-not-the-only-ones-that-share-a-name/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Guide to making a personal Web site (with a Penn State focus)</title>
		<link>http://www.ryanpfister.com/2008/04/guide-to-making-a-personal-web-site-with-a-penn-state-focus/</link>
		<comments>http://www.ryanpfister.com/2008/04/guide-to-making-a-personal-web-site-with-a-penn-state-focus/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 01:37:40 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/blog/?p=9</guid>
		<description><![CDATA[If you&#8217;re a Penn State student (or anyone else) who wants a spot on the Internet, here&#8217;s my getting starting guide based on my own experiences.
Topics covered:

Hosting your site (where to save your files)
Creating and updating files
To dot.com or not to dot.com (or .org, or .net)

Hosting your site
For people to be able to view your [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re a Penn State student (or anyone else) who wants a spot on the Internet, here&#8217;s my getting starting guide based on my own experiences.</p>
<p>Topics covered:</p>
<ul>
<li>Hosting your site (where to save your files)</li>
<li>Creating and updating files</li>
<li>To dot.com or not to dot.com (or .org, or .net)</li>
</ul>
<h2><strong>Hosting your site</strong></h2>
<p>For people to be able to view your site on the Internet, you need to put your files on a Web server. If you&#8217;re at Penn State, the university provides some free space for you to use. If you&#8217;re not (or you&#8217;ll be graduating soon &#8212; your PSU space ends 6 months after graduation), I recommend some free and cheap alternatives at the bottom of this section.</p>
<p><strong>At Penn State</strong></p>
<p>1. First you have to apply for Web space at <a href="https://www.work.psu.edu/webspace/">https://www.work.psu.edu/webspace/</a> The quiz questions are pretty obvious. It takes a few days to set up.</p>
<p>2. Now you need to open the folder Penn State created for you to store your files. On Windows, Open My Network Places from your desktop. Double-click &#8220;Add Network Place.&#8221; Type in: \\win.pass.psu.edu\xyz123 (replace xyz123 with your user id). Hit next and type in your username and password.</p>
<p>* NOTE: If you&#8217;re off-campus, you probably won&#8217;t be able to access your files directly like this. Instead, you&#8217;ll have to use SSH to upload your files (see below).</p>
<p>3. Your Penn State file space (Penn State calls it the &#8220;PASS space&#8221;) will show up. Open the www folder. This is where you will store all your Web site files.</p>
<p>Now you&#8217;re ready to go. Jump down to the section on creating and updating files. They will appear at http://www.personal.psu.edu/xyz123 (again, replacing xyz123 with your user name).</p>
<p><strong>Not at Penn State</strong></p>
<p>If you&#8217;re not at Penn State, you&#8217;ll need to find a place to host your files. Free Web hosts abound, but the only one I&#8217;ve used is <a href="http://geocities.yahoo.com/">Yahoo! Geocities</a>. It puts an annoying ad on your page, but the service has been around for a while so it&#8217;s probably pretty stable. You&#8217;ll also have to manually upload your files using their Web interface.</p>
<p>As an alternative to free Web hosts, I recommend &#8220;pay as you go&#8221; Web hosting from <a href="https://www.nearlyfreespeech.net/">NearlyFreeSpeech.NET</a>. You make an initial deposit and then they just draw against it. Fees are about $1 a gigabyte of transfer, so even five dollars could last you for years. I use this service for this Web site and I&#8217;ve had a great experience. The one downside is they have no Web-based tools for uploading files, so you&#8217;ll have to learn to use SSH.</p>
<p><strong>Using SSH</strong></p>
<p>If you can&#8217;t access your Web space using the &#8220;My Network Places&#8221; method above, you&#8217;ll have to use SSH to upload your files to your server.  I recommend <a href="http://winscp.net/eng/download.php">WinSCP</a> for Windows users. Download the standalone application.</p>
<p>To get files on your Web space, open the program and type in the server (ftp.personal.psu.edu for Penn State) and your user name and password. Click connect, accept the encryption key and your files should show up. Then just drag files from your hard drive to the Web server directory. If you need to make changes to files, just re-upload them and overwrite the old files.</p>
<p>Note that unlike with the &#8220;My Network Places&#8221; method, you won&#8217;t be able to edit your files directly on the server. Instead, you&#8217;ll have to edit them on your hard drive and then upload them.</p>
<h2><strong>Creating and updating files</strong></h2>
<p><a href="http://www.ryanpfister.com/portfoliotemplate.zip">Download my basic template</a> to get started. You can use your own files if you want, but I&#8217;m going to reference the template specifically.</p>
<ul>
<li>index.html is the main file.</li>
<li>works.html is where the list of stories is.</li>
<li>site.css is the stylesheet that controls how the pages look.</li>
<li>the png file is the mug shot that appears on the right side of the page.</li>
</ul>
<p>Just edit these files and drag them to your Web space. Also upload any other files you referenced. I recommend using a text editor to edit your files, but if you use a graphical editor, make sure your links are relative (e.g. don&#8217;t start with file://). Otherwise they won&#8217;t work on the Web site.</p>
<p>For an introduction to HTML and CSS editing, check out <a href="http://htmldog.com/">HTML Dog</a>. I&#8217;ll write a more specific tutorial later if I get around to it.</p>
<h2><strong><strong>To dot.com or not to dot.com<br />
</strong></strong></h2>
<p>Domains are cool. The address looks impressive on your resumé, you get every address @yourname.com and your url is a lot easier to remember.</p>
<p>You get a domain by registering it with a company called a registrar. My current favorite is <a href="http://1and1.com">1&amp;1</a> (which is also a hosting company). I like it because it&#8217;s reliable and its prices are on the cheaper end. Dot.com domains are $7/year; less common suffixes like .mobi are sometimes less. The company will keep your credit/debit card and charge you each year. Another perk of 1&amp;1 is that they offer private registration, so you don&#8217;t have to reveal your contact information on domain name registry listings.</p>
<p>Once you&#8217;ve registered your domain, you have two options. The first is to forward your domain to the url where your files are hosted. If you take this route, you have two options: masked forward or redirect. Under the first option, your domain stays in the address bar but the file inside come from your Web host. Under the second option, the real URL of your Web site appears in the address bar.</p>
<p>If you care about your domain staying in the address bar, pick the first option. Just keep in mind that urls of pages won&#8217;t show up in the address bar. So if someone likes your &#8220;works&#8221; page and they copy and paste the url, it will be the one for your main page, not the works page specifically. Of course if you have a Web site with just a few pages it&#8217;s probably not a big issue.</p>
<p>The second route for forwarding your domain is to use DNS. This works with paid Web hosts like NearlyFreeSpeech.NET. This method will keep your domain url in the address bar and let you type in specific urls. It takes a little doing to set up (maybe I&#8217;ll write up a tutorial later) but basically you need to have 1&amp;1 forward your name servers or DNS to your Web host.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/04/guide-to-making-a-personal-web-site-with-a-penn-state-focus/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

