<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Neil Ang (programming)</title>
    <link>http://neilang.com</link>
    <description>Neil Ang Feed</description>
    <language>en-us</language>
    <generator>Symphony (build 1701)</generator>
    <item>
      <title>How to create a spell checking web spider</title>
      <link>http://neilang.com/entries/how-to-create-a-spell-checking-web-spider/</link>
      <pubDate>Sat, 24 Oct 2009 10:18:00 GMT</pubDate>
      <guid>http://neilang.com/entries/how-to-create-a-spell-checking-web-spider/</guid>
      <description>&lt;p&gt;Recently I found out my employer was paying a third-party company to regularly check the spelling on their website and send them a monthly report. So I thought I would write a simple spider that could to do the same thing and save them money.&lt;/p&gt;

&lt;h3&gt;The setup&lt;/h3&gt;
&lt;p&gt;My solution uses ruby (plus some gems) and the awesome &lt;a href="http://aspell.net/"&gt;Aspell&lt;/a&gt; (an open source spell checker).&lt;/p&gt;

&lt;p&gt;First of all you will need to download and install &lt;a href="http://aspell.net/"&gt;Aspell&lt;/a&gt;, and an Aspell dictionary for the language you want to use. In this example I will be using the English dictionary.&lt;/p&gt;


&lt;p&gt;To install Aspell on OS X, download and unpack the latest version, and then using terminal:&lt;/p&gt;

&lt;p&gt;
  &lt;code&gt;cd path/to/aspell &lt;br /&gt; ./configure &lt;br /&gt; make &lt;br /&gt; sudo make install&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;To install a dictionary, repeat the steps above with a downloaded dictionary.&lt;/p&gt;

&lt;p&gt;You can verify that Aspell installed correctly and that the dictionaries are loaded by typing these commands in terminal: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;aspell -v&lt;br /&gt;aspell dicts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next you will need to install &lt;em&gt;raspell&lt;/em&gt;, which is a gem used to interact with Aspell. You will also need another gem called &lt;em&gt;spider&lt;/em&gt;, which will take care of the web crawling work for us. And finally, &lt;em&gt;hpricot&lt;/em&gt; or &lt;em&gt;nokogiri&lt;/em&gt; to handle the HTML.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo gem install raspell &lt;br /&gt;sudo gem install spider&lt;br /&gt;sudo gem install hpricot&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;The script&lt;/h3&gt;
&lt;p&gt;With that done, you can use the spider gem to crawl all the html pages on a website, then use hpricot to extract the relevant words from the page and check each one with raspell. E.g.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#!/usr/bin/env ruby &lt;br /&gt; &lt;br /&gt; require 'rubygems' &lt;br /&gt; require 'spider' &lt;br /&gt; require 'raspell' &lt;br /&gt; require 'hpricot' &lt;br /&gt; &lt;br /&gt; domain = 'http://www.example.com/' &lt;br /&gt; &lt;br /&gt; speller = Aspell.new('en_GB') &lt;br /&gt; &lt;br /&gt; Spider.start_at(domain) do |s| &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;s.add_url_check do |a_url| &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a_url.match("^#{domain}") &lt;br /&gt; &amp;nbsp;&amp;nbsp;end &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;s.on :success do |a_url, resp, prior_url| &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unless resp['content-type'].match('text/html') &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts "Skipping #{a_url}" &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts "On page #{a_url}" &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document = Hpricot(resp.body) &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.search('head').remove &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.search('script').remove &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.search('link').remove &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.search('meta').remove &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.search('style').remove &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words = document.inner_text.gsub(/\s+/, ' ').strip.split(/\s/) &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;speller.list_misspelled(words).each do |mistake| &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts " * Found mistake \"#{mistake}\" perhaps you meant \"#{speller.suggest(mistake).first}\"" &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end &lt;br /&gt; &amp;nbsp;&amp;nbsp;end &lt;br /&gt; &lt;br /&gt; end &lt;br /&gt; &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A few things to note about this script:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I have set the spider to use the "en_GB" dictionary (as this is what we use in Australia), but you can set it to any dictionary you installed (e.g. "en_US").&lt;/li&gt;
  &lt;li&gt;If you wanted to use nokogiri instead of hpricot, simply replace the Hpricot declaration with &lt;kbd&gt;document = Nokogiri(resp.body)&lt;/kbd&gt; and &lt;kbd&gt;require&lt;/kbd&gt; it at the start of the script.&lt;/li&gt;
  &lt;li&gt;Hpricot is used to strip out typically non-visible sections of the page, so that we only spellcheck the displayed words.&lt;/li&gt;
  &lt;li&gt;The spider won't search outside of the set domain.&lt;/li&gt;
  &lt;li&gt;The spider is also capable of performing a link check as it crawls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see this is only a very basic implementation, but demonstrates how easily you can create your own spelling spider!&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/how-to-create-a-spell-checking-web-spider/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Validate an ISSN using Perl or JavaScript</title>
      <link>http://neilang.com/entries/validate-an-issn-using-perl-or-javascript/</link>
      <pubDate>Fri, 12 Jun 2009 07:57:00 GMT</pubDate>
      <guid>http://neilang.com/entries/validate-an-issn-using-perl-or-javascript/</guid>
      <description>&lt;p&gt;Last week I wrote about &lt;a href="/entries/how-to-check-if-an-isbn-is-valid-in-perl-or-javasc/"&gt;validating an ISBN&lt;/a&gt;, so this week I thought I would post the code to validate an ISSN.&lt;/p&gt;

&lt;p&gt;There are only a few minor differences between validating an ISSN and ISBN.&lt;/p&gt;

&lt;h3&gt;Validate ISSN in Perl&lt;/h3&gt;

&lt;code&gt;sub valid_issn { &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $issn = $_[0]; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $issn =~ s/[^\dX]//gi; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return if length($issn) != 8; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $sum = 0; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my @chars = split('', $issn); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$chars[7] = 10 if uc($chars[7]) eq 'X'; &lt;br /&gt; &amp;nbsp;&amp;nbsp;for (my $char = 0; $char &amp;lt; @chars; $char++) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sum += (8-$char) * $chars[$char]; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;return (($sum % 11) == 0); &lt;br /&gt; } &lt;br /&gt; &lt;/code&gt;

&lt;h3&gt;Validate ISSN in JavaScript&lt;/h3&gt;

&lt;code&gt;function isValidISSN (issn) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;issn = issn.replace(/[^\dX]/gi, ''); &lt;br /&gt; &amp;nbsp;&amp;nbsp;if(issn.length != 8){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;var chars = issn.split(''); &lt;br /&gt; &amp;nbsp;&amp;nbsp;if(chars[7].toUpperCase() == 'X'){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chars[7] = 10; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;var sum = 0; &lt;br /&gt; &amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; chars.length; i++) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum += ((8-i) * parseInt(chars[i])); &lt;br /&gt; &amp;nbsp;&amp;nbsp;}; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return ((sum % 11) == 0); &lt;br /&gt; }&lt;/code&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/validate-an-issn-using-perl-or-javascript/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>How to check if an ISBN is valid in Perl or JavaScript</title>
      <link>http://neilang.com/entries/how-to-check-if-an-isbn-is-valid-in-perl-or-javasc/</link>
      <pubDate>Thu, 04 Jun 2009 22:22:00 GMT</pubDate>
      <guid>http://neilang.com/entries/how-to-check-if-an-isbn-is-valid-in-perl-or-javasc/</guid>
      <description>&lt;p&gt;The cool thing about an ISBN is that its last digit is a "check digit", which validates the rest of the number. How does it work? "It is calculated on a modulus 11 with weights 10-2, using X in lieu of 10 where ten would occur as a check digit." &lt;a href="http://www.isbn.org/standards/home/isbn/international/html/usm4.htm"&gt;More info&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Validate an ISBN in Perl&lt;/h3&gt;
&lt;p&gt;Here is a simple subroutine I wrote to check if a number entered is valid: &lt;/p&gt;
&lt;p&gt;
&lt;code&gt;sub valid_isbn { &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $isbn = shift; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $isbn =~ s/[^\dX]//gi; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return if length($isbn) != 10; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $sum = 0; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my @chars = split('', $isbn); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$chars[9] = 10 if uc($chars[9]) eq 'X'; &lt;br /&gt; &amp;nbsp;&amp;nbsp;for (my $char = 0; $char &amp;lt; @chars; $char++) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sum += (10-$char) * $chars[$char]; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;return (($sum % 11) == 0); &lt;br /&gt; }&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;Code would not be complete without tests!&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;use Test::More tests =&amp;gt; 12; &lt;br /&gt; &lt;br /&gt; is(valid_isbn("ISBN 0843610727"), 1); &lt;br /&gt; is(valid_isbn("99921-58-10-7"), 1); &lt;br /&gt; is(valid_isbn("9971 5 0210 0"), 1); &lt;br /&gt; is(valid_isbn("0-8044-2957-X"), 1); &lt;br /&gt; is(valid_isbn("0943396042"), 1); &lt;br /&gt; is(valid_isbn("0-9752298-0-X"), 1); &lt;br /&gt; &lt;br /&gt; isnt(valid_isbn("ISBN 0843610723"), 1); &lt;br /&gt; isnt(valid_isbn("91921-58-10-7"), 1); &lt;br /&gt; isnt(valid_isbn("9971 5 0214 0"), 1); &lt;br /&gt; isnt(valid_isbn("0-8044-2957-2"), 1); &lt;br /&gt; isnt(valid_isbn("0943394042"), 1); &lt;br /&gt; isnt(valid_isbn("0-9757297-0-X"), 1);&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;Validate an ISBN in JavaScript&lt;/h3&gt;

&lt;p&gt;And here it is written as a JavaScript function:&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;&amp;lt;script type="text/javascript" charset="utf-8"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;function isValidISBN (isbn) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isbn = isbn.replace(/[^\dX]/gi, ''); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isbn.length != 10){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var chars = isbn.split(''); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(chars[9].toUpperCase() == 'X'){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chars[9] = 10; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sum = 0; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; chars.length; i++) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum += ((10-i) * parseInt(chars[i])); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ((sum % 11) == 0); &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;/code&gt;
&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/how-to-check-if-an-isbn-is-valid-in-perl-or-javasc/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Generating a calendar using XSLT</title>
      <link>http://neilang.com/entries/generating-a-calendar-using-xslt/</link>
      <pubDate>Sun, 16 Nov 2008 07:43:00 GMT</pubDate>
      <guid>http://neilang.com/entries/generating-a-calendar-using-xslt/</guid>
      <description>&lt;p&gt;Recently I was tasked to build an interactive calendar in XSLT. I wanted the calendar to always start on a Sunday as well as have clean markup. I couldn't find any good examples on the web while I was building it, so I decided to post the base of my solution.&lt;/p&gt;

&lt;p&gt;
	&lt;img src="http://neilang.com/workspace/upload/calendar.png" alt="Picture of final product" /&gt;
&lt;/p&gt;

&lt;p&gt;Insert the following variables and templates into your stylesheet:&lt;/p&gt;

&lt;code&gt;&amp;lt;xsl:variable name="DisplayDate" select="date:date()"/&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="Year" select="date:year($DisplayDate)"/&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="Month" select="date:month-in-year($DisplayDate)"/&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="MonthName" select="date:month-name($DisplayDate)" /&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="NumberOfDaysInMonth"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="DaysInMonth"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="month" select="$Month" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="year" select="$Year" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt; &lt;br /&gt; &amp;lt;/xsl:variable&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="FirstDayInWeekForMonth"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test="$Month &amp;amp;lt; 10"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="date:day-in-week(date:date(concat($Year,'-0', $Month, '-01')))" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="date:day-in-week(date:date(concat($Year,'-', $Month, '-01')))" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:variable&amp;gt; &lt;br /&gt; &amp;lt;xsl:variable name="WeeksInMonth"&amp;gt;&amp;lt;xsl:value-of select="($NumberOfDaysInMonth + $FirstDayInWeekForMonth - 1) div 7" /&amp;gt;&amp;lt;/xsl:variable&amp;gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;xsl:template name="DaysInMonth"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="month"&amp;gt;&amp;lt;xsl:value-of select="$Month" /&amp;gt;&amp;lt;/xsl:param&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="year"&amp;gt;&amp;lt;xsl:value-of select="$Year" /&amp;gt;&amp;lt;/xsl:param&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test="$month = 1 or $month = 3 or $month = 5 or $month = 7 or $month = 8 or $month = 10 or $month = 12"&amp;gt;31&amp;lt;/xsl:when&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test="$month=2"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test="$year mod 4 = 0"&amp;gt;29&amp;lt;/xsl:when&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;28&amp;lt;/xsl:otherwise&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;30&amp;lt;/xsl:otherwise&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt; &lt;br /&gt; &amp;lt;/xsl:template&amp;gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;xsl:template name="Calendar"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;table summary="Monthly calendar"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;caption&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="$MonthName" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt; &amp;lt;/xsl:text&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="$Year" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/caption&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Sunday"&amp;gt;Sun&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Monday"&amp;gt;Mon&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Tuesday"&amp;gt;Tue&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Wednesday"&amp;gt;Wed&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Thursday"&amp;gt;Thu&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Friday"&amp;gt;Fri&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th abbr="Saturday"&amp;gt;Sat&amp;lt;/th&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="CalendarWeek"/&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt; &lt;br /&gt; &amp;lt;/xsl:template&amp;gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;xsl:template name="CalendarWeek"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="week"&amp;gt;1&amp;lt;/xsl:param&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="day"&amp;gt;1&amp;lt;/xsl:param&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="CalendarDay"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="day" select="$day" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="$WeeksInMonth &amp;amp;gt; $week"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="CalendarWeek"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="week" select="$week + 1" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="day" select="$week * 7 - ($FirstDayInWeekForMonth - 2)" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt; &lt;br /&gt; &amp;lt;/xsl:template&amp;gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;xsl:template name="CalendarDay"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="count"&amp;gt;1&amp;lt;/xsl:param&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name="day" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test="($day = 1 and $count != $FirstDayInWeekForMonth) or $day &amp;amp;gt; $NumberOfDaysInMonth"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td class="empty"&amp;gt;&amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="$count &amp;amp;lt; 7"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="CalendarDay"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="count" select="$count + 1" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="day" select="$day" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select="$day" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test="$count &amp;amp;lt; 7"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name="CalendarDay"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="count" select="$count + 1" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name="day" select="$day + 1" /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt; &lt;br /&gt; &amp;lt;/xsl:template&amp;gt;&lt;/code&gt;

&lt;p&gt;For this code to work, you need to be using &lt;a href="http://exslt.org/"&gt;exslt&lt;/a&gt;.&lt;/p&gt;

&lt;code&gt;&amp;lt;xsl:stylesheet version="1.0" &lt;br /&gt; &amp;nbsp;&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform" &lt;br /&gt; &amp;nbsp;&amp;nbsp;xmlns:exslt="http://exslt.org/common" &lt;br /&gt; &amp;nbsp;&amp;nbsp;xmlns:date="http://exslt.org/dates-and-times"&amp;gt;&lt;/code&gt;

&lt;p&gt;Once you have added the templates you can call the calendar like this: &lt;/p&gt;

&lt;code&gt;&amp;lt;xsl:call-template name="Calendar" /&amp;gt;&lt;/code&gt;

&lt;p&gt;Finally add some CSS to the page so your calendar looks more presentable:&lt;/p&gt;

&lt;code&gt;&amp;lt;style type="text/css" media="screen"&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;table{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border:1px solid #CCC; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-collapse: collapse; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;caption{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-weight:bold; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size:120%; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin-bottom:8px; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;td,th{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:center; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vertical-align:middle; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:36px; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height:34px; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border:1px solid #CCC; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding:0; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;th{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height:inherit; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;.empty{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background-color:#EEE; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;lt;/style&amp;gt; &lt;br /&gt; &lt;br /&gt; &lt;/code&gt;

&lt;p&gt;This is only the base of the calendar I built, and you can expand this to make it browse-able. But I will leave that for another post. &lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/generating-a-calendar-using-xslt/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Converting seconds into a readable format in Perl</title>
      <link>http://neilang.com/entries/converting-seconds-into-a-readable-format-in-perl/</link>
      <pubDate>Wed, 18 Jun 2008 09:49:00 GMT</pubDate>
      <guid>http://neilang.com/entries/converting-seconds-into-a-readable-format-in-perl/</guid>
      <description>&lt;p&gt;Here is a short and easy Perl function to convert the difference between two time stamps, into something that is more human readable. There are Perl modules that can do this as well, however I thought I would share what I wrote incase someone finds it useful.&lt;/p&gt;

&lt;code&gt;#!/usr/bin/env perl -w &lt;br /&gt; &lt;br /&gt; sub convert_time { &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $time = shift; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $days = int($time / 86400); &lt;br /&gt; &amp;nbsp;&amp;nbsp; $time -= ($days * 86400); &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $hours = int($time / 3600); &lt;br /&gt; &amp;nbsp;&amp;nbsp; $time -= ($hours * 3600); &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $minutes = int($time / 60); &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $seconds = $time % 60; &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$days = $days &amp;lt; 1 ? '' : $days .'d '; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$hours = $hours &amp;lt; 1 ? '' : $hours .'h '; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$minutes = $minutes &amp;lt; 1 ? '' : $minutes . 'm '; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$time = $days . $hours . $minutes . $seconds . 's'; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return $time; &lt;br /&gt; }&lt;/code&gt;

&lt;p&gt;When using this function, these are the outputs you should see:&lt;/p&gt;

&lt;code&gt;print convert_time(1); # result: 1s &lt;br /&gt; print convert_time(61); # result: 1m 1s &lt;br /&gt; print convert_time(3661); # result: 1h 1m 1s &lt;br /&gt; print convert_time(90061); # result: 1d 1h 1m 1s&lt;/code&gt;

&lt;p&gt;This code can easily be modified to output other formats as well. Let me know if you come up with something different.&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/converting-seconds-into-a-readable-format-in-perl/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Title case names in perl</title>
      <link>http://neilang.com/entries/title-case-names-in-perl/</link>
      <pubDate>Tue, 17 Jun 2008 09:58:00 GMT</pubDate>
      <guid>http://neilang.com/entries/title-case-names-in-perl/</guid>
      <description>&lt;p&gt;While I was at work today I came across a script I wrote a couple of years ago to title case names in perl. This script will transform names to a nice, readable title case equivalent. E.g. "JOHN SMITH" to "John Smith", "JOHN O'BRIAN" to "John O'Brian" and "JOHN MCCOOL" to "John McCool" etc.&lt;/p&gt;

&lt;code&gt;#!/usr/bin/env perl &lt;br /&gt; &lt;br /&gt; use strict; &lt;br /&gt; &lt;br /&gt; sub title_case_name { &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $person = shift; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my ($word, $subWord); &lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$person =~ s/\s+/ /g; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$person =~ s/^\s+//; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$person =~ s/\s+$//; &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my @namesArray = split(/ /, $person); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$person = ''; &lt;br /&gt; &amp;nbsp;&amp;nbsp;foreach $word (@namesArray){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$word = title_case($word); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($word =~ /-/){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my @subWordsArray = split(/-/, $word); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$word = ''; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach $subWord (@subWordsArray){ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$subWord = title_case($subWord); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$word .= $subWord.'-'; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chop($word); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$person .= $word.' '; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;chop($person); &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return $person; &lt;br /&gt; } &lt;br /&gt; &lt;br /&gt; sub title_case { &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $name = shift; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $temp_str1 = ''; &lt;br /&gt; &amp;nbsp;&amp;nbsp;my $temp_str2 = ''; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$name = lc($name); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$name = ucfirst($name); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$temp_str1 = substr($name, 0, 2); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$temp_str2 = substr($name, 2); &lt;br /&gt; &amp;nbsp;&amp;nbsp;if($temp_str1 eq 'Mc' || $temp_str1 eq "O'") { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$temp_str2 = ucfirst($temp_str2); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$name = $temp_str1 . $temp_str2; &lt;br /&gt; &amp;nbsp;&amp;nbsp;} &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;return $name; &lt;br /&gt; } &lt;br /&gt; &lt;br /&gt; print title_case_name('JOHN SMITH') . "\n"; &lt;br /&gt; print title_case_name('JOHN O\'BRIAN') . "\n"; &lt;br /&gt; print title_case_name('JOHN MCCOOL') . "\n";&lt;/code&gt;

&lt;p&gt;&lt;a href="/workspace/upload/title_case_names.zip"&gt;Download this script.&lt;/a&gt;&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/title-case-names-in-perl/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Dynamically set network location in Mac OS X</title>
      <link>http://neilang.com/entries/dynamically-set-network-location-in-mac-os-x/</link>
      <pubDate>Wed, 24 Jan 2007 10:10:00 GMT</pubDate>
      <guid>http://neilang.com/entries/dynamically-set-network-location-in-mac-os-x/</guid>
      <description>&lt;p&gt;I love macs, but sometimes things could have been implemented better. In particular, I hate having to set the network location on my laptop when I go between work and home every day. I have put together a small shell script which can do this. I run this script on startup and it just checks what day and time it is so it can switch between two profiles (work or home).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
day=`date +"%a"`&lt;br /&gt;
hour=`date +"%H"`&lt;br /&gt;
&lt;br /&gt;
if [ $day = "Sat" -o $day = "Sun" ]; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;`scselect Home` &lt;br /&gt;
else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if [ $hour -gt 8 -a $hour -lt 16 ]; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`scselect Work` &lt;br /&gt;
&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`scselect Home`&lt;br /&gt;
&amp;nbsp;&amp;nbsp;fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
exit 0
&lt;/code&gt;&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/dynamically-set-network-location-in-mac-os-x/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>PHP: Explore your server through a PHP file browser</title>
      <link>http://neilang.com/entries/php-explore-your-server-through-a-php-file-browse/</link>
      <pubDate>Thu, 11 Jan 2007 10:09:00 GMT</pubDate>
      <guid>http://neilang.com/entries/php-explore-your-server-through-a-php-file-browse/</guid>
      <description>&lt;p&gt;In the past I've had to delete files from my server where the file permissions were set to apache and I could not override them because the host did not alllow terminal or shell access. So I quickly put together a PHP script that allowed me to navigate through the file system and unlink (or delete) files as the apache user. I haven't had to use the script for a while but I still think its pretty nifty to use when you want to explore a servers file system. &lt;/p&gt;

&lt;p&gt;In the code below I've stripped out the unlink code (as it can be dangerous to have a page like that on your server) and just made it into a file explorer. Copy the code into a page and give it a go. If you're like me and have set your localhost as your homepage you can use it to quickly access files you have been working on. If anyone is interested in the version that allows you to unlink files, just send me an email and I will post it on the site. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;


&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;PHP File Browser&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.error{ color:red; font-weight:bold; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// Explore the files via a web interface. &amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$script = basename(__FILE__); // the name of this script&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$path = !empty($_REQUEST['path']) ? $_REQUEST['path'] : dirname(__FILE__); // the path the script should access&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;h1&amp;gt;Directory Browser&amp;lt;/h1&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;p&amp;gt;Browsing Location: {$path}&amp;lt;/p&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$directories = array();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$files = array();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// Check we are focused on a dir&lt;br /&gt;
&amp;nbsp;&amp;nbsp;if (is_dir($path)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chdir($path); // Focus on the dir&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    if ($handle = opendir('.')) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (($item = readdir($handle)) !== false) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Loop through current directory and divide files and directorys&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(is_dir($item)){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array_push($directories, realpath($item)); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array_push($files, ($item));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;        }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;        closedir($handle);  // Close the directory handle&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo "&amp;lt;p class=\"error\"&amp;gt;Directory handle could not be obtained.&amp;lt;/p&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo "&amp;lt;p class=\"error\"&amp;gt;Path is not a directory&amp;lt;/p&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// There are now two arrays that contians the contents of the path. &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;// List the directories as browsable navigation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;h2&amp;gt;Navigation&amp;lt;/h2&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;ul&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;foreach( $directories as $directory ){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo ($directory != $path) ? "&amp;lt;li&amp;gt;&amp;lt;a href=\"{$script}?path={$directory}\"&amp;gt;{$directory}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;" : "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;/ul&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;h2&amp;gt;Files&amp;lt;/h2&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;ul&amp;gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;foreach( $files as $file ){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Comment the next line out if you wish see hidden files while browsing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(preg_match("/^\./", $file) || $file == $script): continue; endif; // This line will hide all invisible files. &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo '&amp;lt;li&amp;gt;&amp;lt;a href="' . basename($file) . '" target="_blank"&amp;gt;' . $file . '&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;echo "&amp;lt;/ul&amp;gt;";&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;


&lt;/code&gt;&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/php-explore-your-server-through-a-php-file-browse/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>Sockets problem with MySQL/PHP and Mac OS X</title>
      <link>http://neilang.com/entries/sockets-problem-with-mysql-php-and-mac-os-x/</link>
      <pubDate>Thu, 21 Dec 2006 10:08:00 GMT</pubDate>
      <guid>http://neilang.com/entries/sockets-problem-with-mysql-php-and-mac-os-x/</guid>
      <description>&lt;p&gt;After installing MySQL 5 on OS X 10.4, you may have noticed that the install package has placed 'mysql.sock' in '/tmp/mysql.sock' instead of '/var/mysql/mysql.sock'. This will cause the following error when you attempt to access MySQL through PHP:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (2)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A simple solution is to place a symbolic link between the expected folder and the install directory. This can be achieved with the following terminal commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo mkdir /var/mysql&lt;br /&gt;
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To test a database connection between PHP and MySQL, you can use the following script:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;?php&lt;br /&gt;
&amp;nbsp;&amp;nbsp;  $dbServer='localhost';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    $dbUser='root';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    $dbPass='root';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    $dbName='test';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;    $link = mysql_connect("$dbServer", "$dbUser", "$dbPass") or die ('Could not connect.');&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;   echo 'Connected successfully&amp;lt;br /&amp;gt;';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;   mysql_select_db("$dbName") or die('Could not select database.');&lt;br /&gt;
&amp;nbsp;&amp;nbsp;   echo 'Database selected successfully&amp;lt;br /&amp;gt;';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;   mysql_close($link);&lt;br /&gt;
?&amp;gt;
&lt;/code&gt;&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/sockets-problem-with-mysql-php-and-mac-os-x/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
    <item>
      <title>PHP: Sending HTML Emails</title>
      <link>http://neilang.com/entries/php-sending-html-emails/</link>
      <pubDate>Tue, 19 Dec 2006 10:06:00 GMT</pubDate>
      <guid>http://neilang.com/entries/php-sending-html-emails/</guid>
      <description>&lt;p&gt;Just like the general nature of PHP, the PHP mailing functions are simple to use as well. The easiest way to send an email is to use the &lt;a href="http://www.php.net/manual/en/function.mail.php"&gt;mail&lt;/a&gt; function built into PHP 3, PHP 4 and PHP 5. However, to send HTML based emails (or any other content-type for that matter), you will need to alter the header values of the email. The following is a short example on how to do this with PHP. &lt;/p&gt;

&lt;h3&gt;Configure PHP.ini&lt;/h3&gt;

&lt;p&gt;To send an email, you must first check your php.ini mail settings are correct (if these setting are correct, skip down below to the code). If you are using Windows, you will need access to a SMTP server (your web host should provide you with one, otherwise you can setup your own), otherwise if your using a Mac or Linux, you will need the &lt;a href="http://www.sendmail.org/"&gt;sendmail&lt;/a&gt; mail transfer agent (this is usually preinstalled with the OS).&lt;/p&gt;

&lt;p&gt;For Windows users, locate and open your php.ini file and find the following lines:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[mail function]&lt;br /&gt;
; For Win32 only.&lt;br /&gt;
;SMTP = &lt;br /&gt;
;smtp_port = &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
; For Win32 only.&lt;br /&gt;
;sendmail_from = 
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the correct settings and remove the line comment marks (semi-colons) so the configuration looks similar to this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[mail function]&lt;br /&gt;
; For Win32 only.&lt;br /&gt;
SMTP = localhost&lt;br /&gt;
smtp_port = 25&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
; For Win32 only.&lt;br /&gt;
sendmail_from = me@example.com&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For non-Windows users locate the following lines in the php.ini:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;; For Unix only.  You may supply arguments as well (default: "sendmail -t -i"). &lt;br /&gt;
;sendmail_path =&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uncomment and add the full path to sendmail like this:&lt;/p&gt;
 
&lt;p&gt;&lt;code&gt;; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").&lt;br /&gt;
sendmail_path = /usr/sbin/sendmail&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Save and close php.ini. If you are using PHP through a web server, it might require a restart for changes to take effect.&lt;/p&gt;

&lt;h4&gt;The code&lt;/h4&gt;

&lt;p&gt;The following PHP code when executed will create a HTML message and send it to a recipient (or multiple recipients by separating each email address in the '$to' variable with a comma):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;?php &lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;$to = 'anywhere@example.com';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$subject = 'My Test HTML';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$message =&amp;lt;&amp;lt;&amp;lt;EOM&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;My HTML Message&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;This is text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/html&amp;gt;&lt;br /&gt;
EOM;&lt;br /&gt;&lt;br /&gt;
  
&amp;nbsp;&amp;nbsp;$headers = 'From: no-reply@example.com' . "\r\n" .
             'content-type: text/html;'. "\r\n";&lt;br /&gt;&lt;br /&gt;
             
&amp;nbsp;&amp;nbsp;if(mail($to, $subject, $message, $headers)){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo 'Mail sent successfully!';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo 'Mail could not be sent, please check your settings.';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;
  
?&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the SMTP server you are using is on a protected network that won't accept emails from your host, you can use PHP to create the email through the SMTP host.&lt;/p&gt;

&lt;p&gt;The following code is an example of how this could be done:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;?php &lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;$to = 'anywhere@example.com';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$subject = 'My Test HTML';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$message =&amp;lt;&amp;lt;&amp;lt;EOM&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;My HTML Message&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;This is text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/html&amp;gt;&lt;br /&gt;
EOM;&lt;br /&gt;&lt;br /&gt;
  
&amp;nbsp;&amp;nbsp;// Enter the SMTP server and port here&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$conn = fsockopen("smtp.example.com", 25);&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;if($conn){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "HELO\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "MAIL FROM: $from\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "RCPT TO: $to\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "DATA\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "Subject: $subject\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "content-type: text/html\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "$email \r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, ".\r\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  fwrite($conn, "QUIT");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  echo "Finished Sending Email";&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  echo "Couldn't connect!\n";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;

?&amp;gt;
&lt;/code&gt;&lt;/p&gt;
					     &lt;p&gt;&lt;a title="What are you, chicken?!" href="http://neilang.com/entries/php-sending-html-emails/#comment"&gt;Please post a comment&lt;/a&gt;&lt;/p&gt;
					   </description>
    </item>
  </channel>
</rss>
