<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://www.johnhawthorn.com/</id>
  <title>John Hawthorn</title>
  <updated>2011-07-16T07:00:00Z</updated>
  <link rel="alternate" href="http://www.johnhawthorn.com/"/>
  <link rel="self" href="http://www.johnhawthorn.com/atom.xml"/>
  <author>
    <name>John Hawthorn</name>
    <uri>http://www.johnhawthorn.com</uri>
  </author>
  <entry>
    <id>tag:www.johnhawthorn.com,2011-07-16:/2011/07/work-work-zug-zug/</id>
    <title type="html">Work, work. Zug zug.</title>
    <published>2011-07-16T07:00:00Z</published>
    <updated>2011-07-16T07:00:00Z</updated>
    <link rel="alternate" href="http://www.johnhawthorn.com/2011/07/work-work-zug-zug/"/>
    <content type="html">&lt;p&gt;I wrote a little script to block websites which would destract me from work.
Inspired by &lt;a href="https://github.com/leftnode/get-shit-done"&gt;get-shit-done&lt;/a&gt; and the Orc voices from Warcraft 2.
The script can be called as either &lt;a href="/audio/workwork.wav"&gt;&lt;code&gt;workwork&lt;/code&gt;&lt;/a&gt; or &lt;a href="/audio/readytowork.wav"&gt;&lt;code&gt;readytowork&lt;/code&gt;&lt;/a&gt; to enable the block, and &lt;a href="/audio/workcomplete.wav"&gt;&lt;code&gt;workcomplete&lt;/code&gt;&lt;/a&gt; to unblock the websites. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning: Contains a list of websites which will waste your time.&lt;/strong&gt;&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;a href="#n4" name="n4"&gt;4&lt;/a&gt;
&lt;a href="#n5" name="n5"&gt;5&lt;/a&gt;
&lt;a href="#n6" name="n6"&gt;6&lt;/a&gt;
&lt;a href="#n7" name="n7"&gt;7&lt;/a&gt;
&lt;a href="#n8" name="n8"&gt;8&lt;/a&gt;
&lt;a href="#n9" name="n9"&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n10" name="n10"&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n11" name="n11"&gt;11&lt;/a&gt;
&lt;a href="#n12" name="n12"&gt;12&lt;/a&gt;
&lt;a href="#n13" name="n13"&gt;13&lt;/a&gt;
&lt;a href="#n14" name="n14"&gt;14&lt;/a&gt;
&lt;a href="#n15" name="n15"&gt;15&lt;/a&gt;
&lt;a href="#n16" name="n16"&gt;16&lt;/a&gt;
&lt;a href="#n17" name="n17"&gt;17&lt;/a&gt;
&lt;a href="#n18" name="n18"&gt;18&lt;/a&gt;
&lt;a href="#n19" name="n19"&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n20" name="n20"&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n21" name="n21"&gt;21&lt;/a&gt;
&lt;a href="#n22" name="n22"&gt;22&lt;/a&gt;
&lt;a href="#n23" name="n23"&gt;23&lt;/a&gt;
&lt;a href="#n24" name="n24"&gt;24&lt;/a&gt;
&lt;a href="#n25" name="n25"&gt;25&lt;/a&gt;
&lt;a href="#n26" name="n26"&gt;26&lt;/a&gt;
&lt;a href="#n27" name="n27"&gt;27&lt;/a&gt;
&lt;a href="#n28" name="n28"&gt;28&lt;/a&gt;
&lt;a href="#n29" name="n29"&gt;29&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n30" name="n30"&gt;30&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n31" name="n31"&gt;31&lt;/a&gt;
&lt;a href="#n32" name="n32"&gt;32&lt;/a&gt;
&lt;a href="#n33" name="n33"&gt;33&lt;/a&gt;
&lt;a href="#n34" name="n34"&gt;34&lt;/a&gt;
&lt;a href="#n35" name="n35"&gt;35&lt;/a&gt;
&lt;a href="#n36" name="n36"&gt;36&lt;/a&gt;
&lt;a href="#n37" name="n37"&gt;37&lt;/a&gt;
&lt;a href="#n38" name="n38"&gt;38&lt;/a&gt;
&lt;a href="#n39" name="n39"&gt;39&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n40" name="n40"&gt;40&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n41" name="n41"&gt;41&lt;/a&gt;
&lt;a href="#n42" name="n42"&gt;42&lt;/a&gt;
&lt;a href="#n43" name="n43"&gt;43&lt;/a&gt;
&lt;a href="#n44" name="n44"&gt;44&lt;/a&gt;
&lt;a href="#n45" name="n45"&gt;45&lt;/a&gt;
&lt;a href="#n46" name="n46"&gt;46&lt;/a&gt;
&lt;a href="#n47" name="n47"&gt;47&lt;/a&gt;
&lt;a href="#n48" name="n48"&gt;48&lt;/a&gt;
&lt;a href="#n49" name="n49"&gt;49&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n50" name="n50"&gt;50&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n51" name="n51"&gt;51&lt;/a&gt;
&lt;a href="#n52" name="n52"&gt;52&lt;/a&gt;
&lt;a href="#n53" name="n53"&gt;53&lt;/a&gt;
&lt;a href="#n54" name="n54"&gt;54&lt;/a&gt;
&lt;a href="#n55" name="n55"&gt;55&lt;/a&gt;
&lt;a href="#n56" name="n56"&gt;56&lt;/a&gt;
&lt;a href="#n57" name="n57"&gt;57&lt;/a&gt;
&lt;a href="#n58" name="n58"&gt;58&lt;/a&gt;
&lt;a href="#n59" name="n59"&gt;59&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n60" name="n60"&gt;60&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n61" name="n61"&gt;61&lt;/a&gt;
&lt;a href="#n62" name="n62"&gt;62&lt;/a&gt;
&lt;a href="#n63" name="n63"&gt;63&lt;/a&gt;
&lt;a href="#n64" name="n64"&gt;64&lt;/a&gt;
&lt;a href="#n65" name="n65"&gt;65&lt;/a&gt;
&lt;a href="#n66" name="n66"&gt;66&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span style="color:#34b"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span style="color:#A08;font-weight:bold"&gt;SiteList&lt;/span&gt; = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;%w{&lt;/span&gt;&lt;span style="color:#D14"&gt;
  reddit.com
  news.ycombinator.com
  twitter.com
  plus.google.com
  slashdot.org
  cracked.com
  vimeo.com
  youtube.com
  digg.com
&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#A08;font-weight:bold"&gt;StartToken&lt;/span&gt; = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;## workwork&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#A08;font-weight:bold"&gt;EndToken&lt;/span&gt; = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;## zugzug&lt;/span&gt;&lt;span style="color:#D14"&gt;\n&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#A08;font-weight:bold"&gt;HostsFile&lt;/span&gt; = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;/etc/hosts&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#A08;font-weight:bold"&gt;ConfigFile&lt;/span&gt; = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;~/.workwork&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;disabled_sites&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#A08;font-weight:bold"&gt;File&lt;/span&gt;.exist?(&lt;span style="color:#A08;font-weight:bold"&gt;ConfigFile&lt;/span&gt;)
    open(&lt;span style="color:#A08;font-weight:bold"&gt;ConfigFile&lt;/span&gt;).read.split(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;\n&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
  &lt;span style="color:#000;font-weight:bold"&gt;else&lt;/span&gt;
    &lt;span style="color:#A08;font-weight:bold"&gt;SiteList&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;workwork&lt;/span&gt;
  lines = []
  lines &amp;lt;&amp;lt; &lt;span style="color:#A08;font-weight:bold"&gt;StartToken&lt;/span&gt;
  disabled_sites.each &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |site|
    lines &amp;lt;&amp;lt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;127.0.0.1&lt;/span&gt;&lt;span style="color:#D14"&gt;\t&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;site&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    lines &amp;lt;&amp;lt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;127.0.0.1&lt;/span&gt;&lt;span style="color:#D14"&gt;\t&lt;/span&gt;&lt;span style="color:#D14"&gt;www.&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;site&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  lines &amp;lt;&amp;lt; &lt;span style="color:#A08;font-weight:bold"&gt;EndToken&lt;/span&gt;

  open(&lt;span style="color:#A08;font-weight:bold"&gt;HostsFile&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;a+&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |file|
    file.write lines.join(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;\n&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;workcomplete&lt;/span&gt;
  open(&lt;span style="color:#A08;font-weight:bold"&gt;HostsFile&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;r+&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |file|
    string = file.read
    string.gsub!(&lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:#A08;font-weight:bold"&gt;StartToken&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808"&gt;.*&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:#A08;font-weight:bold"&gt;EndToken&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;m&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;)
    file.seek(&lt;span style=""&gt;0&lt;/span&gt;)
    file.truncate(&lt;span style=""&gt;0&lt;/span&gt;)
    file.write(string)
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#998;font-style:italic"&gt;# switch to root since we need to change /etc/hosts&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style=""&gt;ENV&lt;/span&gt;[&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;USER&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;] != &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;root&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  exec(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;sudo &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style=""&gt;ENV&lt;/span&gt;[&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;_&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style=""&gt;ARGV&lt;/span&gt;.join(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt; &lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#A08;font-weight:bold"&gt;File&lt;/span&gt;.basename(&lt;span style="color:teal;font-weight:bold"&gt;$0&lt;/span&gt;)
&lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;workwork&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;then&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;readytowork&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;then&lt;/span&gt;
  workwork
&lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;workcomplete&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;then&lt;/span&gt;
  workcomplete
&lt;span style="color:#000;font-weight:bold"&gt;else&lt;/span&gt;
  puts &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;Unknown command&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Now I just need a script to remove executable permissions from minecraft.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.johnhawthorn.com,2011-07-13:/2011/07/slow-log-on-rds/</id>
    <title type="html">Dealing with the MySQL slow log on Amazon RDS</title>
    <published>2011-07-13T07:00:00Z</published>
    <updated>2011-07-13T07:00:00Z</updated>
    <link rel="alternate" href="http://www.johnhawthorn.com/2011/07/slow-log-on-rds/"/>
    <content type="html">&lt;p&gt;&lt;a href="http://aws.amazon.com/rds/"&gt;Amazon RDS&lt;/a&gt; is a web service offered by amazon which provides users with MySQL databases in the cloud. It&amp;#39;s an attractive service due to its convenient backups and easy replication.&lt;/p&gt;

&lt;p&gt;Amazon doesn&amp;#39;t provide shell access to RDS instances. For this reason, the &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html"&gt;slow query log&lt;/a&gt;, which is an invaluable tool for anyone with a somewhat large or complex data set, is not available in the traditional way. Amazon, however, does provide a method for enabling and retrieving the log.&lt;/p&gt;

&lt;h2&gt;Setup&lt;/h2&gt;

&lt;p&gt;To enable the slow query log on RDS, you should create or modify a DB parameter group which can be done from the AWS management console (online interface) or through various other tools.
There are two attributes that should be changed, &lt;code&gt;slow_query_log&lt;/code&gt;, which should be set to &lt;code&gt;1&lt;/code&gt; to enable, and &lt;code&gt;long_query_time&lt;/code&gt;, which should be set to the shortest length to be considered a slow query.&lt;/p&gt;

&lt;p&gt;The slow query log is stored in the table &lt;code&gt;mysql.slow_log&lt;/code&gt;. Rotating the slow query log is done by calling the stored procedure &lt;code&gt;CALL rds_rotate_slow_log&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Accessing&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt;
this script is now available as a gem: &lt;a href="https://rubygems.org/gems/rds_slow_log"&gt;rds_slow_log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve written a little ruby script to print out the slow log in the usual format. From this it can be read, or analyzed with tools like &lt;a href="https://github.com/wvanbergen/request-log-analyzer"&gt;request-log-analyzer&lt;/a&gt;.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;a href="#n4" name="n4"&gt;4&lt;/a&gt;
&lt;a href="#n5" name="n5"&gt;5&lt;/a&gt;
&lt;a href="#n6" name="n6"&gt;6&lt;/a&gt;
&lt;a href="#n7" name="n7"&gt;7&lt;/a&gt;
&lt;a href="#n8" name="n8"&gt;8&lt;/a&gt;
&lt;a href="#n9" name="n9"&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n10" name="n10"&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n11" name="n11"&gt;11&lt;/a&gt;
&lt;a href="#n12" name="n12"&gt;12&lt;/a&gt;
&lt;a href="#n13" name="n13"&gt;13&lt;/a&gt;
&lt;a href="#n14" name="n14"&gt;14&lt;/a&gt;
&lt;a href="#n15" name="n15"&gt;15&lt;/a&gt;
&lt;a href="#n16" name="n16"&gt;16&lt;/a&gt;
&lt;a href="#n17" name="n17"&gt;17&lt;/a&gt;
&lt;a href="#n18" name="n18"&gt;18&lt;/a&gt;
&lt;a href="#n19" name="n19"&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n20" name="n20"&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n21" name="n21"&gt;21&lt;/a&gt;
&lt;a href="#n22" name="n22"&gt;22&lt;/a&gt;
&lt;a href="#n23" name="n23"&gt;23&lt;/a&gt;
&lt;a href="#n24" name="n24"&gt;24&lt;/a&gt;
&lt;a href="#n25" name="n25"&gt;25&lt;/a&gt;
&lt;a href="#n26" name="n26"&gt;26&lt;/a&gt;
&lt;a href="#n27" name="n27"&gt;27&lt;/a&gt;
&lt;a href="#n28" name="n28"&gt;28&lt;/a&gt;
&lt;a href="#n29" name="n29"&gt;29&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n30" name="n30"&gt;30&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n31" name="n31"&gt;31&lt;/a&gt;
&lt;a href="#n32" name="n32"&gt;32&lt;/a&gt;
&lt;a href="#n33" name="n33"&gt;33&lt;/a&gt;
&lt;a href="#n34" name="n34"&gt;34&lt;/a&gt;
&lt;a href="#n35" name="n35"&gt;35&lt;/a&gt;
&lt;a href="#n36" name="n36"&gt;36&lt;/a&gt;
&lt;a href="#n37" name="n37"&gt;37&lt;/a&gt;
&lt;a href="#n38" name="n38"&gt;38&lt;/a&gt;
&lt;a href="#n39" name="n39"&gt;39&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;rubygems&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;active_record&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#458;font-weight:bold"&gt;SlowLog&lt;/span&gt; &amp;lt; &lt;span style="color:#A08;font-weight:bold"&gt;ActiveRecord&lt;/span&gt;::&lt;span style="color:#A08;font-weight:bold"&gt;Base&lt;/span&gt;
  set_table_name &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;slow_log&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;query_time&lt;/span&gt;
    time_parse query_time_before_type_cast
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;lock_time&lt;/span&gt;
    time_parse lock_time_before_type_cast
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;to_s&lt;/span&gt;
      &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;lt;&amp;lt;EOS&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;
# Time: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;start_time.strftime(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;%y%m%d %H:%M:%S&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;
# User@Host: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;user_host&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;
# Query_time: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;query_time&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;  Lock_time: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;lock_time&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;  Rows_sent: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;rows_sent&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;  Rows_examined: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;rows_examined&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;
&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;sql_text&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;;&lt;/span&gt;&lt;span style="color:#D14"&gt;
EOS&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style=""&gt;self&lt;/span&gt;.&lt;span style="color:#900;font-weight:bold"&gt;print_all&lt;/span&gt;
    find(&lt;span style="color:#990073"&gt;:all&lt;/span&gt;, &lt;span style="color:#990073"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span style="color:#990073"&gt;:start_time&lt;/span&gt;).each &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |query|
      puts query
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  private
  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;time_parse&lt;/span&gt; string
    hours, minutes, seconds = string.to_s.split(&lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;:&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;/span&gt;)
    hours.to_i * &lt;span style=""&gt;60&lt;/span&gt; * &lt;span style=""&gt;60&lt;/span&gt; + minutes.to_i * &lt;span style=""&gt;60&lt;/span&gt; + seconds.to_i
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#A08;font-weight:bold"&gt;ActiveRecord&lt;/span&gt;::&lt;span style="color:#A08;font-weight:bold"&gt;Base&lt;/span&gt;.establish_connection &lt;span style="color:#990073"&gt;:adapter&lt;/span&gt;  =&amp;gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;mysql&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;,
                                        &lt;span style="color:#990073"&gt;:database&lt;/span&gt; =&amp;gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;mysql&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;,
                                        &lt;span style="color:#990073"&gt;:username&lt;/span&gt; =&amp;gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;username&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;,
                                        &lt;span style="color:#990073"&gt;:password&lt;/span&gt; =&amp;gt; &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;password&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#A08;font-weight:bold"&gt;SlowLog&lt;/span&gt;.print_all
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This was written to be compatible with both activerecord 2.3 and 3.0. If compatability with 2.3 were to be dropped, the &lt;code&gt;time_parse&lt;/code&gt; hacks could be removed.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.johnhawthorn.com,2011-07-04:/2011/07/introducing-dkim-gem/</id>
    <title type="html">Introducing the dkim gem</title>
    <published>2011-07-04T07:00:00Z</published>
    <updated>2011-07-04T07:00:00Z</updated>
    <link rel="alternate" href="http://www.johnhawthorn.com/2011/07/introducing-dkim-gem/"/>
    <content type="html">&lt;p&gt;DKIM (defined in &lt;a href="http://tools.ietf.org/html/rfc4871"&gt;RFC 4871&lt;/a&gt;) is a way for email senders to claim responsibility for an email message.
It works by adding an extra header to every email sent which cryptographically signs the message&amp;#39;s headers and body.
By verifying the signature, the receiver of DKIM-signed email can be certain the emails content has been unaltered and comes from who is claimed.
By taking responsibility for these messages, the sender&amp;#39;s reputation can allow the message to be less scrutinized by spam&amp;#47;phishing filters on the receivers end.
For this reason, DKIM is desirable because is should increase deliverability.&lt;/p&gt;

&lt;p&gt;I had the need to send a large amount of email through &lt;a href="http://aws.amazon.com/ses/"&gt;Amazon SES&lt;/a&gt; from a rails application.
This was made very easy by the terrific &lt;a href="http://fog.io/"&gt;fog&lt;/a&gt; library for accessing cloud services (I would recommend version 0.8.2 or above, which includes a bug fix I submitted).
However I found no good way to DKIM sign email from ruby. There was a rubydkim gem, but it didn&amp;#39;t work correctly in my testing, and required an external C library.&lt;/p&gt;

&lt;p&gt;This prompted me to create the &lt;em&gt;&lt;a href="https://github.com/jhawthorn/dkim"&gt;dkim&lt;/a&gt;&lt;/em&gt; gem: a simple ruby library for DKIM signing email messages.
dkim depends only on ruby built with openssl support (or jruby-openssl if you&amp;#39;re using jruby).&lt;/p&gt;

&lt;p&gt;Most basic usage (which should be all that is necessary for most) is to configure the gem globally&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span style="color:#A08;font-weight:bold"&gt;Dkim&lt;/span&gt;::domain      = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;example.com&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#A08;font-weight:bold"&gt;Dkim&lt;/span&gt;::selector    = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;mail&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#A08;font-weight:bold"&gt;Dkim&lt;/span&gt;::private_key = open(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;private.pem&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;).read
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;and then to sign any messages as needed&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;a href="#n4" name="n4"&gt;4&lt;/a&gt;
&lt;a href="#n5" name="n5"&gt;5&lt;/a&gt;
&lt;a href="#n6" name="n6"&gt;6&lt;/a&gt;
&lt;a href="#n7" name="n7"&gt;7&lt;/a&gt;
&lt;a href="#n8" name="n8"&gt;8&lt;/a&gt;
&lt;a href="#n9" name="n9"&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n10" name="n10"&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n11" name="n11"&gt;11&lt;/a&gt;
&lt;a href="#n12" name="n12"&gt;12&lt;/a&gt;
&lt;a href="#n13" name="n13"&gt;13&lt;/a&gt;
&lt;a href="#n14" name="n14"&gt;14&lt;/a&gt;
&lt;a href="#n15" name="n15"&gt;15&lt;/a&gt;
&lt;a href="#n16" name="n16"&gt;16&lt;/a&gt;
&lt;a href="#n17" name="n17"&gt;17&lt;/a&gt;
&lt;a href="#n18" name="n18"&gt;18&lt;/a&gt;
&lt;a href="#n19" name="n19"&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n20" name="n20"&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;mail = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;lt;&amp;lt;eos&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;
To: someone@example.com
From: john@example.com
Subject: hi

Howdy&lt;/span&gt;&lt;span style="color:#D14"&gt;
eos&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#A08;font-weight:bold"&gt;Dkim&lt;/span&gt;.sign(mail)
&lt;span style="color:#998;font-style:italic"&gt;# =&amp;gt;&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# To: someone@example.com&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# From: john@example.com&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# Subject: hi&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; q=dns/txt; s=mail; t=1305917829;&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;#   bh=qZxwTnSM1ywsrq0Ag9UhQSOtVIG+sW5zDkB+hPbuX08=; h=from:subject:to;&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;#   b=0mKnNOkxFGiww63Zu4t46J7eZc3Uak3I9km3IH2Le3XcnSNtWJgxiwBX26IZ5yzcT&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;#   VwJzcCnPKCScIJMQ7yfbfXmNsKVIOV6eSUqu1YvJ1fgzlSAXuDEMNFTjoto5rrdA+&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;#   BgX849hEY/bWHDl1JJgNpiwtpl4t0Q7M4BVJUd7Lo=&lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# &lt;/span&gt;
&lt;span style="color:#998;font-style:italic"&gt;# Howdy&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;A more detailed explanation can be found in the project&amp;#39;s &lt;a href="https://github.com/jhawthorn/dkim/blob/master/README.md"&gt;README&lt;/a&gt; on github.&lt;/p&gt;

&lt;p&gt;I hope the library proves useful to others, and would love to hear from anyone using it.&lt;/p&gt;

&lt;h4&gt;links&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/jhawthorn/dkim"&gt;github project&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rubygems.org/gems/dkim"&gt;rubygems page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.johnhawthorn.com,2011-06-10:/2011/06/minecraft-to-irc-bridge/</id>
    <title type="html">Minecraft to IRC bridge</title>
    <published>2011-06-10T07:00:00Z</published>
    <updated>2011-06-10T07:00:00Z</updated>
    <link rel="alternate" href="http://www.johnhawthorn.com/2011/06/minecraft-to-irc-bridge/"/>
    <content type="html">&lt;p&gt;Like almost 2.5 million others, my recent productivity has taken a hit due to the game &lt;a href="http://www.minecraft.net/"&gt;Minecraft&lt;/a&gt;.
I have a home server set up to play with roommates and friends.
Funnily enough, Minecraft turned into a frequent medium of communication for us.
To take part in this when not logged into minecraft, and to get notifications to when friends were playing, I set out to make a bridge between minecraft and IRC.&lt;/p&gt;

&lt;p&gt;The result is mcirc, a simple minecraft to irc gateway. It tails the minecraft log looking for player joins quits and messages, and relays them to the IRC server. This script requires that there is a FIFO for input to the server.&lt;/p&gt;

&lt;p&gt;It is worth noting that this probably not the best minecraft &amp;lt;-&amp;gt; irc bridge which exists, but perhaps the simplest, and runs on a vanilla minecraft server. There are several which function as &lt;a href="http://bukkit.org/"&gt;bukkit&lt;/a&gt; plugins:
&lt;a href="http://forums.bukkit.org/threads/chat-irctransport-0-10-minecraft-chat-irc-integration-740.3412/"&gt;1&lt;/a&gt;
&lt;a href="http://forums.bukkit.org/threads/admn-chat-craftirc-2-0-preview-builds-now-available-minecraft-irc-harmony-818.253/"&gt;2&lt;/a&gt;
&lt;a href="http://forums.bukkit.org/threads/fun-bukkit-chat-irc-chat-without-logging-on-766.17753/"&gt;3&lt;/a&gt;
.&lt;/p&gt;

&lt;p&gt;Usage is&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;ruby irc.rb -s irc.freenode.org -c balmoralmc -f minecraft/console.pipe -l minecraft/server.log
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The script itself is very small and largely command line parsing&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;a href="#n4" name="n4"&gt;4&lt;/a&gt;
&lt;a href="#n5" name="n5"&gt;5&lt;/a&gt;
&lt;a href="#n6" name="n6"&gt;6&lt;/a&gt;
&lt;a href="#n7" name="n7"&gt;7&lt;/a&gt;
&lt;a href="#n8" name="n8"&gt;8&lt;/a&gt;
&lt;a href="#n9" name="n9"&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n10" name="n10"&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n11" name="n11"&gt;11&lt;/a&gt;
&lt;a href="#n12" name="n12"&gt;12&lt;/a&gt;
&lt;a href="#n13" name="n13"&gt;13&lt;/a&gt;
&lt;a href="#n14" name="n14"&gt;14&lt;/a&gt;
&lt;a href="#n15" name="n15"&gt;15&lt;/a&gt;
&lt;a href="#n16" name="n16"&gt;16&lt;/a&gt;
&lt;a href="#n17" name="n17"&gt;17&lt;/a&gt;
&lt;a href="#n18" name="n18"&gt;18&lt;/a&gt;
&lt;a href="#n19" name="n19"&gt;19&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n20" name="n20"&gt;20&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n21" name="n21"&gt;21&lt;/a&gt;
&lt;a href="#n22" name="n22"&gt;22&lt;/a&gt;
&lt;a href="#n23" name="n23"&gt;23&lt;/a&gt;
&lt;a href="#n24" name="n24"&gt;24&lt;/a&gt;
&lt;a href="#n25" name="n25"&gt;25&lt;/a&gt;
&lt;a href="#n26" name="n26"&gt;26&lt;/a&gt;
&lt;a href="#n27" name="n27"&gt;27&lt;/a&gt;
&lt;a href="#n28" name="n28"&gt;28&lt;/a&gt;
&lt;a href="#n29" name="n29"&gt;29&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n30" name="n30"&gt;30&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n31" name="n31"&gt;31&lt;/a&gt;
&lt;a href="#n32" name="n32"&gt;32&lt;/a&gt;
&lt;a href="#n33" name="n33"&gt;33&lt;/a&gt;
&lt;a href="#n34" name="n34"&gt;34&lt;/a&gt;
&lt;a href="#n35" name="n35"&gt;35&lt;/a&gt;
&lt;a href="#n36" name="n36"&gt;36&lt;/a&gt;
&lt;a href="#n37" name="n37"&gt;37&lt;/a&gt;
&lt;a href="#n38" name="n38"&gt;38&lt;/a&gt;
&lt;a href="#n39" name="n39"&gt;39&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n40" name="n40"&gt;40&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n41" name="n41"&gt;41&lt;/a&gt;
&lt;a href="#n42" name="n42"&gt;42&lt;/a&gt;
&lt;a href="#n43" name="n43"&gt;43&lt;/a&gt;
&lt;a href="#n44" name="n44"&gt;44&lt;/a&gt;
&lt;a href="#n45" name="n45"&gt;45&lt;/a&gt;
&lt;a href="#n46" name="n46"&gt;46&lt;/a&gt;
&lt;a href="#n47" name="n47"&gt;47&lt;/a&gt;
&lt;a href="#n48" name="n48"&gt;48&lt;/a&gt;
&lt;a href="#n49" name="n49"&gt;49&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n50" name="n50"&gt;50&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n51" name="n51"&gt;51&lt;/a&gt;
&lt;a href="#n52" name="n52"&gt;52&lt;/a&gt;
&lt;a href="#n53" name="n53"&gt;53&lt;/a&gt;
&lt;a href="#n54" name="n54"&gt;54&lt;/a&gt;
&lt;a href="#n55" name="n55"&gt;55&lt;/a&gt;
&lt;a href="#n56" name="n56"&gt;56&lt;/a&gt;
&lt;a href="#n57" name="n57"&gt;57&lt;/a&gt;
&lt;a href="#n58" name="n58"&gt;58&lt;/a&gt;
&lt;a href="#n59" name="n59"&gt;59&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n60" name="n60"&gt;60&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n61" name="n61"&gt;61&lt;/a&gt;
&lt;a href="#n62" name="n62"&gt;62&lt;/a&gt;
&lt;a href="#n63" name="n63"&gt;63&lt;/a&gt;
&lt;a href="#n64" name="n64"&gt;64&lt;/a&gt;
&lt;a href="#n65" name="n65"&gt;65&lt;/a&gt;
&lt;a href="#n66" name="n66"&gt;66&lt;/a&gt;
&lt;a href="#n67" name="n67"&gt;67&lt;/a&gt;
&lt;a href="#n68" name="n68"&gt;68&lt;/a&gt;
&lt;a href="#n69" name="n69"&gt;69&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n70" name="n70"&gt;70&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n71" name="n71"&gt;71&lt;/a&gt;
&lt;a href="#n72" name="n72"&gt;72&lt;/a&gt;
&lt;a href="#n73" name="n73"&gt;73&lt;/a&gt;
&lt;a href="#n74" name="n74"&gt;74&lt;/a&gt;
&lt;a href="#n75" name="n75"&gt;75&lt;/a&gt;
&lt;a href="#n76" name="n76"&gt;76&lt;/a&gt;
&lt;a href="#n77" name="n77"&gt;77&lt;/a&gt;
&lt;a href="#n78" name="n78"&gt;78&lt;/a&gt;
&lt;a href="#n79" name="n79"&gt;79&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n80" name="n80"&gt;80&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n81" name="n81"&gt;81&lt;/a&gt;
&lt;a href="#n82" name="n82"&gt;82&lt;/a&gt;
&lt;a href="#n83" name="n83"&gt;83&lt;/a&gt;
&lt;a href="#n84" name="n84"&gt;84&lt;/a&gt;
&lt;a href="#n85" name="n85"&gt;85&lt;/a&gt;
&lt;a href="#n86" name="n86"&gt;86&lt;/a&gt;
&lt;a href="#n87" name="n87"&gt;87&lt;/a&gt;
&lt;a href="#n88" name="n88"&gt;88&lt;/a&gt;
&lt;a href="#n89" name="n89"&gt;89&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n90" name="n90"&gt;90&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n91" name="n91"&gt;91&lt;/a&gt;
&lt;a href="#n92" name="n92"&gt;92&lt;/a&gt;
&lt;a href="#n93" name="n93"&gt;93&lt;/a&gt;
&lt;a href="#n94" name="n94"&gt;94&lt;/a&gt;
&lt;a href="#n95" name="n95"&gt;95&lt;/a&gt;
&lt;a href="#n96" name="n96"&gt;96&lt;/a&gt;
&lt;a href="#n97" name="n97"&gt;97&lt;/a&gt;
&lt;a href="#n98" name="n98"&gt;98&lt;/a&gt;
&lt;a href="#n99" name="n99"&gt;99&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n100" name="n100"&gt;100&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n101" name="n101"&gt;101&lt;/a&gt;
&lt;a href="#n102" name="n102"&gt;102&lt;/a&gt;
&lt;a href="#n103" name="n103"&gt;103&lt;/a&gt;
&lt;a href="#n104" name="n104"&gt;104&lt;/a&gt;
&lt;a href="#n105" name="n105"&gt;105&lt;/a&gt;
&lt;a href="#n106" name="n106"&gt;106&lt;/a&gt;
&lt;a href="#n107" name="n107"&gt;107&lt;/a&gt;
&lt;a href="#n108" name="n108"&gt;108&lt;/a&gt;
&lt;a href="#n109" name="n109"&gt;109&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n110" name="n110"&gt;110&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n111" name="n111"&gt;111&lt;/a&gt;
&lt;a href="#n112" name="n112"&gt;112&lt;/a&gt;
&lt;a href="#n113" name="n113"&gt;113&lt;/a&gt;
&lt;a href="#n114" name="n114"&gt;114&lt;/a&gt;
&lt;a href="#n115" name="n115"&gt;115&lt;/a&gt;
&lt;a href="#n116" name="n116"&gt;116&lt;/a&gt;
&lt;a href="#n117" name="n117"&gt;117&lt;/a&gt;
&lt;a href="#n118" name="n118"&gt;118&lt;/a&gt;
&lt;a href="#n119" name="n119"&gt;119&lt;/a&gt;
&lt;strong&gt;&lt;a href="#n120" name="n120"&gt;120&lt;/a&gt;&lt;/strong&gt;
&lt;a href="#n121" name="n121"&gt;121&lt;/a&gt;
&lt;a href="#n122" name="n122"&gt;122&lt;/a&gt;
&lt;a href="#n123" name="n123"&gt;123&lt;/a&gt;
&lt;a href="#n124" name="n124"&gt;124&lt;/a&gt;
&lt;a href="#n125" name="n125"&gt;125&lt;/a&gt;
&lt;a href="#n126" name="n126"&gt;126&lt;/a&gt;
&lt;a href="#n127" name="n127"&gt;127&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;
&lt;span style="color:#34b"&gt;#!/usr/bin/env ruby&lt;/span&gt;

require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;socket&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;uri&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#458;font-weight:bold"&gt;MinecraftIrcBot&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;initialize&lt;/span&gt;(options)
    uri = &lt;span style="color:#A08;font-weight:bold"&gt;URI&lt;/span&gt;.parse(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;irc://&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;options[&lt;span style="color:#990073"&gt;:server&lt;/span&gt;]&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    &lt;span style="color:teal"&gt;@channel&lt;/span&gt; = options[&lt;span style="color:#990073"&gt;:channel&lt;/span&gt;]
    &lt;span style="color:teal"&gt;@socket&lt;/span&gt; = &lt;span style="color:#A08;font-weight:bold"&gt;TCPSocket&lt;/span&gt;.open(uri.host, uri.port || &lt;span style=""&gt;6667&lt;/span&gt;)
    &lt;span style="color:teal"&gt;@mclog&lt;/span&gt; = &lt;span style="color:#A08;font-weight:bold"&gt;IO&lt;/span&gt;.popen(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;tail -f -n0 '&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;options[&lt;span style="color:#990073"&gt;:log&lt;/span&gt;]&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;r&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    &lt;span style="color:teal"&gt;@name&lt;/span&gt; = options[&lt;span style="color:#990073"&gt;:name&lt;/span&gt;]
    &lt;span style="color:teal"&gt;@pipe&lt;/span&gt; = options[&lt;span style="color:#990073"&gt;:pipe&lt;/span&gt;]
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;NICK &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@name&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;USER &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@name&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; 0 * &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@name&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;JOIN #&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@channel&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;say&lt;/span&gt;(msg)
    puts msg
    &lt;span style="color:teal"&gt;@socket&lt;/span&gt;.puts msg
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;say_to_chan&lt;/span&gt;(msg)
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;PRIVMSG #&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@channel&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; :&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;msg&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;say_to_minecraft&lt;/span&gt;(msg)
    msg = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;say &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;msg&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts msg

    &lt;span style="color:#A08;font-weight:bold"&gt;File&lt;/span&gt;.open(&lt;span style="color:teal"&gt;@pipe&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;w&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |console|
      console.puts msg
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;run&lt;/span&gt;
    loop &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt;
      read, write, error = &lt;span style="color:#A08;font-weight:bold"&gt;IO&lt;/span&gt;.select([&lt;span style="color:teal"&gt;@socket&lt;/span&gt;, &lt;span style="color:teal"&gt;@mclog&lt;/span&gt;])
      &lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; read.include? &lt;span style="color:teal"&gt;@socket&lt;/span&gt;
        msg = &lt;span style="color:teal"&gt;@socket&lt;/span&gt;.gets

        &lt;span style="color:#998;font-style:italic"&gt;# connection lost&lt;/span&gt;
        &lt;span style="color:#000;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;unless&lt;/span&gt; msg

        &lt;span style="color:#000;font-weight:bold"&gt;case&lt;/span&gt; msg.strip
        &lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^PING :(.+)$&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;i&lt;/span&gt;&lt;/span&gt;
          say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;PONG &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^:(.+?)!.+?@.+?&lt;/span&gt;&lt;span style="color:#04D"&gt;\s&lt;/span&gt;&lt;span style="color:#808"&gt;PRIVMSG&lt;/span&gt;&lt;span style="color:#04D"&gt;\s&lt;/span&gt;&lt;span style="color:#808"&gt;.+?&lt;/span&gt;&lt;span style="color:#04D"&gt;\s&lt;/span&gt;&lt;span style="color:#808"&gt;:(.+)$&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;i&lt;/span&gt;&lt;/span&gt;
          say_to_minecraft(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$2&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
      &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

      &lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; read.include? &lt;span style="color:teal"&gt;@mclog&lt;/span&gt;
        msg = &lt;span style="color:teal"&gt;@mclog&lt;/span&gt;.gets
        msg.gsub!(&lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{4}-&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{2}-&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{2} &lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{2}:&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{2}:&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;{2} &lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;)
        &lt;span style="color:#000;font-weight:bold"&gt;case&lt;/span&gt; msg.strip
        &lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^&lt;/span&gt;&lt;span style="color:#04D"&gt;\[&lt;/span&gt;&lt;span style="color:#808"&gt;INFO&lt;/span&gt;&lt;span style="color:#04D"&gt;\]&lt;/span&gt;&lt;span style="color:#808"&gt; ([a-z0-9]*) lost connection&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;i&lt;/span&gt;&lt;/span&gt;
          say_to_chan(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; has left&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        &lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^&lt;/span&gt;&lt;span style="color:#04D"&gt;\[&lt;/span&gt;&lt;span style="color:#808"&gt;INFO&lt;/span&gt;&lt;span style="color:#04D"&gt;\]&lt;/span&gt;&lt;span style="color:#808"&gt; ([a-z0-9]*) &lt;/span&gt;&lt;span style="color:#04D"&gt;\[&lt;/span&gt;&lt;span style="color:#808"&gt;[^&lt;/span&gt;&lt;span style="color:#04D"&gt;\]&lt;/span&gt;&lt;span style="color:#808"&gt;]*&lt;/span&gt;&lt;span style="color:#04D"&gt;\]&lt;/span&gt;&lt;span style="color:#808"&gt; logged in&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;i&lt;/span&gt;&lt;/span&gt;
          say_to_chan(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; has joined&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        &lt;span style="color:#000;font-weight:bold"&gt;when&lt;/span&gt; &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#808"&gt;^&lt;/span&gt;&lt;span style="color:#04D"&gt;\[&lt;/span&gt;&lt;span style="color:#808"&gt;INFO&lt;/span&gt;&lt;span style="color:#04D"&gt;\]&lt;/span&gt;&lt;span style="color:#808"&gt; &amp;lt;([a-z0-9]*)&amp;gt; (.*)$&lt;/span&gt;&lt;span style="color:#404"&gt;/&lt;/span&gt;&lt;span style="color:#C2C"&gt;i&lt;/span&gt;&lt;/span&gt;
          say_to_chan(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$2&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
      &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

  &lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;quit&lt;/span&gt;
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;PART #&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal"&gt;@channel&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; :bye bye&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    say &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;QUIT&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;


&lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;parse&lt;/span&gt;
  require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;optparse&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
  options = {}
  optparse = &lt;span style="color:#A08;font-weight:bold"&gt;OptionParser&lt;/span&gt;.new &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |opts|
    opts.banner = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;Usage: &lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$0&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt; options&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

    opts.on(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;-s&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;--server SERVER&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;IRC server&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |v|
      options[&lt;span style="color:#990073"&gt;:server&lt;/span&gt;] = v
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
    opts.on(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;-c&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;--channel CHAN&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;IRC channel&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |v|
      options[&lt;span style="color:#990073"&gt;:channel&lt;/span&gt;] = v
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
    opts.on(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;-f&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;--fifo FIFO&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;named pipe into minecraft server's console&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |v|
      options[&lt;span style="color:#990073"&gt;:pipe&lt;/span&gt;] = v
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
    opts.on(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;-l&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;--log LOG&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;minecraft servers's log file for reading&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |v|
      options[&lt;span style="color:#990073"&gt;:log&lt;/span&gt;] = v
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

    options[&lt;span style="color:#990073"&gt;:name&lt;/span&gt;] = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;mcirc&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    opts.on(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;-n&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;--name NAME&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;name of the irc user&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |v|
      options[&lt;span style="color:#990073"&gt;:name&lt;/span&gt;] = v
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;begin&lt;/span&gt;
    optparse.parse!

    required = [&lt;span style="color:#990073"&gt;:server&lt;/span&gt;, &lt;span style="color:#990073"&gt;:channel&lt;/span&gt;, &lt;span style="color:#990073"&gt;:pipe&lt;/span&gt;, &lt;span style="color:#990073"&gt;:log&lt;/span&gt;]
    required.each &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |arg|
      raise &lt;span style="color:#A08;font-weight:bold"&gt;OptionParser&lt;/span&gt;::&lt;span style="color:#A08;font-weight:bold"&gt;MissingArgument&lt;/span&gt;, arg &lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; options[arg].nil?
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;rescue&lt;/span&gt; &lt;span style="color:#A08;font-weight:bold"&gt;OptionParser&lt;/span&gt;::&lt;span style="color:#A08;font-weight:bold"&gt;InvalidOption&lt;/span&gt;, &lt;span style="color:#A08;font-weight:bold"&gt;OptionParser&lt;/span&gt;::&lt;span style="color:#A08;font-weight:bold"&gt;MissingArgument&lt;/span&gt;
    puts &lt;span style="color:teal;font-weight:bold"&gt;$!&lt;/span&gt;.to_s
    puts optparse
    exit &lt;span style=""&gt;1&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  options
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

&lt;span style="color:#000;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#900;font-weight:bold"&gt;run&lt;/span&gt;
  options = parse
  bot = &lt;span style="color:#A08;font-weight:bold"&gt;MinecraftIrcBot&lt;/span&gt;.new(options)

  trap(&lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;INT&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;){ bot.quit }

  bot.run
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;

run


&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.johnhawthorn.com,2011-06-10:/2011/06/switching-to-nanoc-from-jekyll/</id>
    <title type="html">Switching from Jekyll to nanoc</title>
    <published>2011-06-10T07:00:00Z</published>
    <updated>2011-06-10T07:00:00Z</updated>
    <link rel="alternate" href="http://www.johnhawthorn.com/2011/06/switching-to-nanoc-from-jekyll/"/>
    <content type="html">&lt;p&gt;Apologies to anyone who reads my &lt;a href="http://www.johnhawthorn.com/atom.xml"&gt;atom feed&lt;/a&gt; in their reader of choice. I switched this blog from &lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; to &lt;a href="http://nanoc.stoneship.org/"&gt;nanoc&lt;/a&gt; over the weekend which caused my old posts to show up as new.&lt;/p&gt;

&lt;p&gt;When I started this blog in 2009 I decided on Jekyll, a static site generator.
Jekyll is perhaps best known for powering &lt;a href="http://pages.github.com/"&gt;Github Pages&lt;/a&gt;, a simple way to get a site at yourname.github.com.
Due to a couple small differences, I&amp;#39;ve grown to prefer nanoc, and decided to switch this blog.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m certainly not the first to convert their site from Jekyll to nanoc. It was pretty straightforward, as both programs are fairly similar.
However, some rules I used made nanoc more closely emulate Jekyll.&lt;/p&gt;

&lt;p&gt;nanoc has a &lt;a href="http://nanoc.stoneship.org/docs/api/3.1/Nanoc3/Helpers/Blogging.html"&gt;blogging helper&lt;/a&gt;, which provides similar functionality to Jekyll&amp;#39;s post handling.
Unlike Jekyll, which keeps posts in &lt;code&gt;&amp;#47;_posts&lt;/code&gt;, blogging helper considers any item with a &lt;code&gt;:kind&lt;/code&gt; of &lt;code&gt;article&lt;/code&gt; to be a post.
Jekyll also determines an articles&amp;#39; creation time from its title.
I created the following preprocess rule to make nanoc act like Jekyll in that regard.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;a href="#n4" name="n4"&gt;4&lt;/a&gt;
&lt;a href="#n5" name="n5"&gt;5&lt;/a&gt;
&lt;a href="#n6" name="n6"&gt;6&lt;/a&gt;
&lt;a href="#n7" name="n7"&gt;7&lt;/a&gt;
&lt;a href="#n8" name="n8"&gt;8&lt;/a&gt;
&lt;a href="#n9" name="n9"&gt;9&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;time&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
preprocess &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt;
  items.each &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |item|
    &lt;span style="color:#000;font-weight:bold"&gt;if&lt;/span&gt; item.identifier =~ &lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;%r{&lt;/span&gt;&lt;span style="color:#808"&gt;^/articles/(.*)$&lt;/span&gt;&lt;span style="color:#404"&gt;}&lt;/span&gt;&lt;/span&gt;
      item[&lt;span style="color:#990073"&gt;:created_at&lt;/span&gt;] = &lt;span style="color:#A08;font-weight:bold"&gt;Time&lt;/span&gt;.parse(&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;)
      item[&lt;span style="color:#990073"&gt;:kind&lt;/span&gt;] = &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;span style="color:#D14"&gt;article&lt;/span&gt;&lt;span style="color:#D14"&gt;'&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
  &lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The other rule was for the routes of articles, for which I used this regex to make articles go in the same location as Jekyll posts.
There&amp;#39;s probably a cleaner solution, and the regex might need adjustment for others&amp;#39; use of Jekyll, but this worked quite well for me.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;&lt;a href="#n1" name="n1"&gt;1&lt;/a&gt;
&lt;a href="#n2" name="n2"&gt;2&lt;/a&gt;
&lt;a href="#n3" name="n3"&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;item.identifier.gsub(&lt;span style="background-color:#fff0ff"&gt;&lt;span style="color:#404"&gt;%r{&lt;/span&gt;&lt;span style="color:#808"&gt;^/articles/(&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;+)-(&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;+)-&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;+_&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;+-&lt;/span&gt;&lt;span style="color:#04D"&gt;\d&lt;/span&gt;&lt;span style="color:#808"&gt;+-(.*)$&lt;/span&gt;&lt;span style="color:#404"&gt;}&lt;/span&gt;&lt;/span&gt;) &lt;span style="color:#000;font-weight:bold"&gt;do&lt;/span&gt; |match|
  &lt;span style="color:#D20"&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#D14"&gt;/&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$1&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;/&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$2&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;/&lt;/span&gt;&lt;span style="color:black"&gt;&lt;span style="color:#D14"&gt;#{&lt;/span&gt;&lt;span style="color:teal;font-weight:bold"&gt;$3&lt;/span&gt;&lt;span style="color:#D14"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#D14"&gt;/index.html&lt;/span&gt;&lt;span style="color:#D14"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:#000;font-weight:bold"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;With these changes I was able to use all of my Jekyll posts in nanoc without modification.&lt;/p&gt;
</content>
  </entry>
</feed>

