<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">]>
<rss version="2.0" xml:base="http://kitt.hodsden.com">
<channel>
 <title>tags of a similar ilk - </title>
 <link>http://kitt.hodsden.com</link>
 <description></description>
 <language>en</language>
<item>
 <title>Module to extract tags from a posted node</title>
 <link>http://kitt.hodsden.com/drupal/extract_tags_module</link>
 <description>&lt;p&gt;A post from the Drupal support list requested:&lt;/p&gt;
&lt;p&gt;Does anybody know of an existing module which will extract tags from&lt;br /&gt;
the body of a post (i.e. a line like &quot;Tags: tag1 tag2 tag3&quot;) and pass&lt;br /&gt;
them to the taxonomy system to tag that node?&lt;/p&gt;
&lt;p&gt;I&#039;ve had a skim through the Taxonomy related module list on drupal.org&lt;br /&gt;
and didn&#039;t spot anything...&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
Dan&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hodsden.org/s/blog/2007/07/took_me_long_enough&quot;&gt;Took me longer than I wanted&lt;/a&gt; it to take, but at least it&#039;s of the minimum quality I find acceptable.&lt;/p&gt;
&lt;p&gt;Dan, this one&#039;s for you.  &lt;a href=&quot;/tagextract.tar.gz&quot;&gt;Download&lt;/a&gt;, works for &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; 5.x&lt;/p&gt;
</description>
 <pubDate>Thu, 19 Jul 2007 17:40:51 -0700</pubDate>
</item>
<item>
 <title>Installing SVN on a MacOSX box</title>
 <link>http://kitt.hodsden.com/svn/installing-svn-on-a-macosx-box</link>
 <description>&lt;p&gt;Open Safari on the destination box.  You want to use Safari because of the integration with the MacOSX allowing easier installation.&lt;/p&gt;
&lt;p&gt;Navigate to &lt;a href=&quot;http://metissian.com/projects/macosx/subversion/&quot;&gt;http://metissian.com/projects/macosx/subversion/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Select the binary you want.  When in doubt, select the newest one.  If you have an older Mac, look for the PowerPC compatible Universal binaries. &lt;/p&gt;
&lt;p&gt;The DMG will begin downloading.  When completed, you may receive a warning message that your downloaded file contains an executable program.  This is what you want, so continue.&lt;/p&gt;
&lt;p&gt;Selecting the continue will begin the binary (program) installation.  If the installation doesn&#039;t automatically continue, and only the DMG opens, double click on the SubversionClient icon (an open box) to continue the SVN installation.&lt;/p&gt;
&lt;p&gt;This installation will make the svn commands available on the command line, which means you&#039;ll need to use the Terminal application (or X11 + xterm, as I prefer) to access the svn commands.  Using the Terminal application will open a shell (bash, csh, tcsh, depending on your configuration), which accepts command line input commands.  In order for this to be effective, however, your shell needs to know where the svn commands are.  And for this, you may need to adjust the PATH variable.&lt;/p&gt;
</description>
 <pubDate>Fri, 18 May 2007 11:57:40 -0700</pubDate>
</item>
<item>
 <title>Yo!  Gallery people!</title>
 <link>http://kitt.hodsden.com/node/14</link>
 <description>&lt;p&gt;Hi!&lt;br /&gt;
&lt;p /&gt;
You&#039;re probably looking for the details of the whole Gallery PostNuke to Drupal conversion (including some of the pain Bharat went through with it).  I&#039;ll get that written up in the next day or two.  If you&#039;re a PostNuke person looking to transistion to &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt;, well, yeah, I&#039;ll get those details up, too.&lt;br /&gt;
&lt;p /&gt;
You can &lt;a href=&quot;contact&quot;&gt;contact&lt;/a&gt; me in the mean time, if you have specific Drupal/PostNuke/Gallery questions that I can answer.&lt;/p&gt;
</description>
 <pubDate>Thu, 08 Sep 2005 09:47:27 -0700</pubDate>
</item>
<item>
 <title>Ignoring files in subversion repositories</title>
 <link>http://kitt.hodsden.com/svn/ignoring_files_in_subversion_repositories</link>
 <description>&lt;p&gt;With &lt;a href=&quot;http://www.gnu.org/software/cvs/&quot; target=&quot;_blank&quot;&gt;CVS&lt;/a&gt;, ignoring files in a local checkout is easy.  You add the file name to the &lt;code&gt;.cvsignore&lt;/code&gt; file in the directory the file is located in.  When a &lt;code&gt;cvs&lt;/code&gt; command was issued in that directory, the files listed in the &lt;code&gt;.cvsignore&lt;/code&gt; would be, well, ignored.&lt;br /&gt;
&lt;p /&gt;
&lt;pre&gt;
% cat .cvsignore
config.inc.local
.cvsignore
&lt;/pre&gt;&lt;p /&gt;
Note that &lt;code&gt;.cvsignore&lt;/code&gt; is listed in the &lt;code&gt;.cvsignore&lt;/code&gt; file as well.  Otherwise, the file would list each time a &lt;code&gt;cvs update&lt;/code&gt; was made:&lt;/p&gt;
&lt;pre&gt;
% cvs up
? .cvsignore
U config.inc
&lt;/pre&gt;&lt;p /&gt;
So, ignoring files is pretty easy with CVS, right?&lt;br /&gt;
&lt;p /&gt;
What happens when everyone who has a local checkout wants to ignore the same files (a common scenario when development processes create temporary, intermediate files)?&lt;br /&gt;
&lt;p /&gt;
Right, each developer needs to create his own &lt;code&gt;.cvsignore&lt;/code&gt; file in each local checkout.&lt;br /&gt;
&lt;p /&gt;
&lt;a href=&quot;http://subversion.tigris.org/&quot; target=&quot;_blank&quot;&gt;Subversion&lt;/a&gt; handles the process of ignoring files in a local checkout differently.&lt;br /&gt;
&lt;p /&gt;
Instead of creating a local ignore file, you can set an &quot;ignore property&quot; in a directory for a specific file or subdirectory.  This property is set in the repository and is applied to all local checkouts.  With this strategy, all checkouts will behave the same way (i.e. all local checkouts on the same revision will ignore the same files and subdirectories).&lt;br /&gt;
&lt;!--pagebreak--&gt;&lt;br /&gt;
&lt;p /&gt;
This is goodness.  So how are these set?&lt;br /&gt;
&lt;p /&gt;
&lt;pre&gt;
svn propset svn:ignore &lt;i&gt;file&lt;/i&gt; &lt;i&gt;directory&lt;/i&gt;
&lt;/pre&gt;&lt;p&gt;Here, we are setting the property svn:ignore on the file &lt;i&gt;file&lt;/i&gt; in the directory &lt;i&gt;directory&lt;/i&gt;.   The file can actually be another directory:&lt;/p&gt;
&lt;pre&gt;
svn propset svn:ignore &lt;i&gt;subdirectory&lt;/i&gt; &lt;i&gt;directory&lt;/i&gt;
&lt;/pre&gt;&lt;p&gt;So, let&#039;s say you have a logs subdirectory in the current directory that you want to ignore:&lt;/p&gt;
&lt;pre&gt;
% svn status
?      logs
&lt;/pre&gt;&lt;p&gt;Your ignore command would be:&lt;/p&gt;
&lt;pre&gt;
% svn propset svn:ignore logs .
property &#039;svn:ignore&#039; set on &#039;.&#039;
&lt;/pre&gt;&lt;p&gt;Now, when you first set this value, you&#039;ve modified the directory information in the local checkout.  You&#039;ll need to commit this structure change back into the repository for the changes to be seen in other checkouts:&lt;/p&gt;
&lt;pre&gt;
% svn st
 M     .
% svn ci -m &quot;Ignore the logs subdirectory.&quot; .
Sending        .

Committed revision 12207.
&lt;/pre&gt;&lt;p&gt;&lt;!--pagebreak--&gt;&lt;br /&gt;
As mentioned above, you can also ignore files in and subdirectories of directories beneath the current directory:&lt;/p&gt;
&lt;pre&gt;
% svn st
?      devt/logs
% svn setprop svn:ignore logs devt
property &#039;svn:ignore&#039; set on &#039;devt&#039;
% svn st
 M     devt
% svn ci -m &quot;Ignore the logs subdirectory&quot; devt
Sending        inc

Committed revision 12208.
&lt;/pre&gt;&lt;p&gt;Now when you do a status listing on the local checkout, your ignore files will be properly ignored:&lt;/p&gt;
&lt;pre&gt;
% svn st
%
&lt;/pre&gt;&lt;br /&gt;
</description>
 <pubDate>Fri, 10 Jun 2005 18:03:13 -0700</pubDate>
</item>
<item>
 <title>Converting to MySQL TIMESTAMPs from int(11)</title>
 <link>http://kitt.hodsden.com/converting_to_mysqls_timestamp_from_int11</link>
 <description>&lt;p&gt;Having &lt;a href=&quot;converting_mysql_timestamps_to_int11_dates_in_drupal&quot;&gt;converted  MySQL TIMESTAMPs to Drupal&#039;s int(11)&lt;/a&gt; style timestamps, which records the number of seconds since  epoch (midnight, January 1st 1970), I also had cause to convert the other direction: from an int(11) to a MySQL TIMESTAMP.&lt;br /&gt;
&lt;p /&gt;
MySQL provides a utility function to convert from unix timestamps (the int(11) format): &lt;code&gt;FROM_UNIXTIME&lt;/code&gt;.&lt;br /&gt;
&lt;p /&gt;
From the &lt;a href=&quot;http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html&quot; target=&quot;_blank&quot;&gt;MySQL&lt;/a&gt; documentation:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code class=&quot;literal&quot;&gt;FROM_UNIXTIME(&lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;unix_timestamp&lt;/code&gt;&lt;/em&gt;)&lt;/code&gt;&lt;br /&gt;
      , &lt;code class=&quot;literal&quot;&gt;FROM_UNIXTIME(&lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;unix_timestamp&lt;/code&gt;&lt;/em&gt;,&lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/em&gt;)&lt;/code&gt;
    &lt;/p&gt;
&lt;p&gt;
      Returns a representation of the &lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;unix_timestamp&lt;/code&gt;&lt;/em&gt; argument as a value in&lt;br /&gt;
      &lt;code class=&quot;literal&quot;&gt;&#039;YYYY-MM-DD HH:MM:SS&#039;&lt;/code&gt; or &lt;code class=&quot;literal&quot;&gt;YYYYMMDDHHMMSS&lt;/code&gt; format, depending on&lt;br /&gt;
      whether the function is used in a string or numeric context.
    &lt;/p&gt;
&lt;/p&gt;
&lt;pre class=&quot;programlisting&quot;&gt;mysql&amp;gt; SELECT FROM_UNIXTIME(875996580);
        -&amp;gt; &#039;1997-10-04 22:23:00&#039;
mysql&amp;gt; SELECT FROM_UNIXTIME(875996580) + 0;
        -&amp;gt; 19971004222300
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;
      If &lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/em&gt; is given, the result is formatted according to the&lt;br /&gt;
      &lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/em&gt; string. &lt;em class=&quot;replaceable&quot;&gt;&lt;code&gt;format&lt;/code&gt;&lt;/em&gt; may contain the same specifiers as&lt;br /&gt;
      those listed in the entry for the &lt;code class=&quot;literal&quot;&gt;DATE_FORMAT()&lt;/code&gt; function.
          &lt;/p&gt;
&lt;pre class=&quot;programlisting&quot;&gt;mysql&amp;gt; SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
    -&amp;gt;                      &#039;%Y %D %M %h:%i:%s %x&#039;);
        -&amp;gt; &#039;2003 6th August 06:22:58 2003&#039;
&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p /&gt;
Okay, so &lt;code&gt;FROM_UNIXTIME&lt;/code&gt; can format the time/date in pretty much any way you&#039;d like it, with the optional format argument.&lt;br /&gt;
&lt;p /&gt;
Since we want the &lt;code&gt;TIMESTAMP&lt;/code&gt; format, force MySQL to treat the date as an integer by adding 0 to it:&lt;/p&gt;
&lt;pre&gt;
mysql&amp;gt; SELECT FROM_UNIXTIME(creation_date) + 0 FROM paid_support LIMIT 1;
+----------------------------------+
| FROM_UNIXTIME(creation_date) + 0 |
+----------------------------------+
|                   20031102084514 |
+----------------------------------+
1 row in set (0.00 sec)
&lt;/pre&gt;&lt;br /&gt;
</description>
 <pubDate>Sun, 22 May 2005 10:22:04 -0700</pubDate>
</item>
<item>
 <title>Converting MySQL TIMESTAMPs to int(11) dates in Drupal</title>
 <link>http://kitt.hodsden.com/converting_mysql_timestamps_to_int11_dates_in_drupal</link>
 <description>&lt;p&gt;A record&#039;s creation date or last modified date is often useful information to have.  Drupal uses &lt;code&gt;int(11)&lt;/code&gt; to store created time for nodes.  When importing from PostNuke or other content management systems, where MySQL TIMESTAMPs are used, you can use MySQL&#039;s UNIX_TIMESTAMP function to convert from TIMESTAMP to int(11):&lt;/p&gt;
&lt;pre&gt;
$query = &#039;SELECT pid, name, UNIX_TIMESTAMP(created_on) 
          FROM {exampletable} WHERE pid = %d&#039;;

$headers = array(&#039;ID&#039;, &#039;Name&#039;, &#039;Date&#039;);

$results = db_query($query, $pid);
if (isset($results) &amp;&amp; db_num_rows($results) &gt; 0) {
  while($t = db_fetch_array($results)) {
    $rows[] = array($t[&#039;pid&#039;],
                 $t[&#039;name&#039;],
                 format_date($t[&#039;unix_timestamp(creation_date)&#039;], &#039;small&#039;));
  }
}

$output .= theme(&#039;table&#039;, $headers, $rows);
&lt;/pre&gt;&lt;p&gt;
Use Drupal&#039;s &lt;a href=&quot;http://drupaldocs.org/api/head/function/format_date&quot; target=&quot;_blank&quot;&gt;format_date&lt;/a&gt; to format the date in the user&#039;s preferred format.&lt;/p&gt;
</description>
 <pubDate>Tue, 17 May 2005 20:28:44 -0700</pubDate>
</item>
<item>
 <title>Generating links that open in new pages with Drupal</title>
 <link>http://kitt.hodsden.com/drupal/generating_links_that_open_in_new_pages_with_drupal</link>
 <description>&lt;p&gt;Creating links that open pages in a new window is very easy with &lt;a href=&quot;http://drupal.org/&quot; target=&quot;_blank&quot;&gt;drupal&lt;/a&gt;&lt;br /&gt;
&lt;p /&gt;
To generate a link with drupal, use the method &lt;code&gt;&lt;a href=&quot;http://drupaldocs.org/api/head/function/l&quot; target=&quot;_blank&quot;&gt;l&lt;/a&gt;&lt;/code&gt; (that&#039;s a lowercase L):&lt;/p&gt;
&lt;pre&gt;
$output .= l(&#039;Link text&#039;, &#039;desired/path/for/link&#039;);
&lt;/pre&gt;&lt;p /&gt;
Optional values include an attributes array:&lt;/p&gt;
&lt;pre&gt;
l($text, $path, $attributes = array());
&lt;/pre&gt;&lt;p /&gt;
You can include a target value in this attributes array.  In HTML, the target is the name of the window.  If you use &lt;code&gt;_blank&lt;/code&gt;, a new window will open:&lt;/p&gt;
&lt;pre&gt;
$output .= l(&#039;Text link&#039;, &#039;my/path&#039;, array(&#039;target&#039; =&gt; &#039;_blank&#039;));
&lt;/pre&gt;&lt;p&gt;This will produce the HTML:&lt;br /&gt;
&amp;lt;a href=&quot;my/path&quot; target=&quot;_blank&quot;&amp;gt;Text link&amp;lt;/a&amp;gt;&lt;/p&gt;
</description>
 <pubDate>Wed, 11 May 2005 22:00:56 -0700</pubDate>
</item>
<item>
 <title>Checking if a user is in a role</title>
 <link>http://kitt.hodsden.com/drupal/checking_if_a_user_is_in_a_role</link>
 <description>&lt;p&gt;For custom modules and well-defined roles, we sometimes want to check to see if a user is in the a particular role.&lt;br /&gt;
&lt;p /&gt;
The easiest way to do so is to check the user&#039;s roles array:&lt;/p&gt;
&lt;pre&gt;
global $user;

if (!empty($user-&gt;uid)) {
  if (in_array(&#039;desiredRole&#039;, $user-&gt;roles)) {
    // user is in role, perform desired actions here 
  }
}
&lt;/pre&gt;&lt;p&gt;
The $user object is in the global name space, so using the &lt;code&gt;global&lt;/code&gt; declaration in a function is necessary.&lt;br /&gt;
&lt;p /&gt;
If the user isn&#039;t logged in, the &lt;code&gt;$user-&gt;uid&lt;/code&gt; value will be 0.  &lt;code&gt;empty&lt;/code&gt; returns true for 0/null/empty values, as explained on &lt;a href=&quot;http://php.net/empty&quot; target=&quot;_blank&quot;&gt;php.net&lt;/a&gt;.  &lt;code&gt;in_array&lt;/code&gt; checks the &lt;code&gt;desiredRole&lt;/code&gt; is in the user&#039;s roles.&lt;/p&gt;
</description>
 <pubDate>Wed, 11 May 2005 21:52:31 -0700</pubDate>
</item>
<item>
 <title>Displaying content from one node in another</title>
 <link>http://kitt.hodsden.com/drupal/displaying_content_from_one_node_in_another</link>
 <description>&lt;p&gt;When writing custom &lt;a href=&quot;http://drupal.org/&quot; target=&quot;_blank&quot;&gt;drupal&lt;/a&gt; modules, I often want to include a blurb on the page about how to do a particular task on the page.&lt;br /&gt;
&lt;p /&gt;
However, the phrases I use may not be the phrases or explanations another person would easily understand, given that I&#039;m too close to the code.&lt;br /&gt;
&lt;p /&gt;
The content of the blurb may change, too, as requirements change for the client.&lt;br /&gt;
&lt;p /&gt;
Rather than hardcoding the text, making the client dependent on me for changes, I put the content into a node.  In the custom module (e.g. the code I&#039;m writing), I load the node and use the body of the node as the content to display.&lt;br /&gt;
&lt;p /&gt;
&lt;pre&gt;
  $node = node_load(array(&#039;nid&#039; =&gt; &#039;11363&#039;));
  if (isset($node-&gt;body)) {
    $o .= $node-&gt;body;
  }
&lt;/pre&gt;&lt;p /&gt;
This has two requirements: the node exists, and the node has HTML included for formatting.  Neither is typically a problem with the clients I have, but be sure to watch for the possibility the user is expecting filters to format the content before display.&lt;/p&gt;
</description>
 <pubDate>Wed, 11 May 2005 14:22:08 -0700</pubDate>
</item>
<item>
 <title>Ignoring whitespace changes with svn diff</title>
 <link>http://kitt.hodsden.com/ignoring_whitespace_changes_with_svn_diff</link>
 <description>&lt;p&gt;When using &lt;a href=&quot;http://subversion.tigris.org/&quot; target=&quot;_blank&quot;&gt;Subversion&lt;/a&gt;, a recent successor to the ubiquitous &lt;a href=&quot;http://www.gnu.org/software/cvs/&quot; target=&quot;_blank&quot;&gt;CVS&lt;/a&gt; revision control system, one may notice certain niceties of CVS are lost.&lt;br /&gt;
&lt;p /&gt;
In particular, the -w flag on cvs diff.&lt;br /&gt;
&lt;p /&gt;
&lt;code&gt;cvs diff&lt;/code&gt; will display changes in the local file.  Without the -r flag to specify which version is being compared, the default is to compare the local file to the currently tagged version in the repository, or the main branch HEAD if the file is not tagged.&lt;br /&gt;
&lt;p /&gt;
&lt;code&gt;cvs diff -w&lt;/code&gt; will display all non-whitespace changes.  White space changes include adding or removing tabs or spaces, or changing spaces to tabs.  New lines are still included in the diff.&lt;br /&gt;
&lt;p /&gt;
Subversion doesn&#039;t have this shortcut.  To ignore whitespace changes, you must use an external diff program with subversion:&lt;/p&gt;
&lt;pre&gt;
svn diff filename --diff-cmd `which diff` -x &quot;-w&quot;
&lt;/pre&gt;&lt;p&gt;You can specify a different diff, such as xdiff, xxdiff, as a value to the --diff-cmd argument, but be sure to include the full path.  If you want to pass more values to your diff command, include them in the -x argument value, which is passed along directly to the diff command:&lt;/p&gt;
&lt;pre&gt;
svn diff -r123:126 filename --diff-cmd /path/to/diff -x &quot;-u -w&quot;
&lt;/pre&gt;&lt;p&gt;If you want, you can also create an alias for this.  In tcsh:&lt;/p&gt;
&lt;pre&gt;
alias svndiff &#039;svn diff --diff-cmd `which diff` -x &quot;-w&quot; \!*&#039;
&lt;/pre&gt;&lt;br /&gt;
</description>
 <pubDate>Fri, 22 Apr 2005 11:18:59 -0700</pubDate>
</item>
<item>
 <title>Finding PHP included files from several places</title>
 <link>http://kitt.hodsden.com/finding_php_included_files_from_several_places</link>
 <description>&lt;p&gt;Depending on how the include path is constructed for a PHP application, a file may or may not exist in the include path.  A developer may, for example, wish to check several locations for a file to be included, and stop processing a PHP file if the file cannot be found.&lt;br /&gt;
&lt;p /&gt;
We came across this issue when trying to include the &lt;a href=&quot;http://smarty.php.net/&quot; target=&quot;_blank&quot;&gt;Smarty Template&lt;/a&gt; base class, &lt;code&gt;Smarty.class.php&lt;/code.&lt;br /&gt;
&lt;p /&gt;
The file could be in one of two locations, depending on the include path, which was not standardized across our development and test machines.  The file was either directly in the path, or in the Smarty directory, which was in the path.&lt;br /&gt;
&lt;p /&gt;
So, we used this line:&lt;br /&gt;
&lt;p /&gt;
&lt;pre&gt;
@(include_once(&#039;Smarty.class.php&#039;)) OR require_once(&#039;Smarty/Smarty.class.php&#039;);&lt;/pre&gt;&lt;p /&gt;
The first include_once will look for the Smarty file on the current include path.  &lt;code&gt;include_once&lt;/code&gt; and &lt;code&gt;include&lt;/code&gt; do not stop the script execution on failure, whereas &lt;code&gt;require&lt;/code&gt; will.&lt;br /&gt;
&lt;p /&gt;
The @ in front of the &lt;code&gt;include_once&lt;/code&gt; will suppress errors, including those output to screen.  So, if the first include fails, the &lt;code&gt;require_once&lt;/code&gt; comes into effect.  The script will try to locate the Smarty file in the Smarty subdirectory.&lt;br /&gt;
&lt;p /&gt;
Now, if the file is not found in either location, we do want the script to stop execution, so we use &lt;code&gt;require_once&lt;/code&gt; for the second include.&lt;br /&gt;
&lt;p /&gt;
We could also chain several &lt;code&gt;include&lt;/code&gt; statements together, if needed, suppressing errors as needed until success or complete failure.&lt;/p&gt;
</description>
 <pubDate>Thu, 21 Apr 2005 16:22:12 -0700</pubDate>
</item>
<item>
 <title>Personal vs Professional</title>
 <link>http://kitt.hodsden.com/personal_vs_professional</link>
 <description>&lt;p /&gt;
There&#039;s my professional life, and there&#039;s my personal life.&lt;br /&gt;
&lt;p /&gt;
Most people who want to know about my personal life don&#039;t want to read tutorials that I&#039;ve written.  Similarly, those who want to read my tutorials don&#039;t want to read about issues with my dogs, how well I played that last ultimate game, what bad television shows I watch, or my last trip.&lt;br /&gt;
&lt;p /&gt;
So here is my professional site.  Here is where my professional opinions, articles, tutorials and tricks are published.  My personal blog is located at &lt;a href=&quot;http://kitt.hodsden.org/&quot; target=&quot;_blank&quot;&gt;http://kitt.hodsden.org/&lt;/a&gt;, in case you do want to read about my dogs.&lt;/p&gt;
</description>
 <pubDate>Wed, 13 Apr 2005 16:26:56 -0700</pubDate>
</item>
</channel>
</rss>
