<?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>Wed, 01 Sep 2010 02:11:18 +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>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[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>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>
		<item>
		<title>Goodbye, Netherlands Antilles</title>
		<link>http://www.ryanpfister.com/2008/03/goodbye-netherlands-antilles/</link>
		<comments>http://www.ryanpfister.com/2008/03/goodbye-netherlands-antilles/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 16:51:22 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryanpfister.com/blog/?p=8</guid>
		<description><![CDATA[Great. Just when I get the excellent idea from ma.tt to register ry.an, I find out that the Netherlands Antilles is scheduled to be abolished so the country code might disappear. Oh well&#8230;I guess I can&#8217;t expect geopolitics to cooperate with my naming ambitions all the time.
UPDATE: Looks like pfist.er is out as well.
]]></description>
			<content:encoded><![CDATA[<p>Great. Just when I get the excellent idea from ma.tt to register ry.an, I find out that the Netherlands Antilles is <a title="According to Wikipedia" href="http://en.wikipedia.org/wiki/.an">scheduled to be abolished</a> so the country code might disappear. Oh well&#8230;I guess I can&#8217;t expect geopolitics to cooperate with my naming ambitions all the time.</p>
<p>UPDATE: Looks like <a href="http://www.webhostingtalk.com/showthread.php?t=455614">pfist.er</a> is out as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryanpfister.com/2008/03/goodbye-netherlands-antilles/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
