<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>hocuspokus.net</title>
 <link href="http://hocuspokus.net/atom.xml" rel="self"/>
 <link href="http://hocuspokus.net/"/>
 <updated>2012-05-18T10:59:49+01:00</updated>
 <id>http://hocuspokus.net</id>
 <author>
   <name>Darren Oakley</name>
 </author>

 
 <entry>
   <title>Copy/Paste Highlighted Code with Vim</title>
   
   <link href="http://hocuspokus.net/2012/03/copy-paste-highlighted-code-with-vim"/>
   }
   <updated>2012-03-27T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2012/03/copy-paste-highlighted-code-with-vim</id>
   <content type="html">
     &lt;p&gt;So, I&amp;rsquo;m preparing a presentation to give at work for one of our &amp;ldquo;brown bag&amp;rdquo; /
&amp;ldquo;learning lunch&amp;rdquo; sessions and I want to put in some code into my slides&amp;hellip;&lt;/p&gt;

&lt;p&gt;When I used to use TextMate, I used the very cool &lt;a href=&quot;https://github.com/drnic/copy-as-rtf-tmbundle&quot;&gt;copy as RTF
bundle&lt;/a&gt;, for such tasks.&lt;/p&gt;

&lt;p&gt;But now I&amp;rsquo;m a Vim head, here&amp;rsquo;s how to do the same in Vim&amp;hellip;&lt;/p&gt;

&lt;p&gt;First, install the
&lt;a href=&quot;http://www.andre-simon.de/doku/highlight/en/highlight.html&quot;&gt;highlight&lt;/a&gt; library
(&lt;code&gt;brew install highlight&lt;/code&gt; on the mac), then install the &lt;a href=&quot;https://github.com/dharanasoft/rtf-highlight&quot;&gt;rtf-highlight Vim
plugin&lt;/a&gt;&lt;sup&gt;*&lt;/sup&gt; &amp;ndash; I
recommend &lt;a href=&quot;https://github.com/gmarik/vundle&quot;&gt;vundle&lt;/a&gt; to manage your plugins.&lt;/p&gt;

&lt;p&gt;Now all you have to do is run the command &lt;code&gt;:RTFHighlight &amp;lt;language&amp;gt;&lt;/code&gt; and the
contents of your current buffer (or text selection) will be added to your
clipboard as glorious syntax highlighted rich text, ready to paste into
keynote etc! :)&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; You may need to apply the changes from this
&lt;a href=&quot;https://github.com/dharanasoft/rtf-highlight/pull/1&quot;&gt;pull request&lt;/a&gt; to the Vim
plugin to get it to work with more recent versions of the highlight library.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Brakeman</title>
   
   <link href="http://brakemanscanner.org/"/>
   }
   <updated>2012-03-07T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2012/03/brakeman</id>
   <content type="html">
     &lt;blockquote&gt;&lt;p&gt;Brakeman is an open source vulnerability scanner specifically designed for
Ruby on Rails applications. It statically analyses Rails application code
to find security issues at any stage of development.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Following &lt;a href=&quot;https://github.com/blog/1068-public-key-security-vulnerability-and-mitigation&quot;&gt;this weekends Github hacking fiasco&lt;/a&gt;
we&amp;rsquo;ve started running &lt;a href=&quot;http://brakemanscanner.org/&quot;&gt;brakeman&lt;/a&gt; as part of our
builds at work.  Turned up some interesting things thus far &amp;ndash; highly
recommended!!!&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s also a &lt;a href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Brakeman+Plugin&quot;&gt;Jenkins plugin&lt;/a&gt;
available to get nice graphs showing trends over time on your build pages &amp;ndash; so
go set that up too if you use Jenkins.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Brakeman'&quot; href=&quot;http://hocuspokus.net/2012/03/brakeman&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Easily Install Microsoft Internet Explorer Virtual Machines</title>
   
   <link href="https://github.com/xdissent/ievms"/>
   }
   <updated>2012-02-10T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2012/02/easily-install-microsoft-internet-explorer-virtual-machines</id>
   <content type="html">
     &lt;p&gt;One of the guys at work found this yesterday &amp;ndash; a nice automated install script
to install the official Microsoft Internet Explorer testing virtual machines
in Virtual Box on Mac OS X or Linux.&lt;/p&gt;

&lt;p&gt;A geat tool for getting up and running to do IE testing!&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Easily Install Microsoft Internet Explorer Virtual Machines'&quot; href=&quot;http://hocuspokus.net/2012/02/easily-install-microsoft-internet-explorer-virtual-machines&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>When Using Apache As A Reverse Proxy To Passenger...</title>
   
   <link href="http://hocuspokus.net/2012/01/when-using-apache-as-a-reverse-proxy-to-passenger"/>
   }
   <updated>2012-01-31T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2012/01/when-using-apache-as-a-reverse-proxy-to-passenger</id>
   <content type="html">
     &lt;p&gt;&lt;strong&gt;ALWAYS&lt;/strong&gt; remember to set:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&lt;span class=&quot;nb&quot;&gt;ProxyPreserveHost&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Especially&lt;/strong&gt; if you&amp;rsquo;re using the hostname to allow nginx to decide which
passenger app to run &amp;ndash; that was a few hours of my life wasted yesterday
because of this&amp;hellip;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Regexp Find and Replace in Ruby's gsub</title>
   
   <link href="http://hocuspokus.net/2012/01/regexp-find-and-replace-in-rubys-gsub"/>
   }
   <updated>2012-01-31T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2012/01/regexp-find-and-replace-in-rubys-gsub</id>
   <content type="html">
     &lt;p&gt;So I found this little trick quite useful the yesterday&amp;hellip;&lt;/p&gt;

&lt;p&gt;If you want to use a regular expression matched variable to find and replace
sections of text in a string more intelligently (I used to do this all the
time in Perl, hence why I was looking for a Ruby equivalent) you can!&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a rather contrived example but it gets the message accross.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;button&amp;quot;&amp;gt;click me&amp;lt;/a&amp;gt;&amp;lt;span class=&amp;quot;weee&amp;quot;&amp;gt;weee&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;button&amp;quot;&amp;gt;click me&amp;lt;/a&amp;gt;&amp;lt;span class=&amp;quot;weee&amp;quot;&amp;gt;weee&amp;lt;/span&amp;gt;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gsub!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/class=&amp;quot;(.+)&amp;quot;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;data-class=&amp;quot;\1&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;lt;a href=&amp;quot;#&amp;quot; data-class=&amp;quot;button&amp;quot;&amp;gt;click me&amp;lt;/a&amp;gt;&amp;lt;span data-class=&amp;quot;weee&amp;quot;&amp;gt;weee&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The Perl equivalent to &lt;code&gt;\1&lt;/code&gt; would be the &lt;code&gt;$1&lt;/code&gt; matched variable&amp;hellip;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Sinon.js</title>
   
   <link href="http://sinonjs.org/"/>
   }
   <updated>2011-12-21T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2011/12/sinon-js</id>
   <content type="html">
     &lt;blockquote&gt;&lt;p&gt;Standalone test spies, stubs and mocks for JavaScript. No dependencies, works with any unit testing framework.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Been using this at work lately in conjunction with &lt;a href=&quot;https://github.com/jquery/qunit&quot;&gt;QUnit&lt;/a&gt; &amp;ndash; most useful!&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Sinon.js'&quot; href=&quot;http://hocuspokus.net/2011/12/sinon-js&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>The Black Art of BioMart: Ontology Searching</title>
   
   <link href="http://hocuspokus.net/2011/04/the-black-art-of-biomart-ontology-searching"/>
   }
   <updated>2011-04-19T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2011/04/the-black-art-of-biomart-ontology-searching</id>
   <content type="html">
     &lt;p&gt;We use &lt;a href=&quot;http://www.biomart.org&quot;&gt;BioMart&lt;/a&gt; a &lt;strong&gt;lot&lt;/strong&gt; at my workplace, and one of the recent things I was tasked with
doing was adding full ontology searching to one of our datasets &amp;ndash; to be specific, MP ontology searching over some
MP annotated phenotyping data.  The desired functionality is so that a user can come in with an MP ID and retrieve
any phenotyping data that has been annotated to that ID, or one of it&amp;rsquo;s children in the MP tree.&lt;/p&gt;

&lt;p&gt;Time for a small disclaimer&amp;hellip; ;&amp;ndash;)&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not the first person to do this kind of stuff, it&amp;rsquo;s been about for a long time (GO searching has been in the
Ensembl mart as long as I can remember), but i&amp;rsquo;ve never seen anyone write down how you do it.  Also, please note
that this info is for &lt;strong&gt;BioMart version 0.7&lt;/strong&gt; &amp;ndash; the configuration mechanisms in the new 0.8 series are quite
different (and i&amp;rsquo;ve not had a proper chance to play with 0.8 yet).&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve tried to document as much as I can but obviously when it comes to the XML examples
you&amp;rsquo;ll have to take my code as a guide and apply the same principles to your datasets in MartEditor.  Here we go&amp;hellip;&lt;/p&gt;

&lt;p&gt;The process boils down into the following tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set-up and configure an ontology dataset

&lt;ul&gt;
&lt;li&gt;Create the (mp_ontology) staging table&lt;/li&gt;
&lt;li&gt;Populate the staging table with the required data&lt;/li&gt;
&lt;li&gt;Configure the (mp_ontology) dataset&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure to our target dataset to use the ontology dataset&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;The Ontology Dataset&lt;/h2&gt;

&lt;p&gt;In order to enable full ontology searching, you must have a separate ontology dataset so that your target dataset
(in my case the phenotyping data) can point into it.  It&amp;rsquo;s a relatively simple single table BioMart dataset&amp;hellip;&lt;/p&gt;

&lt;h3&gt;The Ontology Staging Table&lt;/h3&gt;

&lt;p&gt;The staging table for the ontology dataset takes the following form:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;mysql&amp;gt; describe mp_ontology;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| parent_id   | varchar(50)  | NO   | PRI | NULL    |       |
| parent_term | varchar(255) | NO   |     | NULL    |       |
| child_id    | varchar(50)  | NO   | PRI | NULL    |       |
| child_term  | varchar(255) | NO   |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Basically you fill it with mapping data for each parent ontology term.  The data for each parent ID should include
a mapping to itself, and &lt;strong&gt;all&lt;/strong&gt; children below it e.g. for the root MP:00000001 there should be row where the child ID
is also MP:00000001 and then rows for every single other MP term.  It&amp;rsquo;s all a bit redundant, but this is what allows
the mart to do the full ontology tree filtering.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a little script I knocked together to create and populate the mp_ontology table, it&amp;rsquo;s written in ruby, and uses
the &lt;a href=&quot;https://rubygems.org/gems/ols&quot;&gt;ols&lt;/a&gt; gem to get the ontology terms and ID&amp;rsquo;s (&lt;strong&gt;NOTE:&lt;/strong&gt; you&amp;rsquo;ll need a local copy
of the &lt;a href=&quot;http://www.ebi.ac.uk/ontology-lookup/&quot;&gt;OLS&lt;/a&gt; database in order to use this script &amp;ndash; more details are in the
&lt;a href=&quot;http://rubydoc.info/gems/ols/0.0.1/frames&quot;&gt;gem documentation&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;logger&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;optparse&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ols&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;sequel&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mysql2&amp;#39;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Set the script options&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;STDOUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;level&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;INFO&lt;/span&gt;
&lt;span class=&quot;vi&quot;&gt;@debug&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;vi&quot;&gt;@root_term&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;OptionParser&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;banner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Usage: build_ontology_table.rb [options]&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-d&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--debug&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Show debug output&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@debug&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-t&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--table TABLE_NAME&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;The table to create&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;       &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_sym&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-r&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--root_term ROOT_TERM&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;The ontology root term&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@root_term&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;term&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_tail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-h&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--help&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Display help&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse!&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;You must define a --table to insert into!&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nil?&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;You must define a --root_term!&amp;quot;&lt;/span&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@root_term&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nil?&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Connect to the BioMart database&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Connecting to BioMart staging database&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Sequel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:adapter&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mysql2&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:host&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:port&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3306&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:database&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mart_staging&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:user&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mart&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mart&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:test&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loggers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@debug&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Now get on with stuff...&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Creating table &amp;#39;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;#39; in staging database&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;drop_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;rescue&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create_table&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:parent_term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:child_term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;primary_key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;insert_self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:parent_term&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:child_term&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term_name&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;insert_children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;terms&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all_child_terms&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;term_names&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all_child_names&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each_index&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
      &lt;span class=&quot;no&quot;&gt;BIOMART_DB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@table_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;ss&quot;&gt;:parent_id&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;ss&quot;&gt;:parent_term&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;term_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;ss&quot;&gt;:child_id&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;ss&quot;&gt;:child_term&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;term_names&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;ont&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;insert_self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;child&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;insert_children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;child&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;has_children?&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Getting root term and building ontology tree&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;OLS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;OntologyTerm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@root_term&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;build_tree&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Loading terms to staging table&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;insert_self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;insert_children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Done. :)&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You run the script with the following options (just be warned, it takes a while for a large ontology):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;ruby build_ontology_table.rb --table mp_ontology --root_term MP:0000001 --debug
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;h3&gt;Configuring the Ontology Dataset&lt;/h3&gt;

&lt;p&gt;Now that we have our ontology staging table, run through the normal MartBuilder process to setup and
generate the SQL for creating your new mp_ontology dataset.  (If you want to make the searches a touch more
efficient, add indexes on the parent_id and parent_term fields whilst in MartBuilder).  Before moving on
run the build SQL to generate your dataset tables.  Now, onto MartEditor.&lt;/p&gt;

&lt;p&gt;In MartEditor we need to do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set-up filters for the parent_id and parent_term fields&lt;/li&gt;
&lt;li&gt;Set-up an attribute for the child_id field&lt;/li&gt;
&lt;li&gt;Set-up an exportable on the child_id attribute&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Here&amp;rsquo;s my MartEditor XML (i&amp;rsquo;ll let you change the specific details for your means or click this through in
MartEditor):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE DatasetConfig&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;DatasetConfig&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dataset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;datasetID=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;13&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Mammalian Phenotype (MP) Ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;hideDisplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;interfaces=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;martUsers=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;modified=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;2011-04-19 10:06:02&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;softwareVersion=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;0.6&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;template=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;TableSet&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;visible=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;MainTable&amp;gt;&lt;/span&gt;mp_ontology__mp_ontology__main&lt;span class=&quot;nt&quot;&gt;&amp;lt;/MainTable&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;Key&amp;gt;&lt;/span&gt;child_id_2010_key&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Key&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;Exportable&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;attributes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;linkName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterPage&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;FILTERS&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;filters&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterGroup&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;FILTERS&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;filters&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterCollection&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayType=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id_display&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;legal_qualifiers=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;qualifier=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP Term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayType=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_term_2010&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;legal_qualifiers=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;qualifier=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterCollection&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterGroup&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterPage&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributePage&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;ATTRIBUTES&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;attributes&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;outFormats=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;html,txt,csv,tsv,xls&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeGroup&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;FEATURES&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;features&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeCollection&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Parent ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxLength=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;255&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Parent Term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_term_2010&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;parent_mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxLength=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;255&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Child ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxLength=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;255&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;AttributeDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Child Term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_term_2010&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;child_id_2010_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxLength=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;255&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/AttributeCollection&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/AttributeGroup&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/AttributePage&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/DatasetConfig&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The &lt;strong&gt;main&lt;/strong&gt; gist of it is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The filters are called:

&lt;ul&gt;
&lt;li&gt;mp_id_display &amp;ndash; this filters on the parent MP ID (&lt;strong&gt;NOTE:&lt;/strong&gt; the &amp;lsquo;_display&amp;rsquo; in the name is important &amp;ndash; it&amp;rsquo;s to stop a name clash later on)&lt;/li&gt;
&lt;li&gt;mp_term &amp;ndash; this filters on the parent MP Term&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The important attribute is:

&lt;ul&gt;
&lt;li&gt;child_mp_id &amp;ndash; this returns on the Child MP ID&amp;rsquo;s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The exportable:

&lt;ul&gt;
&lt;li&gt;is called mp_id&lt;/li&gt;
&lt;li&gt;points at the child_mp_id attribute&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That&amp;rsquo;s the mp_ontology dataset configured we now need to configure our target dataset&amp;hellip;&lt;/p&gt;

&lt;h2&gt;Configuring Our Target Dataset&lt;/h2&gt;

&lt;p&gt;The final step now is to configure the target dataset to use the ontology dataset for its ontology searches.
So, what needs to be done is the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a hidden filter on the mp_id field that is already present in your dataset&lt;/li&gt;
&lt;li&gt;Add an importable on tthis mp_id field &amp;ndash; this will link it to the exportable in the ontology dataset&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;pointer&lt;/strong&gt; filters to the mp_id_display and mp_term filters from the mp_ontology dataset&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;First up, the hidden filter&amp;hellip;  when I setup my example I created this in it&amp;rsquo;s own &amp;lsquo;FilterPage&amp;rsquo; to separate from
everything else in my config, (just in case I screwed things up) here&amp;rsquo;s the XML:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterPage&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;hideDisplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterGroup&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;hideDisplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterCollection&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;hideDisplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_id&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayType=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;hideDisplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;id_1024_key&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;legal_qualifiers=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;qualifier=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;=&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;phenotyping__param_level_heatmap__dm&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterCollection&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterGroup&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then the importable:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Importable&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;filters=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;linkName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And finally the two pointer filters:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterCollection&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_id_display&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_id_display&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerDataset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerFilter=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_id_display&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerInterface=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;phenotyping__&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterCollection&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterCollection&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP Term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_term&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;FilterDescription&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;displayName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;MP Term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;internalName=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;param_level_heatmap_mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerDataset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_ontology&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerFilter=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;mp_term&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointerInterface=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tableConstraint=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;phenotyping__&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/FilterCollection&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And that&amp;rsquo;s it &amp;ndash; we now have MP searching! :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Jack Daniel's Sauce</title>
   
   <link href="http://hocuspokus.net/2011/03/jack-daniels-sauce"/>
   }
   <updated>2011-03-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2011/03/jack-daniels-sauce</id>
   <content type="html">
     &lt;p&gt;It feels like this is turning into a food blog&amp;hellip; lol!&lt;/p&gt;

&lt;p&gt;Anyways, I&amp;rsquo;ve been wanting to make a Jack Daniel&amp;rsquo;s sauce for a long while, and after a bit
of research on the interwebs and a little experimentation I settled on this simple recipe.
It tastes fantastic as a dipping sauce or glaze with chicken, steak, shrimp and chips!&lt;/p&gt;

&lt;h4&gt;Ingredients&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;1/3 cup red onions, diced&lt;/li&gt;
&lt;li&gt;&amp;frac14; tsp garlic, crushed&lt;/li&gt;
&lt;li&gt;&amp;frac12; cup water&lt;/li&gt;
&lt;li&gt;&amp;frac12; cup molasses&lt;/li&gt;
&lt;li&gt;1/3 cup teriyaki marinade&lt;/li&gt;
&lt;li&gt;1/3 cup pineapple juice&lt;/li&gt;
&lt;li&gt;&amp;frac12; cup jack daniel&amp;rsquo;s whisky&lt;/li&gt;
&lt;li&gt;&amp;frac12; tsp tabasco sauce&lt;/li&gt;
&lt;li&gt;3 tsp cornflour mixed with 3 tsp water&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Directions&lt;/h4&gt;

&lt;p&gt;In a thick bottomed saucepan, gently fry the onions and garlic in a little olive oil until
the onions start to soften.&lt;/p&gt;

&lt;p&gt;Now add the rest of the ingredients except the cornflour mixture. Bring to the boil and
gently simmer.&lt;/p&gt;

&lt;p&gt;After about 35 minutes slowly add the cornflour mixture stirring constantly until the
correct consistency is reached.&lt;/p&gt;

&lt;p&gt;Use straight away whilst warm or you can keep it in a clean jam jar (or something like)
in the fridge for a while.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>IE6 Countdown</title>
   
   <link href="http://www.ie6countdown.com/"/>
   }
   <updated>2011-03-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2011/03/ie6-countdown</id>
   <content type="html">
     &lt;blockquote&gt;&lt;p&gt;10 years ago a browser was born. Its name was Internet Explorer 6. Now that we’re in 2011, in an era of modern web standards, it’s time to say goodbye.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;MS, I salute you.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'IE6 Countdown'&quot; href=&quot;http://hocuspokus.net/2011/03/ie6-countdown&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Yorkshire Puddings</title>
   
   <link href="http://hocuspokus.net/2010/12/yorkshire-puddings"/>
   }
   <updated>2010-12-24T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/12/yorkshire-puddings</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2010/yorkshires.jpg&quot;
  alt=&quot;Yorkshires!!!&quot;
  title=&quot;Yorkshires!!!&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s the good deed done for today&amp;hellip; :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Pheasant and Mushroom Risotto</title>
   
   <link href="http://hocuspokus.net/2010/12/pheasant-and-mushroom-risotto"/>
   }
   <updated>2010-12-15T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/12/pheasant-and-mushroom-risotto</id>
   <content type="html">
     &lt;p&gt;I had some left over pheasant meat (breast and leg) to go with &lt;a href=&quot;/2010/12/pheasant-stock/&quot;&gt;the stock&lt;/a&gt;
that I made the other night, so I decided to make a nice risotto out if it. :)&lt;/p&gt;

&lt;p&gt;The following quantities are for two servings.&lt;/p&gt;

&lt;h4&gt;Ingredients&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Left over roast pheasant meat, cut into small pieces&lt;/li&gt;
&lt;li&gt;2 large portobello mushrooms, sliced&lt;/li&gt;
&lt;li&gt;6 dried porchini mushrooms&lt;/li&gt;
&lt;li&gt;500ml pheasant stock&lt;/li&gt;
&lt;li&gt;2 knobs of butter&lt;/li&gt;
&lt;li&gt;1 tbsp olive oil&lt;/li&gt;
&lt;li&gt;2 large shallots, finely chopped&lt;/li&gt;
&lt;li&gt;1 clove of garlic, finely chopped&lt;/li&gt;
&lt;li&gt;160g arborio rice&lt;/li&gt;
&lt;li&gt;1 glass red wine&lt;/li&gt;
&lt;li&gt;1 tsp dried mixed herbs&lt;/li&gt;
&lt;li&gt;The juice of half a lemon&lt;/li&gt;
&lt;li&gt;50g parmesan cheese&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Directions&lt;/h4&gt;

&lt;p&gt;Rehydrate the porcini mushrooms in a little boiling water for 15 minutes. Remove the mushrooms
and slice, then strain the leftover mushroom water and add to the pheasant stock.&lt;/p&gt;

&lt;p&gt;Heat the stock. In a separate, heavy bottomed saucepan, gently saut&amp;eacute; shallots and garlic
in the olive oil and one knob of butter until soft.&lt;/p&gt;

&lt;p&gt;Add the rice to the saucepan, turn up the heat and gently stir. After a minute or so the rice
will become translucent. Now add the wine and keep stirring.&lt;/p&gt;

&lt;p&gt;Once the wine has cooked into the rice add a ladle of hot stock, a good pinch of salt and the
dried herbs. Now turn the heat down to a simmer and keep stirring gently.&lt;/p&gt;

&lt;p&gt;Once the first ladle full of stock has been absorbed, add another one and keep stirring. Repeat
this for about 10 minutes (stirring and adding stock).&lt;/p&gt;

&lt;p&gt;Now add the pheasant meat and mushrooms to the saucepan, and carry on adding stock and stirring
for a further 5 minutes. (So this will be about 15 minutes cooking time for the rice in total).&lt;/p&gt;

&lt;p&gt;Now taste the rice to see if it&amp;rsquo;s cooked (also check the seasoning at this point). Carry on
adding stock until the rice is soft but with a slight bite. If you run out of stock before the
rice is cooked, add some boiling water and keep going.&lt;/p&gt;

&lt;p&gt;Remove from the heat and add the last knob of butter and the parmesan, stir well. Place a lid
on the saucepan and allow it to sit for 2 minutes &amp;ndash; this allows the risotto to become all
creamy and oozy like it should be.&lt;/p&gt;

&lt;p&gt;Finally, add the lemon juice, stir, then serve immediately.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Pheasant Stock</title>
   
   <link href="http://hocuspokus.net/2010/12/pheasant-stock"/>
   }
   <updated>2010-12-08T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/12/pheasant-stock</id>
   <content type="html">
     &lt;p&gt;I made roast pheasant for the first time at the weekend (using
&lt;a href=&quot;http://www.bbc.co.uk/food/recipes/roastpheasantwithlem_90249&quot; title=&quot;Roast Pheasant with Lemon and Rosemary - BBC Recipes&quot;&gt;this recipe&lt;/a&gt;
&amp;ndash; very nice!) so it meant that I ended up with the bones and carcasses from two pheasants.
It would have been rude not to try and make a stock from them!&lt;/p&gt;

&lt;p&gt;The following makes enough for about 4 servings.&lt;/p&gt;

&lt;h4&gt;Ingredients&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;2 pheasant carcasses and bones&lt;/li&gt;
&lt;li&gt;3 tbsp vegetable oil&lt;/li&gt;
&lt;li&gt;1 sliced medium onion&lt;/li&gt;
&lt;li&gt;1 carrot &amp;ndash; peeled, trimmed and sliced&lt;/li&gt;
&lt;li&gt;1 celery stalk &amp;ndash; trimmed and sliced&lt;/li&gt;
&lt;li&gt;3 large shallots, sliced&lt;/li&gt;
&lt;li&gt;2 tomatoes &amp;ndash; coarsely chopped&lt;/li&gt;
&lt;li&gt;4 bay leaves&lt;/li&gt;
&lt;li&gt;4 juniper berries, crushed&lt;/li&gt;
&lt;li&gt;20 peppercorns&lt;/li&gt;
&lt;li&gt;2 &amp;frac12; cup dry red wine&lt;/li&gt;
&lt;li&gt;1 cup water or more&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Directions&lt;/h4&gt;

&lt;p&gt;Preheat the oven to 450 &amp;deg;F / 230 &amp;deg;C / Gas Mark 8.&lt;/p&gt;

&lt;p&gt;Pour the vegetable oil into a roasting pan with the reserved bones and carcasses. Roast until
well browned, stirring occasionally, for about 30 minutes.&lt;/p&gt;

&lt;p&gt;Add the remaining stock ingredients except the wine and continue to roast for 10 more minutes.&lt;/p&gt;

&lt;p&gt;Transfer the solids to a stockpot, discarding any fat.&lt;/p&gt;

&lt;p&gt;Place the roasting tin over high heat and add the wine. Scrape away all browned bits and boil,
stirring, until the wine is nearly evaporated.&lt;/p&gt;

&lt;p&gt;Add 1 cup of water, then add this liquid to the stockpot.&lt;/p&gt;

&lt;p&gt;Add enough cold water to cover the bones and carcasses, bring slowly to a boil and skim well.&lt;/p&gt;

&lt;p&gt;Lower the heat and gently simmer uncovered for 3 to 4 hours.&lt;/p&gt;

&lt;p&gt;Strain, pressing down on the solids to extract all of the liquid, then the discard solids.
Allow the stock to cool to room temperature and then refrigerate.&lt;/p&gt;

&lt;p&gt;When the stock is chilled, lift off any solidified fat from the surface and discard.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Installing RMagick on Snow Leopard / Leopard</title>
   
   <link href="http://hocuspokus.net/2010/03/installing-rmagick-on-snow-leopard-leopard"/>
   }
   <updated>2010-03-06T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/03/installing-rmagick-on-snow-leopard-leopard</id>
   <content type="html">
     &lt;p&gt;This used to be quite a complicated task to install ImageMagick and RMagick from source, but
these days (thanks to some great work by others) it&amp;rsquo;s a piece of cake&amp;hellip;&lt;/p&gt;

&lt;p&gt;First install ImageMagick using this install script hosted on github
(&lt;a href=&quot;http://github.com/masterkain/ImageMagick-sl&quot;&gt;http://github.com/masterkain/ImageMagick-sl&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/src
git clone git://github.com/masterkain/ImageMagick-sl.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;ImageMagick-sl
sh install_im.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now simply sit back and wait. (Oh, you&amp;rsquo;ll need to enter your password at some points as the
libraries are installed into &lt;code&gt;/usr/local&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Then, once that&amp;rsquo;s done, RMagick is installed by:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;gem install rmagick
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Simples. :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Installing the Ruby Bindings for Oracle on Mac OS X</title>
   
   <link href="http://hocuspokus.net/2010/03/installing-the-ruby-bindings-for-oracle-on-mac-os-x"/>
   }
   <updated>2010-03-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/03/installing-the-ruby-bindings-for-oracle-on-mac-os-x</id>
   <content type="html">
     &lt;p&gt;This quick crib sheet is for the guys at work (and anyone else who might need help on this
one)&amp;hellip;&lt;/p&gt;

&lt;p&gt;First install the &lt;a href=&quot;http://www.oracle.com/technology/software/tech/oci/instantclient/index.html&quot;&gt;oracle instant client&lt;/a&gt;
somewhere &amp;ndash; I normally install it to &lt;code&gt;/usr/local/oracle/instantclient_10_2&lt;/code&gt;. Then&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/oracle/instantclient_10_2
ln -s libclntsh.dylib.10.1 libclntsh.dylib
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Following this, run &lt;code&gt;mkdir -p /usr/local/oracle/network/admin/&lt;/code&gt;, and place a copy of the
tnsnames.ora file in this directory.&lt;/p&gt;

&lt;p&gt;Now you need to add the following to your &lt;code&gt;.profile&lt;/code&gt; or &lt;code&gt;.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Oracle env variables&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ORACLE_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/local/oracle/instantclient_10_2&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DYLD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/local/oracle/instantclient_10_2:$DYLD_LIBRARY_PATH&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SQLPATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/local/oracle/instantclient_10_2&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TNS_ADMIN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/local/oracle/network/admin&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NLS_LANG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;AMERICAN_AMERICA.UTF8&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$PATH:$DYLD_LIBRARY_PATH&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;That&amp;rsquo;s all of the set-up done, now you just need to install the gem:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;gem install ruby-oci8
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Done. :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Removing ._ Files From Mounted Drives</title>
   
   <link href="http://hocuspokus.net/2010/02/removing-_-files-from-mounted-drives"/>
   }
   <updated>2010-02-11T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/02/removing-_-files-from-mounted-drives</id>
   <content type="html">
     &lt;p&gt;Here&amp;rsquo;s a quick snippet of goodness to remove those annoying &amp;lsquo;._&amp;rsquo; files that Macs generate on
mounted drives&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;wherever you want to clean&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
find . -name &lt;span class=&quot;s2&quot;&gt;&amp;quot;._*&amp;quot;&lt;/span&gt; -exec rm &lt;span class=&quot;s1&quot;&gt;&amp;#39;{}&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\;&lt;/span&gt; -print
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




     
   </content>
 </entry>
 
 <entry>
   <title>Creating Users on a Linux System</title>
   
   <link href="http://hocuspokus.net/2010/01/creating-users-on-a-linux-system"/>
   }
   <updated>2010-01-09T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/01/creating-users-on-a-linux-system</id>
   <content type="html">
     &lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve had to do any basic sysadmin stuff on a Linux box&amp;hellip; seeing as I
had to google the answers to this I thought I&amp;rsquo;d better write them down!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useradd syntax&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;useradd &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;options&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;username&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Useful options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; &amp;ndash; declare the users home directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt; &amp;ndash; force &amp;lsquo;useradd&amp;rsquo; to create the home directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt; &amp;ndash; accept the system defaults for account settings&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;An alternative for &amp;lsquo;useradd&amp;rsquo; though is &amp;lsquo;adduser&amp;rsquo;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;adduser &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;username&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This will then prompt you for all the information needed to set up the account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;making the user an administrator (with sudo)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the root user&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then underneath the entry for &amp;lsquo;root&amp;rsquo; just add in an entry with the desired user name:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;username&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ALL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;ALL&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




     
   </content>
 </entry>
 
 <entry>
   <title>Git and Github</title>
   
   <link href="http://hocuspokus.net/2010/01/git-and-github"/>
   }
   <updated>2010-01-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2010/01/git-and-github</id>
   <content type="html">
     &lt;p&gt;Here&amp;rsquo;s the slides of another presentation I gave at work just before the Christmas break &amp;ndash; this
time on some of the development tools and resources that i&amp;rsquo;m using in my work:
&lt;a href=&quot;http://git-scm.com/&quot;&gt;git&lt;/a&gt; and &lt;a href=&quot;http://github.com/&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The general gist is a basic introduction to both git and github, for developers who are already
using version control (i.e. cvs or svn) but have yet to try distributed version control tools
such as git.&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot; id=&quot;__ss_2722740&quot;&gt;
  &lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;
    &lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=git-intro-091215075529-phpapp01&amp;stripped_title=git-and-github&quot; /&gt;
    &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;
    &lt;embed
      src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=git-intro-091215075529-phpapp01&amp;stripped_title=git-and-github&quot;
      type=&quot;application/x-shockwave-flash&quot; 
      allowscriptaccess=&quot;always&quot; 
      allowfullscreen=&quot;true&quot;
      width=&quot;425&quot; height=&quot;355&quot;&gt;
    &lt;/embed&gt;
  &lt;/object&gt;
&lt;/div&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>Homebrew: The First Batch</title>
   
   <link href="http://hocuspokus.net/2009/09/homebrew-the-first-batch"/>
   }
   <updated>2009-09-29T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2009/09/homebrew-the-first-batch</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve always fancied trying my hand at a bit of home brewing but never actually found the guts
to get myself a kit. Well, this time I finally went through with it and I&amp;rsquo;m now the proud owner
of a starter home brewing kit!&lt;/p&gt;

&lt;p&gt;I got the kit from the folks at &lt;a href=&quot;http://www.thehappybrewer.co.uk/&quot;&gt;The Happy Brewer&lt;/a&gt; in
Bedford, it was very reasonably priced, and they were very friendly and happy to explain what
was needed to be done to a complete novice. If you live near the Bedford area and fancy having
a go yourself I&amp;rsquo;d happily recommend them.&lt;/p&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2009/beer_in_progress.jpg&quot;
  alt=&quot;The first batch in progress...&quot;
  title=&quot;The first batch in progress...&quot;
  width=&quot;400&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That there is potentially 40 pints of &lt;a href=&quot;http://www.woodfordes.co.uk/html/wherry.html&quot;&gt;Woodfordes Wherry&lt;/a&gt;,
a very tasty beer sold at the local near the Sanger Institute &amp;ndash; fingers crossed I&amp;rsquo;ll do a good
job of it. This is the first fermentation step, in about 4-6 days I can move it into the
barrel, then it&amp;rsquo;s a 3-4 week wait for the finished product. Will update with news on whether I
killed myself (and anyone else brave enough to try it) soon! :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>IWPLS 2009: The Sanger Mouse Resources Portal - a Testbed for Collaborative Data Integration</title>
   
   <link href="http://hocuspokus.net/2009/09/iwpls-2009-the-sanger-mouse-resources-portal-a-testbed-for-collaborative-data-integration"/>
   }
   <updated>2009-09-21T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2009/09/iwpls-2009-the-sanger-mouse-resources-portal-a-testbed-for-collaborative-data-integration</id>
   <content type="html">
     &lt;p&gt;Last week I enjoyed some time up in Edinburgh for the &lt;a href=&quot;http://www.nesc.ac.uk/esi/events/1000/&quot;&gt;International Workshop on Portals for
Life Sciences (IWPLS &amp;lsquo;09)&lt;/a&gt;, hosted at the e-Science
Institute. It was a good workshop &amp;ndash; there were good presentations, lively debates, and good
social planning for the evenings!&lt;/p&gt;

&lt;p&gt;I have to admit that quite a lot of the content of the workshop was completely irrelevant to me
and went straight over my head at times, but I did enjoy it, and it&amp;rsquo;s good to hear what other
people are doing.&lt;/p&gt;

&lt;p&gt;I was there for two reasons, first was an interest in the content of the workshop, and second
was that I was one of the people presenting a lightning talk! The content of my talk was pretty
different to most of the other presentations &amp;ndash; they were mostly about grid computing and
development of portal interfaces for said grids &amp;ndash; whereas mine was about the architecture I
developed for the new &lt;a href=&quot;http://www.sanger.ac.uk/mouseportal/&quot;&gt;Sanger Mouse Resources Portal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It seemed to go down pretty well, it got a couple of laughs, no one fell asleep and quite a few
asked questions at the end, so I was quite happy at that. Here&amp;rsquo;s the slides from the talk, just
in case anyone would like to take a look. Copies of all the presentations from the workshop can
be found &lt;a href=&quot;http://www.nesc.ac.uk/action/esi/contribution.cfm?Title=1000&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot; id=&quot;__ss_1988031&quot;&gt;
  &lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;
    &lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iwpls09-edinburgh-090912045607-phpapp02&amp;stripped_title=sanger-mouse-resources-portal-a-testbed-for-collaborative-data-integration&quot; /&gt;
    &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;
    &lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iwpls09-edinburgh-090912045607-phpapp02&amp;stripped_title=sanger-mouse-resources-portal-a-testbed-for-collaborative-data-integration&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;
  &lt;/object&gt;
&lt;/div&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>My First Gem: Biomart</title>
   
   <link href="http://hocuspokus.net/2009/08/my-first-gem-biomart"/>
   }
   <updated>2009-08-31T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2009/08/my-first-gem-biomart</id>
   <content type="html">
     &lt;p&gt;A lot of my work these days involves building and querying biomart datasets. Interacting with
the webservices (for queries) is pretty simple, you just have to post a piece of xml at the
right url, but I found myself reusing a lot of boilerplate code in each and every new script.&lt;/p&gt;

&lt;p&gt;So, to make my life a little easier (and hopefully some others) I packaged all of the code up
in a module with classes to handle all of the monkey work for me and decided to release it as a
gem. :)&lt;/p&gt;

&lt;p&gt;The source code is available from &lt;a href=&quot;http://github.com/dazoakley/biomart/tree/master&quot;&gt;github&lt;/a&gt;,
and the documentation is on &lt;a href=&quot;http://rdoc.info/projects/dazoakley/biomart&quot;&gt;rdoc.info&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more details, check out the
&lt;a href=&quot;http://rubyforge.org/forum/forum.php?forum_id=34404&quot;&gt;release anouncement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s my first ruby module so any advice or pointers on how to make things better would be most
appreciated. :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Add Git and SVN Branch to Bash Prompt</title>
   
   <link href="http://hocuspokus.net/2009/07/add-git-and-svn-branch-to-bash-prompt"/>
   }
   <updated>2009-07-09T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2009/07/add-git-and-svn-branch-to-bash-prompt</id>
   <content type="html">
     &lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; (12-Mar-2010) slight update to the svn prompt code to give a better / more useful
output&amp;hellip;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve seen things like this posted on the net before but never really had a chance to play with
the idea. But as I&amp;rsquo;m now using git and svn a lot more these days (fingers crossed i&amp;rsquo;ll be
totally free of cvs soon!) I thought it was about time I pulled my finger out.&lt;/p&gt;

&lt;p&gt;So here&amp;rsquo;s the end goal, in a normal directory, we just get a normal bash promt, but in a
directory controlled by git or svn, we also get an addition telling us the source control tool
in use and the current branch:&lt;/p&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2009/git_svn_bash_terminal.png&quot;
  alt=&quot;git_svn_bash_terminal&quot;
  title=&quot;git_svn_bash_terminal&quot;
  width=&quot;500&quot;
  class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, fire up yer terminal and add the following to your &lt;code&gt;.profile&lt;/code&gt;, &lt;code&gt;.bash_profile&lt;/code&gt; or &lt;code&gt;.bashrc&lt;/code&gt;
(whichever one you use):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;parse_git_branch &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  git name-rev HEAD 2&amp;gt; /dev/null | sed &lt;span class=&quot;s1&quot;&gt;&amp;#39;s#HEAD\ \(.*\)# (git::\1)#&amp;#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
parse_svn_branch&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  parse_svn_url | sed -e &lt;span class=&quot;s1&quot;&gt;&amp;#39;s#^&amp;#39;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$(parse_svn_repository_root)&amp;quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;##g&amp;#39;&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;&amp;#39;{print &amp;quot; (svn::&amp;quot;$1&amp;quot;)&amp;quot; }&amp;#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
parse_svn_url&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  svn info 2&amp;gt;/dev/null | sed -ne &lt;span class=&quot;s1&quot;&gt;&amp;#39;s#^URL: ##p&amp;#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
parse_svn_repository_root&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  svn info 2&amp;gt;/dev/null | sed -ne &lt;span class=&quot;s1&quot;&gt;&amp;#39;s#^Repository Root: ##p&amp;#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;BLACK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;38m\]&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;RED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;31m\]&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;RED_BOLD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[01;31m\]&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BLUE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[01;34m\]&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GREEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;32m\]&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PS1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$BLACK[ \u@$RED\h $GREEN\w$RED_BOLD\$(parse_git_branch)\$(parse_svn_branch)$BLACK ] &amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Simples. Now just open up a new terminal and move into a project directory using svn or git. :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Building Apache and Mod Perl on Mac OS X</title>
   
   <link href="http://hocuspokus.net/2009/03/building-apache-and-mod-perl-on-mac-os-x"/>
   }
   <updated>2009-03-07T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2009/03/building-apache-and-mod-perl-on-mac-os-x</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve finally had my work laptop upgraded to Leopard!!! :)&lt;/p&gt;

&lt;p&gt;As such, I&amp;rsquo;ve just spent the last couple of days getting things all set-up nicely so that I can get on with my
work. Most of the work that I do is web development orientated, and mainly using &lt;a href=&quot;http://www.perl.org/&quot;&gt;Perl&lt;/a&gt;
and &lt;a href=&quot;http://www.catalystframework.org/&quot;&gt;Catalyst&lt;/a&gt;, so an install of Apache and mod_perl is needed.&lt;/p&gt;

&lt;p&gt;OS X does come with a complete install of Apache (even with mod_perl!) out of the box and ready to go (info on
using this set-up can be found &lt;a href=&quot;http://bixsolutions.net/forum/thread-11.html&quot;&gt;here&lt;/a&gt;), but I&amp;rsquo;m also working on
another project that may involve the use of &lt;a href=&quot;http://www.aptana.com/jaxer&quot;&gt;Jaxer&lt;/a&gt;, and this requires a newer
build of Apache than the one shipped with Leopard. :(&lt;/p&gt;

&lt;p&gt;Thankfully building these tools isn&amp;rsquo;t too complicated, here&amp;rsquo;s a quick dump of my notes on getting this done.
Note, I&amp;rsquo;m installing them into &lt;a href=&quot;http://hivelogic.com/articles/2005/11/using_usr_local&quot;&gt;/usr/local&lt;/a&gt; so that I
don&amp;rsquo;t mess with any of the OS X internals that I shouldn&amp;rsquo;t be touching &amp;ndash; this is completely removable.&lt;/p&gt;

&lt;p&gt;First, make a work area for building:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo mkdir -p /usr/local/src
sudo chgrp admin /usr/local/src
sudo chmod -R 775 /usr/local/src
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/src
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




&lt;h3&gt;Apache&lt;/h3&gt;




&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;curl -O http://apache.mirror.infiniteconflict.com/httpd/httpd-2.2.11.tar.gz
tar zxvf httpd-2.2.11.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;httpd-2.2.11
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now here&amp;rsquo;s the big one &amp;ndash; the Apache configuration. This compiles a heap of modules I probably don&amp;rsquo;t need, but
it&amp;rsquo;s nice to have them there in case I do ever need them&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;CFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-O3&amp;quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;CXXFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-O3&amp;quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
./configure --prefix&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/apache2 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-autoindex &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-cache &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-cgi &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-deflate &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-dir &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-disk_cache &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-fastcgi &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-file_cache &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-headers &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-include &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-info &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-log_config &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-log_forensic &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-logio &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-mem_cache &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-mime &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-mime_magic &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-negotiation &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-perl &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-proxy &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-proxy-balancer &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-proxy-http &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-rewrite &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-speling &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-status &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-suexec &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-userdir &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-usertrack &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-version &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-vhost_alias &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-so &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--enable-mods-shared&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then the standard make and install:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;make
make &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;
sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now to add some configuration so that Apache starts on system boot, first we need to create a startup script:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /System/Library/StartupItems/
sudo mkdir Apache
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;Apache
sudo touch Apache
sudo chmod a+x Apache
mate Apache
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Paste this content into the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;##&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Apache HTTP Server&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;##&lt;/span&gt;

. /etc/rc.common

StartService &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    ConsoleMessage &lt;span class=&quot;s2&quot;&gt;&amp;quot;Starting Apache web server&amp;quot;&lt;/span&gt;
    /usr/local/apache2/bin/apachectl start
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

StopService &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    ConsoleMessage &lt;span class=&quot;s2&quot;&gt;&amp;quot;Stopping Apache web server&amp;quot;&lt;/span&gt;
    /usr/local/apache2/bin/apachectl stop
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

RestartService &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    ConsoleMessage &lt;span class=&quot;s2&quot;&gt;&amp;quot;Restarting Apache web server&amp;quot;&lt;/span&gt;
    /usr/local/apache2/bin/apachectl restart
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

RunService &lt;span class=&quot;s2&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then a configuration file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo touch StartupParameters.plist
mate StartupParameters.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Paste this content into the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;{
  Description     = &amp;quot;Apache web server&amp;quot;;
  Provides        = (&amp;quot;Web Server&amp;quot;);
  Requires        = (&amp;quot;DirectoryServices&amp;quot;);
  Uses            = (&amp;quot;Disks&amp;quot;,&amp;quot;Network Time&amp;quot;);
  OrderPreference = &amp;quot;None&amp;quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then reboot and open up &lt;a href=&quot;http://localhost&quot;&gt;http://localhost&lt;/a&gt; to make sure things have worked.&lt;/p&gt;

&lt;h3&gt;Mod Perl&lt;/h3&gt;


&lt;p&gt;This is a lot more straight forward:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/src
curl -O http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
tar zxvf mod_perl-2.0-current.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;mod_perl-2.0.4
perl Makefile.PL &lt;span class=&quot;nv&quot;&gt;MP_AP_PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/apache2
make
make &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;
sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now all you have to do is add the following line to your Apache httpd.conf (&lt;code&gt;/usr/local/apache2/conf/httpd.conf&lt;/code&gt;)
with all of the LoadModule entries:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ini&quot;&gt;&lt;span class=&quot;err&quot;&gt;LoadModule&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;perl_module&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;modules/mod_perl.so&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;All done! :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Using Javascript to Make Relative Times Work with Caching</title>
   
   <link href="http://www.37signals.com/svn/posts/1557-javascript-makes-relative-times-compatible-with-caching"/>
   }
   <updated>2009-02-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2009/02/using-javascript-to-make-relative-times-work-with-caching</id>
   <content type="html">
     &lt;p&gt;A great idea from the folks over at 37 signals.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It&amp;rsquo;s easy to think that the relative-time style of this comment was written 15 minutes ago is incompatible
with caching. How are you supposed to cache something if the text changes every minute? Static pages with
JavaScripts, that&amp;rsquo;s how!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Looks like &lt;a href=&quot;http://timeago.yarp.com/&quot;&gt;this type of idea&lt;/a&gt; has been around for a while (I&amp;rsquo;d just never
thought of it before)! :D&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Using Javascript to Make Relative Times Work with Caching'&quot; href=&quot;http://hocuspokus.net/2009/02/using-javascript-to-make-relative-times-work-with-caching&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>MS Announces Six Editions of Windows 7</title>
   
   <link href="http://www.theregister.co.uk/2009/02/04/windows_7_skus/"/>
   }
   <updated>2009-02-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2009/02/ms-announces-six-editions-of-windows-7</id>
   <content type="html">
     &lt;p&gt;Should have expected this really. I would have thought producing all of these different versions of the OS
would make development harder and more expensive &amp;ndash; why not just produce one or two versions i.e. one for
consumer and one for business use if you really need to segregate and fleece one market? Still at least it&amp;rsquo;s
one different SKU down from Vista&amp;rsquo;s seven!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Microsoft has announced how it will package Windows Vista&amp;rsquo;s successor, Windows 7. And as ever, Microsoft has
put segmentation ahead of clarity.&lt;/p&gt;

&lt;p&gt;The one bright spot in Microsoft&amp;rsquo;s Windows 7 news is that &amp;ndash; contrary to some reports &amp;ndash; it won&amp;rsquo;t add a brand
new edition solely for netbooks. Although even this is not that straight forward.&lt;/p&gt;

&lt;p&gt;On Tuesday, the company Tuesday said Windows 7 would come in six editions: Windows 7 Starter Edition, Home
Basic, Premium, Professional, Enterprise, and Ultimate.&lt;/p&gt;

&lt;p&gt;Not that the news was presented like this. Microsoft led on the fact that &amp;ldquo;most&amp;rdquo; customers would be served by
&amp;ldquo;two primary&amp;rdquo; editions &amp;ndash; Windows 7 Home Premium and Windows 7 Professional that respectively target consumer
and business users.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'MS Announces Six Editions of Windows 7'&quot; href=&quot;http://hocuspokus.net/2009/02/ms-announces-six-editions-of-windows-7&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Want Git preinstalled on next Mac OS X?</title>
   
   <link href="http://github.com/blog/327-want-git-preinstalled-on-next-mac-os-x"/>
   }
   <updated>2009-01-31T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2009/01/want-git-preinstalled-on-next-mac-os-x</id>
   <content type="html">
     &lt;p&gt;Yes would be my answer. It sounds like a good idea, but I&amp;rsquo;m not sure if Apple will appreciate the ticket spam
though&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I have a dream where in the future developers don&amp;rsquo;t even have to install Git for themselves in order to be
able to use it. Apple has shown a very forward thinking attitude towards shipping OS X with various
programming languages and version control systems. Right now is a critical time in which we can help push to
have Git preinstalled on the next version of their operating system. The more people that use Git, the better
the ecosystem becomes, and removing the installation barrier is a big step in that direction.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m told, on good authority, that the best way to make this happen is to let Apple know that it&amp;rsquo;s something
we desire. So if you&amp;rsquo;d like to be able to fire up a fresh Mac and type &lt;code&gt;git&lt;/code&gt; without ever installing it, open
a ticket on Apple&amp;rsquo;s bug reporting site:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://bugreporter.apple.com&quot;&gt;http://bugreporter.apple.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let them know that you&amp;rsquo;re using Git on your mac, and that you&amp;rsquo;d love to see it shipped with the next version
of OS X so that even more developers can experience the joy of distributed version control!&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Want Git preinstalled on next Mac OS X?'&quot; href=&quot;http://hocuspokus.net/2009/01/want-git-preinstalled-on-next-mac-os-x&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>iPlayer Downloader Now on Mac and Linux</title>
   
   <link href="http://news.bbc.co.uk/1/hi/technology/7787335.stm"/>
   }
   <updated>2008-12-18T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/12/iplayer-downloader-now-on-mac-and-linux</id>
   <content type="html">
     &lt;p&gt;This is good news! :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The BBC has created a version of the iPlayer that works with both Mac and Linux computers.&lt;/p&gt;

&lt;p&gt;The two systems, which have been able to stream BBC programmes via the iPlayer for a year, will now be able
to handle downloads.&lt;/p&gt;

&lt;p&gt;The BBC, working with Adobe, has developed the new version, known as BBC iPlayer Desktop.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'iPlayer Downloader Now on Mac and Linux'&quot; href=&quot;http://hocuspokus.net/2008/12/iplayer-downloader-now-on-mac-and-linux&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Cloudcamb Notes: Biocep</title>
   
   <link href="http://hocuspokus.net/2008/12/cloudcamb-notes-biocep"/>
   }
   <updated>2008-12-18T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/12/cloudcamb-notes-biocep</id>
   <content type="html">
     &lt;p&gt;I went to an event called &lt;a href=&quot;http://cloudcamb.org/&quot;&gt;Cloudcamb&lt;/a&gt; last night (I love working in Cambridge)
organised by &lt;a href=&quot;http://twitter.com/mza&quot;&gt;Matt&lt;/a&gt; (ta very muchly), the evening was very good and informative, but
the one thing that really stood out for me was a very interesting presentation on the &lt;a href=&quot;http://biocep-distrib.r-forge.r-project.org/&quot;&gt;Biocep
project&lt;/a&gt; that anyone who uses R (or would like to use R) should
be interested in.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s my take on the basics of it and why you would want this &amp;ndash; there&amp;rsquo;s really LOTS more there!!!&lt;/p&gt;

&lt;p&gt;The first thing Biocep is (that&amp;rsquo;s not really advertised much on the site) is that it offers a vastly improved
interface to R that has the following tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in spreadsheet like functionallity&lt;/li&gt;
&lt;li&gt;Built-in code editor (&lt;a href=&quot;http://www.jedit.org/&quot;&gt;jEdit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Plug-in architecture for creating custom interfaces to things (similar potential to Matlab&amp;rsquo;s GUIDE)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There are other R gui&amp;rsquo;s out there (i.e. Mac and Windows R spring to mind) &amp;ndash; but they are not as slick as
this.&lt;/p&gt;

&lt;p&gt;The second thing biocep gives is that it allows you to run R instances on remote machines (i.e. up in the
&amp;ldquo;cloud&amp;rdquo;, or on clusters or grid systems in your work place / institute), from your desktop and be able to
work collaboratively with other people using fully shared sessions (i.e. both of you can play with shared
data, talk and see all of the visuals the other person is seeing all in real-time &amp;ndash; it&amp;rsquo;s really impressive to
watch).&lt;/p&gt;

&lt;p&gt;Seriously, if you work with R, check it out!&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Buy My Book!</title>
   
   <link href="http://hocuspokus.net/2008/11/buy-my-book"/>
   }
   <updated>2008-11-26T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/11/buy-my-book</id>
   <content type="html">
     &lt;p&gt;Was I really involved in writing something that sounds this classy?!?!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Modern bioinformatics encompasses a broad and ever-changing range of activities involved with the
management and analysis of data from molecular biology experiments. Despite the diversity of activities and
applications, the basic methodology and core tools needed to tackle bioinformatics problems is common to
many projects. Building Bioinformatics Solutions provides a comprehensive introduction to this methodology,
explaining how to acquire and use the most popular development tools, how to apply them to build processing
pipelines, and how to make the results available through visualisations and web-based services for
deployment either locally or via the Internet. The main development tools covered in this book are the
MySQL database management system, the Perl programming language, and the R language for statistical
computing. These industry standard open source tools form the core of many bioinformatics projects, both in
academia and industry. The methodologies introduced are platform independent, and all the examples that
feature have been tested on Windows, Linux and Mac OS. This advanced textbook is suitable for graduate
students and researchers in the life sciences who wish to automate analyses or create their own databases
and web-based tools. No prior knowledge of software development is assumed. Having worked through the book,
the reader should have the necessary core skills to develop computational solutions for their specific
research programmes. The book will also help the reader overcome the inertia associated with penetrating
this field, and provide them with the confidence and understanding required to go on to develop more
advanced bioinformatics skills.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The book that I am a co-author on, &lt;strong&gt;Building Bioinformatics Solutions&lt;/strong&gt; is shortly going to
be available on
&lt;a href=&quot;http://www.amazon.co.uk/gp/product/0199230234?ie=UTF8&amp;amp;tag=buildibioinfs-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0199230234&quot;&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Amazon (UK)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/a&gt;
&lt;img style=&quot;border:none !important; margin:0px !important;&quot; src=&quot;http://www.assoc-amazon.co.uk/e/ir?t=buildibioinfs-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=0199230234&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;
and
&lt;a href=&quot;http://www.amazon.com/gp/product/0199230234?ie=UTF8&amp;#038;tag=buildibioinfs-20&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=9325&amp;#038;creativeASIN=0199230234&quot;&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Amazon (US)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/a&gt;
&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=buildibioinfs-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=0199230234&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;
as well as other countries.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re looking for an introduction to some of the tools used in the field of Bioinformatics (programming,
databases, data analysis) or even just looking for a general introduction to Perl programming, MySQL or R why not
check it out. :)&lt;/p&gt;

&lt;p&gt;Still here and after more?!?! Why not head on over to &lt;a href=&quot;http://bixsolutions.net&quot;&gt;http://bixsolutions.net&lt;/a&gt; &amp;ndash; the
companion site for the book, and take a peek at what&amp;rsquo;s on offer.&lt;/p&gt;

&lt;p&gt;Now get off my lawn! ;)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Using PostgreSQL with Ruby on Rails on OS X</title>
   
   <link href="http://hocuspokus.net/2008/11/using-postgresql-with-ruby-on-rails-on-os-x"/>
   }
   <updated>2008-11-16T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/11/using-postgresql-with-ruby-on-rails-on-os-x</id>
   <content type="html">
     &lt;p&gt;Following on from my &lt;a href=&quot;/2008/11/install-postgresql-on-mac-os-x-leopard/&quot;&gt;last post&lt;/a&gt; for getting PostgreSQL
up and running nicely on Mac OS X, my next task was getting it playing nicely with ruby on rails &amp;ndash; I&amp;rsquo;m off on
a rails course next week so I&amp;rsquo;m getting stuff ready. :)&lt;/p&gt;

&lt;p&gt;It appears that there is currently two/three gem packages for using postgresql with ruby: &lt;code&gt;postgres&lt;/code&gt;,
&lt;code&gt;ruby-pg&lt;/code&gt;, and &lt;code&gt;pg&lt;/code&gt; &amp;ndash; and from what I can make out, they&amp;rsquo;re all maintained by the same team now, (&lt;code&gt;postgres&lt;/code&gt;
was the original package, but it got abandoned &amp;ndash; &lt;code&gt;ruby-pg&lt;/code&gt; and &lt;code&gt;pg&lt;/code&gt; are the replacements). As such, i&amp;rsquo;ll go
with the newer &lt;code&gt;ruby-pg&lt;/code&gt; gem&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo env &lt;span class=&quot;nv&quot;&gt;ARCHFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-arch i386&amp;quot;&lt;/span&gt; gem install &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
ruby-pg -- &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--with-pgsql-lib&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/lib/postgresql83 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
--with-pgsql-include&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/include/postgresql83
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then finally, when writing the &lt;code&gt;database.yml&lt;/code&gt; entry for connecting to postgresql, we have to define our adapter
as follows:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;yaml&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;development&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;postgresql&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;test_dev&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;unicode&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;localhost&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;XXXXX&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;XXXXX&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;5000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




     
   </content>
 </entry>
 
 <entry>
   <title>Install PostgreSQL on Mac OS X Leopard</title>
   
   <link href="http://hocuspokus.net/2008/11/install-postgresql-on-mac-os-x-leopard"/>
   }
   <updated>2008-11-16T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/11/install-postgresql-on-mac-os-x-leopard</id>
   <content type="html">
     &lt;p&gt;This type of guide is all over the internet, but I&amp;rsquo;m too lazy to search for one every time I want to do this.
;) So here&amp;rsquo;s a brief overview of how I got PostgreSQL set-up nicely on Mac OS 10.5&amp;hellip;&lt;/p&gt;

&lt;h3&gt;Setting Up Our Environment&lt;/h3&gt;


&lt;p&gt;Using a text editor of your choice, add the following lines to the bottom of the &lt;code&gt;/etc/profile&lt;/code&gt; file (you&amp;rsquo;ll
need to be an administrator to do this):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# MacPorts&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/bin:/opt/local/sbin:&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# PostgreSQL&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/lib/postgresql83/bin:&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now before we move on, make sure that you have &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; installed.&lt;/p&gt;

&lt;h3&gt;Installing PostgreSQL with MacPorts&lt;/h3&gt;


&lt;p&gt;I like MacPorts &amp;ndash; it makes installing general Unix packages and keeping them up-to-date a snap. As such,
we&amp;rsquo;ll use it to do the heavy lifting for installing PostgreSQL. Open up a terminal and hit up the following
command:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo port install postgresql83 postgresql83-server
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Sit back and wait a while&amp;hellip;  That&amp;rsquo;s the basic install done.&lt;/p&gt;

&lt;p&gt;Now to configure it, do the following:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo mkdir -p /opt/local/var/db/postgresql83/defaultdb
sudo chown postgres:postgres /opt/local/var/db/postgresql83/defaultdb
sudo su postgres -c &lt;span class=&quot;s1&quot;&gt;&amp;#39;/opt/local/lib/postgresql83/bin/initdb -D /opt/local/var/db/postgresql83/defaultdb&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This installs a default database instance for us to be getting on with. Next, run this command to get
PostgreSQL to start on system boot:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql83-server.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Reboot your Mac.&lt;/p&gt;

&lt;h3&gt;Creating a User Account and Database&lt;/h3&gt;


&lt;p&gt;Once your Mac is back up, we finally need to create an account for us to use (substitute &amp;lsquo;daz&amp;rsquo; for your
username)&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;createuser --superuser daz -U postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now a database to play with&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;createdb test_db
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




&lt;h3&gt;Admin Your Database with pgAdmin 3&lt;/h3&gt;


&lt;p&gt;Download &lt;a href=&quot;http://www.pgadmin.org/&quot;&gt;pgAdmin&lt;/a&gt;, then run the following commands to set up some functions that
allows pgAdmin to collect statistics about your databases:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /opt/local/share/postgresql83/contrib/
sudo su postgres -c psql &amp;lt; adminpack.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;That&amp;rsquo;s it &amp;ndash; job done!&lt;/p&gt;

&lt;p&gt;For notes on making the database accessible over the network, please refer to one of my posts on
&lt;a href=&quot;/2008/05/install-postgresql-on-ubuntu-804/&quot;&gt;PostgreSQL on Ubuntu&lt;/a&gt;.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Sync Your Things Database via Dropbox</title>
   
   <link href="http://hocuspokus.net/2008/11/sync-your-things-database-via-dropbox"/>
   }
   <updated>2008-11-06T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/11/sync-your-things-database-via-dropbox</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;https://www.getdropbox.com/&quot;&gt;Dropbox&lt;/a&gt; is a great service, I&amp;rsquo;m using it happily to keep my files in sync
across multiple computers &amp;ndash; I&amp;rsquo;m even using it to keep all of my &lt;a href=&quot;http://www.switchersblog.com/2008/10/1password-29-br.html&quot;&gt;passwords in sync&lt;/a&gt;, but I&amp;rsquo;ve thought of another great use&amp;hellip;
How about syncing my &lt;a href=&quot;http://culturedcode.com/things/&quot;&gt;Things&lt;/a&gt; database between my macs (as this is my to-do
list manager of choice)?&lt;/p&gt;

&lt;p&gt;This is not fully tested yet, (just thought of it this morning) so i&amp;rsquo;ll update a bit later and report on as
to wether things goes completely mental, but the way I&amp;rsquo;ve done this is as follows&amp;hellip;&lt;/p&gt;

&lt;p&gt;Make sure Things is completely shut down, then open up a terminal and type in the following commands:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/Library/Application&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;Support/Cultured&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;Code/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This moves us into the correct directory. First, to be on the safe side &amp;ndash; we&amp;rsquo;ll take a backup of our files&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;cp -R Things Things.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now just move the Things directory into your dropbox and create a symbolic link in its place.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;mv Things ~/Dropbox/
ln -s ~/Dropbox/Things Things
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Fingers crossed this should have the desired results! :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; It works!!! :D On the second computer all you need to do to get the ball rolling is to close down
Things, open up a terminal and type the following commands:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/Library/Application&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;Support/Cultured&lt;span class=&quot;se&quot;&gt;\ &lt;/span&gt;Code/
rm -rf Things
ln -s ~/Dropbox/Things Things
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Note &amp;ndash; my 2nd mac only had a fresh install of Things &amp;ndash; &lt;strong&gt;no data&lt;/strong&gt;. I installed it, opened it up (so the
initial database was created), then did the above.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Gmail Gets Auto-Replies</title>
   
   <link href="http://gmailblog.blogspot.com/2008/10/new-in-labs-canned-responses.html"/>
   }
   <updated>2008-10-22T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/gmail-gets-auto-replies</id>
   <content type="html">
     &lt;p&gt;This is one feature that I&amp;rsquo;ve been wanting for ages!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Hello, you&amp;rsquo;ve reached Chad&amp;rsquo;s mailbox. Thanks for your email about the latest Labs feature: Canned Responses, or
email for the truly lazy. I&amp;rsquo;m on paternity leave so I won&amp;rsquo;t be able to respond personally. Instead, I hope you&amp;rsquo;ll
enjoy this automated message.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Gmail Gets Auto-Replies'&quot; href=&quot;http://hocuspokus.net/2008/10/gmail-gets-auto-replies&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Android Goes Open Source</title>
   
   <link href="http://source.android.com/posts/opensource"/>
   }
   <updated>2008-10-22T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/android-goes-open-source</id>
   <content type="html">
     &lt;p&gt;Yesterday was a big day for advanced mobile phones &amp;ndash; Android went fully open source.&lt;/p&gt;

&lt;p&gt;I really like the iPhone (it will be my next phone) &amp;ndash; it&amp;rsquo;s the most complete device out there, but I would love to
see a truly open platform like Android have a great handset underneath it and really take off &amp;ndash; it&amp;rsquo;s the only thing
I can see that stands a chance of really taking on the iPhone. (Future unreleased editions of Windows mobile etc.
don&amp;rsquo;t count &amp;ndash; we&amp;rsquo;re looking at the here and now, these platforms won&amp;rsquo;t stand still while others try to catch up&amp;hellip;)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Today is a big day for Android, the Open Handset Alliance, and the open-source community. All of the work that we&amp;rsquo;ve
poured into the mobile platform is now officially available, for free, as the Android Open Source Project.&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;ll be hearing a lot about Android devices. We&amp;rsquo;ve all put a lot of effort into the first Android device, and I&amp;rsquo;m
really happy with the way it turned out. But one device is just the beginning.&lt;/p&gt;

&lt;p&gt;Android is not a single piece of hardware; it&amp;rsquo;s a complete, end-to-end software platform that can be adapted to work
on any number of hardware configurations. Everything is there, from the bootloader all the way up to the
applications. And with an Android device already on the market, it has proven that it has what it takes to truly
compete in the mobile arena.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Android Goes Open Source'&quot; href=&quot;http://hocuspokus.net/2008/10/android-goes-open-source&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Blackbird - Javascript Logging Utility</title>
   
   <link href="http://www.gscottolson.com/blackbirdjs/"/>
   }
   <updated>2008-10-20T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/blackbird-javascript-logging-utility</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/blackbird.png&quot;
  alt=&quot;blackbirdjs&quot;
  title=&quot;blackbirdjs&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Found this while trawling the feeds this morning &amp;ndash; looks like quite a useful utility. It offers a nice alternative
to &lt;a href=&quot;http://www.getfirebug.com/&quot;&gt;Firebug&lt;/a&gt; (when testing in browsers other than Firefox).&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Blackbird - Javascript Logging Utility'&quot; href=&quot;http://hocuspokus.net/2008/10/blackbird-javascript-logging-utility&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>The Macalope: "Is This a Joke?"</title>
   
   <link href="http://www.macalope.com/2008/10/15/is-this-a-joke/"/>
   }
   <updated>2008-10-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/the-macalope-is-this-a-joke</id>
   <content type="html">
     &lt;p&gt;The Macalope bitch slapping some &lt;a href=&quot;http://www.webmonkey.com/blog/How_Much_is_the_Apple_Tax_&quot;&gt;poor journalism&lt;/a&gt; &amp;ndash; great
reading.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'The Macalope: &quot;Is This a Joke?&quot;'&quot; href=&quot;http://hocuspokus.net/2008/10/the-macalope-is-this-a-joke&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Linux Now an Equal Flash Player</title>
   
   <link href="http://linux.slashdot.org/article.pl?sid=08/10/15/200226"/>
   }
   <updated>2008-10-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/linux-now-an-equal-flash-player</id>
   <content type="html">
     &lt;p&gt;Finally&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;ldquo;As recently as 2007, Linux users waited six months for Flash 9 to arrive. Now, with Microsoft pushing its
Silverlight alternative, Adobe is touting the universality of its Flash format, which has penetrated &amp;lsquo;98 percent of
Internet-enabled desktops,&amp;rsquo; it claims. And, it today released Flash 10 for Linux concurrently with other platforms.
Welcome to the future.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Linux Now an Equal Flash Player'&quot; href=&quot;http://hocuspokus.net/2008/10/linux-now-an-equal-flash-player&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Wordpress Theme Notes</title>
   
   <link href="http://hocuspokus.net/2008/10/wordpress-theme-notes"/>
   }
   <updated>2008-10-13T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/wordpress-theme-notes</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve been working on a theme for wordpress over the last few weeks (on and off), it turns out to be really quite
simple, you just need to find out where to get started&amp;hellip;&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s some pages that I found most useful (linking for future reference):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nettuts.com/site-builds/how-to-create-a-wordpress-theme-from-scratch/&quot;&gt;How to create a wordpress theme from scratch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nettuts.com/working-with-cmss/how-to-create-a-wordpress-theme-from-scratch-part-2/&quot;&gt;How to create a wordpress theme from scratch &amp;ndash; Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dbswebsite.com/design/wordpress-reference/&quot;&gt;Wordpress template tag reference guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codex.wordpress.org/&quot;&gt;The Codex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>Ballmer in PCs Are Better Than Macs Shocker</title>
   
   <link href="http://www.macobserver.com/article/2008/10/10.7.shtml"/>
   }
   <updated>2008-10-13T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/ballmer-in-pcs-are-better-than-macs-shocker</id>
   <content type="html">
     &lt;p&gt;Ballmer goes on the defensive a shows just how ignorant he is&amp;hellip; a great read! ;)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;hellip;you&amp;rsquo;ll see us be much more vigorous about stating the case for the PC. The truth of the matter is, this is
ironic. The PC outsells the Mac 33 to 1. And despite the fact that we don&amp;rsquo;t sell PCs, we only sell Windows to people
who make PCs. And the attack is actually on the PCs, interestingly enough. You&amp;rsquo;ll see us defend the PC. We&amp;rsquo;re going
to talk about why &amp;mdash; look, &lt;em&gt;PCs are better than Macs&lt;/em&gt;. That is not something that can be debated. [TMO
emphasis] 32 out of every 33 times, somebody buys a PC instead of a Mac. I&amp;rsquo;m not saying that there are not some
things that people like about Macs, apparently there are. But have you ever seen a cheap Mac? No.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This one&amp;rsquo;s a great one too &amp;ndash; has this guy even seen a mac in the last 10 years&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I&amp;rsquo;m very sensitive to exactly what mouse I have on my laptop. Can you find a range of choices? [for the Mac] Of
course you can&amp;rsquo;t find a range of choices.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Ballmer in PCs Are Better Than Macs Shocker'&quot; href=&quot;http://hocuspokus.net/2008/10/ballmer-in-pcs-are-better-than-macs-shocker&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Release: toggleController Plugin 1.0</title>
   
   <link href="http://hocuspokus.net/2008/10/release-togglecontroller-plugin-10"/>
   }
   <updated>2008-10-04T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/10/release-togglecontroller-plugin-10</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve just spent the last week on a Javascript and Ajax course (thanks to work for footing the bill)! As such I come
armed with some newfound javascript knowledge! :)&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the first fruits of my labour &amp;ndash; a very simple &lt;a href=&quot;http://www.jquery.com&quot;&gt;jQuery&lt;/a&gt; plugin that enables you to
unobtrusively make an element on a webpage collapsable, and have the showing/hiding controlled by another element.&lt;/p&gt;

&lt;p&gt;Like I said, this is very basic stuff and there is probably about a million other (most likely more feature-full and
better) plugins that do the same thing already on the web, but it&amp;rsquo;s all I really need for it to be useful for my
stuff and I had fun learning how to do this &amp;ndash; never know someone else may find it useful!&lt;/p&gt;

&lt;p&gt;If you want to have a play, the code is on &lt;a href=&quot;https://github.com/dazoakley/jquery.togglecontrol.js&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Packard Bell looks to reposition self as 'trendy' lifestyle brand... LOL!</title>
   
   <link href="http://www.pocket-lint.co.uk/news/news.phtml/17780/18804/Packard-Bell-trendy-brand-positioning.phtml"/>
   }
   <updated>2008-09-23T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/packard-bell-looks-to-reposition-self-as-trendy-lifestyle-brand-lol</id>
   <content type="html">
     &lt;p&gt;Read this post and it just made me chuckle to myself&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Packard Bell is set to reposition itself as a trendy design-focused lifestyle brand, following its acquisition by
Acer last year.&lt;/p&gt;

&lt;p&gt;Speaking at Acer&amp;rsquo;s Global Press Conference, Emmanuel Fromont, Vice President of Packard Bell Sales and Marketing,
said:&lt;/p&gt;

&lt;p&gt;&amp;ldquo;It&amp;rsquo;s not a totally new positioning. We&amp;rsquo;ve always differentiated ourselves through design, but as a smaller company
and having to do the design in-house, it was more difficult.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&amp;ldquo;Now with Acer behind us, we want to create aficionado fans of our products. We want people to have real desire for
our brand.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;Pocket-lint spoke to Acer UK country manager Bobby Watkins, and he told us that the new designs for Packard Bell
were something we should look out for when they become available sometime next year.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Here&amp;rsquo;s what happened last time I saw a PB that was trying to be &amp;ldquo;trendy&amp;rdquo;:&lt;/p&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2008/bg-packardbell23.jpg&quot;
  alt=&quot;Packard Bell FTW!&quot;
  title=&quot;Packard Bell FTW!&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Those things were a piece of crap, (and fuuuuugly) always falling apart and loads got returned&amp;hellip; Let&amp;rsquo;s hope these
are much improved &amp;ndash; if not, it will always give us a laugh! :)&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Packard Bell looks to reposition self as 'trendy' lifestyle brand... LOL!'&quot; href=&quot;http://hocuspokus.net/2008/09/packard-bell-looks-to-reposition-self-as-trendy-lifestyle-brand-lol&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>VMWare Fusion 2 is Out</title>
   
   <link href="http://www.tuaw.com/2008/09/16/vmware-fusion-2-0-is-released/"/>
   }
   <updated>2008-09-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/vmware-fusion-2-is-out</id>
   <content type="html">
     &lt;p&gt;Go get it!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Great news for any virtualization junkies out there (I know I&amp;rsquo;m not the only one). VMWare Fusion 2.0 has
just been released! Fusion 2.0 is a free upgrade for all existing 1.x customers, and it adds more than
100 new features and enhancements.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'VMWare Fusion 2 is Out'&quot; href=&quot;http://hocuspokus.net/2008/09/vmware-fusion-2-is-out&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Google Adds Gears to Safari</title>
   
   <link href="http://googlemac.blogspot.com/2008/09/gears-for-safari.html"/>
   }
   <updated>2008-09-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/google-adds-gears-to-safari</id>
   <content type="html">
     &lt;p&gt;This is a worthwhile install if you&amp;rsquo;re a Wordpress user (or any other gears enabled system) on the mac &amp;ndash;
great to see some Safari lovin'. :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We&amp;rsquo;re really excited to announce the official release of Gears for Safari on OS X (minimum requirements
are Leopard 10.5.3 or Tiger 10.4.11).&lt;/p&gt;

&lt;p&gt;You can download it today from &lt;a href=&quot;http://gears.google.com&quot;&gt;http://gears.google.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This means that you can now access all the Gears-enabled sites (such as Zoho office, WordPress, the new
YouTube uploader and Google Docs offline) in Safari.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Google Adds Gears to Safari'&quot; href=&quot;http://hocuspokus.net/2008/09/google-adds-gears-to-safari&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>eeeMac runs OS X on an eeePC</title>
   
   <link href="http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/390567152/"/>
   }
   <updated>2008-09-12T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/eeemac-runs-os-x-on-an-eeepc</id>
   <content type="html">
     &lt;p&gt;I like&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I&amp;rsquo;ve heard some great things about the tiny little eeePC, but this is the best thing I&amp;rsquo;ve heard so far:
&lt;a href=&quot;http://picasaweb.google.com/iiyoyoguy/EeeMac?authkey=eovSurACcNc&amp;amp;pli=1&amp;amp;gsessionid=TbPELrv-fYwr9yBsOPnvrw#5244497584249019010&quot;&gt;it can be a Mac&lt;/a&gt;.
Twitterer Gregory Cohen has pictures on Picasa of his completed eeeMac, an eeePC transformed (perhaps in
similar fashion to this previous attempt &amp;mdash; details please, Gregory) into an OS X-running ultraportable,
complete with a tiny little lit Apple logo on the back.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'eeeMac runs OS X on an eeePC'&quot; href=&quot;http://hocuspokus.net/2008/09/eeemac-runs-os-x-on-an-eeepc&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>History of the Browser User-Agent String </title>
   
   <link href="http://daringfireball.net/linked/2008/09/10/user-agent-strings"/>
   }
   <updated>2008-09-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/history-of-the-browser-user-agent-string</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve only done user-agent string sniffing once and I remember it gave me a headache&amp;hellip;
&lt;a href=&quot;http://www.webaim.org/blog/user-agent-string-history/&quot;&gt;This post&lt;/a&gt; explains why it gave me a headache! :(&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;And then Google built Chrome, and Chrome used Webkit, and it was like Safari, and wanted pages built for
Safari, and so pretended to be Safari. And thus Chrome used WebKit, and pretended to be Safari, and
WebKit pretended to be KHTML, and KHTML pretended to be Gecko, and all browsers pretended to be Mozilla,
and Chrome called itself &lt;code&gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like
Gecko) Chrome/0.2.149.27 Safari/525.13&lt;/code&gt;, and the user agent string was a complete mess, and near useless,
and everyone pretended to be everyone else, and confusion abounded.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'History of the Browser User-Agent String '&quot; href=&quot;http://hocuspokus.net/2008/09/history-of-the-browser-user-agent-string&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>QGtkStyle now part of Qt</title>
   
   <link href="http://labs.trolltech.com/blogs/2008/09/05/qgtkstyle-now-part-of-qt/"/>
   }
   <updated>2008-09-10T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/qgtkstyle-now-part-of-qt</id>
   <content type="html">
     &lt;p&gt;Looks like KDE apps just got a whole lot more appealing to Gnome users. I like a lot of KDE apps (Kate being a
particularly cool editor when I&amp;rsquo;m on the Linux box), but I just never used to use them much as they looked too out
of place with the rest of my Gnome desktop (yeah, I guess I&amp;rsquo;m a GUI snob&amp;hellip;) &amp;ndash; this will most likely change that!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;QGtkStyle made it&amp;rsquo;s way into the Qt snapshots this week, meaning it will become part of the Qt 4.5 release.
Technical users can already compile and use it on their own desktop, but once Qt 4.5 is out it will simply replace
Cleanlooks as the default application style Qt uses on GNOME desktops.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'QGtkStyle now part of Qt'&quot; href=&quot;http://hocuspokus.net/2008/09/qgtkstyle-now-part-of-qt&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>How Videogames Blind Us With Science</title>
   
   <link href="http://daringfireball.net/linked/2008/09/08/video-games-science"/>
   }
   <updated>2008-09-10T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/09/how-videogames-blind-us-with-science</id>
   <content type="html">
     &lt;p&gt;An interesting article over at
&lt;a href=&quot;http://www.wired.com/gaming/gamingreviews/commentary/games/2008/09/gamesfrontiers_0908&quot;&gt;Wired&lt;/a&gt;
discussing a recent study into how kids are using their brains and scientific reasoning to beat video
games&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;One of the reasons kids get bored by science is that too many teachers present it as a fusty collection
of facts for memorization. This is precisely wrong. Science isn&amp;rsquo;t about facts. It&amp;rsquo;s about the quest for
facts &amp;mdash; the scientific method, the process by which we hash through confusing thickets of ignorance.
It&amp;rsquo;s dynamic, argumentative, collaborative, competitive, filled with flashes of crazy excitement and
hours of drudgework, and driven by ego: Our desire to be the one who figures it out, at least for now.
It&amp;rsquo;s dramatic and nutty and fun.&lt;/p&gt;

&lt;p&gt;And it&amp;rsquo;s pretty much how kids already approach the games they love. They&amp;rsquo;re already scientists; they
already know the value of the scientific method. Teachers just need to talk to them in their language, so
that the kids can begin to understand the joy of puzzling through the offline, &amp;ldquo;real&amp;rdquo; world too.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'How Videogames Blind Us With Science'&quot; href=&quot;http://hocuspokus.net/2008/09/how-videogames-blind-us-with-science&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>VMWare Fusion 2 Beta 2</title>
   
   <link href="http://www.tuaw.com/2008/07/30/vmware-fusion-2-beta-2-available-now/"/>
   }
   <updated>2008-07-31T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/07/vmware-fusion-2-beta-2</id>
   <content type="html">
     &lt;p&gt;It&amp;rsquo;s got friggin' Unity for Linux!!!  This looks good&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The VMWare team has &lt;a href=&quot;http://blogs.vmware.com/teamfusion/2008/07/safer-stronger.html&quot;&gt;just released&lt;/a&gt;
&lt;a href=&quot;http://www.vmware.com/communities/content/beta/fusion/fusion2_beta2.html&quot;&gt;the second beta for VMWare Fusion 2.0&lt;/a&gt;,
the company&amp;rsquo;s popular virtualization program for the Mac.&lt;/p&gt;

&lt;p&gt;The new beta adds a TON of new features, as the video above demonstrates. I got a chance to talk to
VMWare today about the new beta and it is HOT. I&amp;rsquo;ll be posting a more in-depth overview tomorrow, but
until then, here are some of the highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unity 2.0&lt;/strong&gt; &amp;ndash; The newest version of Fusion is really focused on better Windows-Mac integration. You can now launch Windows programs from the dock or access Mac programs from within your virtual machine. You can also link folders like Documents, Pictures and Music on your virtual machine with those folders on your Mac.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple Snapshots&lt;/strong&gt; VMWare has worked really hard to bring a Time Machine-like ease to backing up and protecting your virtual machine. You can now designate how often you want to take full system snapshots of your VM, whether once an hour, once a day or once a week, and how many copies you want to keep.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better Video and Graphics Graphics&lt;/strong&gt; and shading support has been improved for Macs that have higher-end graphics cards, and even integrated Macs can now play 1080p HD video in virtual machines with considerably less CPU overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for more client OSs&lt;/strong&gt;, including Leopard Server You can now run Leopard Server as a VM in OS X 10.4 and 10.5, even on client machines (virtualizing Mac OS X client is blocked by Apple&amp;rsquo;s license terms). Support for the latest version of &lt;a href=&quot;http://www.ubuntu.com&quot;&gt;Ubuntu&lt;/a&gt; (Hardy Heron) is also available right out of the box with Unity integration. Power users can now designate up to four virtual CPUs per virtual machine, which is great for anyone wanting to take an XServe or Mac Pro to the next level.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://communities.vmware.com/community/beta/fusion&quot;&gt;VMWare Fusion 2.0 beta 2&lt;/a&gt; is available for Intel
Macs running OS X 10.4 or OS X 10.5. New users can try the beta for free and the upgrade path (including
future betas and the full version of Fusion 2.0) is free for all existing Fusion 1.0 customers.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'VMWare Fusion 2 Beta 2'&quot; href=&quot;http://hocuspokus.net/2008/07/vmware-fusion-2-beta-2&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Gears of War 2 Introduces "Linked Achievements"</title>
   
   <link href="http://www.escapistmagazine.com/news/view/85287-Gears-of-War-2-Introduces-Linked-Achievements"/>
   }
   <updated>2008-07-29T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/07/gears-of-war-2-introduces-linked-achievements</id>
   <content type="html">
     &lt;p&gt;Looks like people better get playing the original Gears leading up to November!!! (I know I will be&amp;hellip; ;) )&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Gears of War 2 will feature &amp;lsquo;linked Achievements,&amp;rsquo; meaning that Achievements earned in the original Gears
will help unlock bonuses in the sequel.&lt;/p&gt;

&lt;p&gt;Epic&amp;rsquo;s Cliff Bleszinski took the stage at Comic-Con to demonstrate to a live audience the E3 Sinkhole
level and describe a new &amp;ldquo;linked achievements&amp;rdquo; feature for Gears 2 where achievements unlocked in the
first Gears game would open features in the upcoming sequel.&lt;/p&gt;

&lt;p&gt;He offered three examples of how the system would work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete Act One in Gears Of War and receive a playable Anthony Carmine in Gears of War 2&lt;/li&gt;
&lt;li&gt;Find 10 COG tags in Gears Of War and get Minh Young Kim in Gears of War 2&lt;/li&gt;
&lt;li&gt;Kill Raam in Gears Of War and earn a playable Raam in Gears of War 2&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Questions such as whether all Gears of Wars achievements will be linked to the sequel and what other
goodies can be grabbed besides characters won&amp;rsquo;t be answered until closer to the game&amp;rsquo;s November 7
release.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Gears of War 2 Introduces &quot;Linked Achievements&quot;'&quot; href=&quot;http://hocuspokus.net/2008/07/gears-of-war-2-introduces-linked-achievements&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>BBC working on New Tomorrow's World</title>
   
   <link href="http://www.guardian.co.uk/media/2008/jun/04/bbc.television1"/>
   }
   <updated>2008-06-04T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/06/bbc-working-on-new-tomorrows-world</id>
   <content type="html">
     &lt;p&gt;The BBC has announced that it is working on a successor to Tomorrow&amp;rsquo;s World. This was always one of my
favourite shows as a child, (yeah, I know I&amp;rsquo;m a nerd ;) ), and I&amp;rsquo;m glad to see something like this making
a return. We need some form of popular science show on TV, otherwise the vast majority of people will
become ignorant of even the basics of science &amp;ndash; but that&amp;rsquo;s a rant for another day&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Just a month after Sir David Attenborough said it was &amp;ldquo;very, very sad&amp;rdquo; that Tomorrow&amp;rsquo;s World had been
axed &amp;ndash; five years ago &amp;ndash; the BBC has today revealed it is making a &amp;ldquo;new popular science format for the
early evening&amp;rdquo; on BBC1.&lt;/p&gt;

&lt;p&gt;A new science show is one of the BBC&amp;rsquo;s top priorities for BBC1 over the next year, according to its
annual statements of programme policy for all its TV, radio and online services, published today. The
SOPPs lay out the corporation&amp;rsquo;s programming plans for the year to the end of March 2009.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'BBC working on New Tomorrow's World'&quot; href=&quot;http://hocuspokus.net/2008/06/bbc-working-on-new-tomorrows-world&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Trash Stuff From the Command Line</title>
   
   <link href="http://www.dribin.org/dave/blog/archives/2008/05/24/osx_trash/"/>
   }
   <updated>2008-05-26T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/trash-stuff-from-the-command-line</id>
   <content type="html">
     &lt;p&gt;A great little command-line tool for Leopard:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;osx-trash&lt;/code&gt; manipulates the Mac OS X trash from the command line, just like the Finder does. It uses
AppleScript via Scripting Bridge on top of to communicate with the Finder. You can move files to the
trash, empty the trash, and list items currently in the trash.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Trash Stuff From the Command Line'&quot; href=&quot;http://hocuspokus.net/2008/05/trash-stuff-from-the-command-line&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Default Text Field Values That Disappear on Focus</title>
   
   <link href="http://hocuspokus.net/2008/05/default-text-field-values-that-disappear-on-focus"/>
   }
   <updated>2008-05-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/default-text-field-values-that-disappear-on-focus</id>
   <content type="html">
     &lt;p&gt;You will have noticed this effect out on your travels on the internet &amp;ndash; a text input field has some
default text in it (often in a slightly dimmed colour), and when you click on the text box, default text
disappears and then reappears when you click away from the box. It happens on the search box to the right
here too.&lt;/p&gt;

&lt;p&gt;I needed this same effect at work today so a quick Google came up with this great
&lt;a href=&quot;http://webdeveloper.beforeseven.com/jquery/default-text-field-value-disappears-focus&quot;&gt;blog post&lt;/a&gt; &amp;ndash; a
lovely example of the exact effect I was looking for in both raw javascript and a version using the
&lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; library.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The script searches the page that it&amp;rsquo;s inserted on for all form input fields that have a class of
&amp;lsquo;default-value&amp;rsquo; applied. Each form input field must also have a unique ID.&lt;/p&gt;

&lt;p&gt;When the page loads the script changes the color of the text in the text fields it has found to the value
of &amp;lsquo;inactive_color&amp;rsquo;. If the user clicks on the input field, the default text is blanked, and the colour
changed to &amp;lsquo;active_color&amp;rsquo;. If the user clicks away from the input field, i.e. the input field loses
focus, the value of the text field will revert back to the original text, and the colour will change back
to &amp;lsquo;inactive_color&amp;rsquo;, unless the user has entered some other text.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Here&amp;rsquo;s a copy of the jQuery version for my own personal notes, never know when that could be useful:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; * Written by Rob Schmitt, The Web Developer&amp;#39;s Blog&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; * http://webdeveloper.beforeseven.com/&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; */&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;active_color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;#000&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Colour of user provided text&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;#999&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Colour of default text&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;input.default-value&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;css&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;color&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;input.default-value&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;focus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;active_color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;blur&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;However, we don&amp;rsquo;t use jQuery at work, our entire site is based around
&lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;Prototype&lt;/a&gt; and &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;, so I did a bit
of butchering and here&amp;rsquo;s the code adapted to use Prototype:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;cm&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; * Written by Darren Oakley&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; * http://hocuspokus.net&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt; */&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;active_color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;#000&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Colour of user provided text&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;#999&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Colour of default text&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;load&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;input.default-value&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;focus&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;active_color&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;blur&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;inactive_color&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                    &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;default_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now all you need to do is give your input text fields a unique id, and the class of &amp;lsquo;default-value&amp;rsquo;, then
the script will take care of the rest.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Install PostgreSQL on Ubuntu 8.04</title>
   
   <link href="http://hocuspokus.net/2008/05/install-postgresql-on-ubuntu-804"/>
   }
   <updated>2008-05-13T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/install-postgresql-on-ubuntu-804</id>
   <content type="html">
     &lt;p&gt;Following up from my old guide to installing PostgreSQL (for Ubuntu 7.10), I thought i&amp;rsquo;d better do an
update for the latest releases&amp;hellip; :)&lt;/p&gt;

&lt;p&gt;This quick walk-through are my notes for installing the PostgreSQL database server and the PgAdmin
administration application on Ubuntu Linux, and also set up the server so it allows access to other PC&amp;rsquo;s
on your network.&lt;/p&gt;

&lt;p&gt;Before we move on, this guide was tested on the current release of Ubuntu Linux, (8.04 &amp;ndash; Hardy Heron)
and PostgreSQL 8.3, but it should also be applicable to older versions (of Ubuntu and PostgreSQL) and
other Debian based distros.&lt;/p&gt;

&lt;p&gt;Right for the basic installation, at the command-line, enter the following commands (or search for the
listed packages in synaptic if you prefer that way of working):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo apt-get install postgresql postgresql-client postgresql-contrib
sudo apt-get install pgadmin3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This installs the database server/client, some extra utility scripts and the pgAdmin GUI application for
working with the database.&lt;/p&gt;

&lt;p&gt;Now we need to reset the password for the &amp;lsquo;postgres&amp;rsquo; admin account for the server, so we can use this
for all of the system administration tasks. Type the following at the command-line (substitute in the
password you want to use for your administrator account):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo su postgres -c psql template1
&lt;span class=&quot;nv&quot;&gt;template1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# ALTER USER postgres WITH PASSWORD &amp;#39;password&amp;#39;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;template1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# \q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;That alters the password for within the database, now we need to do the same for the unix user
&amp;lsquo;postgres&amp;rsquo;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo passwd -d postgres
sudo su postgres -c passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now enter the same password that you used previously.&lt;/p&gt;

&lt;p&gt;Then, from here on in we can use both pgAdmin and command-line access (as the postgres user) to run the
database server. But before you jump into pgAdmin we should set-up the PostgreSQL admin pack that
enables better logging and monitoring within pgAdmin. Run the following at the command-line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo su postgres -c psql &amp;lt; /usr/share/postgresql/8.3/contrib/adminpack.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Finally, we need to open up the server so that we can access and use it remotely &amp;ndash; unless you only want
to access the database on the local machine. To do this, first, we need to edit the postgresql.conf
file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo gedit /etc/postgresql/8.3/main/postgresql.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, to edit a couple of lines in the &amp;lsquo;Connections and Authentication&amp;rsquo; section&amp;hellip;&lt;/p&gt;

&lt;p&gt;Change the line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;#listen_addresses = &amp;#39;localhost&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;to&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;listen_addresses = &amp;#39;*&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;and also change the line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;#password_encryption = on
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;to&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;password_encryption = on
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then save the file and close gedit.&lt;/p&gt;

&lt;p&gt;Now for the final step, we must define who can access the server. This is all done using the pg_hba.conf
file. (The following advice can also be given to you &amp;ndash; plus you don&amp;rsquo;t even need to figure out IP
addresses and subnet masks &amp;ndash; from the latest versions of pgAdmin (1.6.x). But it doesn&amp;rsquo;t hurt to know
how things work).&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo gedit /etc/postgresql/8.3/main/pg_hba.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Comment out, or delete the current contents of the file, then add this text to the bottom of the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database
# super user can access the database using some other method.
# Noninteractive
# access to all databases is required during automatic maintenance
# (autovacuum, daily cronjob, replication, and similar tasks).
#
# Database administrative login by UNIX sockets
local   all         postgres                          ident sameuser
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# &amp;quot;local&amp;quot; is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

# Connections for all PCs on the subnet
#
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host    all         all         [ip address]          [subnet mask]  md5
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;and in the last line, add in your subnet mask (i.e. 255.255.255.0) and the IP address of the machine
that you would like to access your server (i.e. 138.250.192.115). However, if you would like to enable
access to a range of IP addresses, just substitute the last number for a zero and all machines within
that range will be allowed access (i.e. 138.250.192.0 would allow all machines with an IP address
138.250.192.x to use the database server).&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s it, now all you have to do is restart the server:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo /etc/init.d/postgresql-8.3 restart
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And all should be working.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>First Gears of War 2 Footage</title>
   
   <link href="http://hocuspokus.net/2008/05/first-gears-of-war-2-footage"/>
   }
   <updated>2008-05-12T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/first-gears-of-war-2-footage</id>
   <content type="html">
     &lt;p&gt;Time to get that pre-order on, this looks like it&amp;rsquo;s going to be awesome&amp;hellip;&lt;/p&gt;

&lt;div align=&quot;middle&quot;&gt;
    &lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;
        &lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/grPS2HgyyCs&amp;hl=en&quot;&gt;&lt;/param&gt;
        &lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;
        &lt;embed
            src=&quot;http://www.youtube.com/v/grPS2HgyyCs&amp;hl=en&quot;
            type=&quot;application/x-shockwave-flash&quot;
            wmode=&quot;transparent&quot;
            width=&quot;425&quot;
            height=&quot;355&quot;&gt;
        &lt;/embed&gt;
    &lt;/object&gt;
&lt;/div&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>Orb - Live TV on iPhone</title>
   
   <link href="http://www.reghardware.co.uk/2008/05/08/iphone_orb_native/"/>
   }
   <updated>2008-05-08T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/orb-live-tv-on-iphone</id>
   <content type="html">
     &lt;p&gt;That&amp;rsquo;s it, I REALLY want an iPhone now&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You don&amp;rsquo;t need Steve Jobs' permission to watch TV on your iPhone any more. And you don&amp;rsquo;t need to pay the
cable company twice. A native Orb client for the iPhone and iPod Touch popped up on the installer
networks overnight, and Orb confirms that it&amp;rsquo;s official.&lt;/p&gt;

&lt;p&gt;The client software allows you to watch live TV on an iPhone or Touch wherever you are, in addition to
your music. You&amp;rsquo;ll need a TV card or adaptor for your PC, of course, to get the live TV. So provided you
have an internet connection, there&amp;rsquo;s no need to perform DIY transcoding using software such as Visual
Hub. The client will even transcode the video stream nicely for 2.75G Edge networks. Orb does in software
what Sling Media does in hardware.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Orb - Live TV on iPhone'&quot; href=&quot;http://hocuspokus.net/2008/05/orb-live-tv-on-iphone&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>What Do You Do With Old Versions of IE?</title>
   
   <link href="http://hocuspokus.net/2008/05/what-do-you-do-with-old-versions-of-ie"/>
   }
   <updated>2008-05-07T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/what-do-you-do-with-old-versions-of-ie</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/ie_disc.jpg&quot;
  alt=&quot;What Do You Do With Old Versions of IE?&quot;
  title=&quot;What Do You Do With Old Versions of IE?&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Was round the in-laws the other day and couldn&amp;rsquo;t help but notice this one in the garden&amp;hellip;&lt;/p&gt;

&lt;p&gt;A fine way to retire an old web browser.  At least it&amp;rsquo;s found some use&amp;hellip; :D&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Installing R/BioConductor on Ubuntu 8.04</title>
   
   <link href="http://hocuspokus.net/2008/05/installing-r-bioconductor-on-ubuntu-804"/>
   }
   <updated>2008-05-07T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/installing-r-bioconductor-on-ubuntu-804</id>
   <content type="html">
     &lt;p&gt;The new version of Ubuntu is out, (as if you haven&amp;rsquo;t heard that by now), so that means a fresh install to
play about with and working just the way I want! :D&lt;/p&gt;

&lt;p&gt;One of the tools that I currently need (for the thesis work) is &lt;a href=&quot;http://www.r-project.org/&quot;&gt;R&lt;/a&gt; and the
&lt;a href=&quot;http://www.bioconductor.org/&quot;&gt;BioConductor&lt;/a&gt; libraries. So here&amp;rsquo;s a quick run down on getting them up and
installed on Hardy&amp;hellip;&lt;/p&gt;

&lt;p&gt;First up, run these commands in a terminal:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo apt-get install build-essential g77 gfortran
sudo apt-get install refblas3 refblas3-dev zlib1g-dev
sudo apt-get install r-base
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This will then install the R base packages and some of the BioConductor packages, along with the gcc and fortran compilers and some other libraries that will be required for the next step.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo -s
R
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now at the R prompt, type the followingâ€¦&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;r&quot;&gt;source&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.bioconductor.org/biocLite.R&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
biocLite&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now sit back for a few minutes while your system configures BioConductor for you.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>If Browsers Were Women...</title>
   
   <link href="http://hocuspokus.net/2008/05/if-browser-were-women"/>
   }
   <updated>2008-05-07T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/if-browser-were-women</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/if_broswers_were_women.jpg&quot;
  alt=&quot;If Browsers Were Women...&quot;
  title=&quot;If Browsers Were Women...&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Installing VMware Tools on Ubuntu 8.04 (Hardy)</title>
   
   <link href="http://peterc.org/2008/62-how-to-install-vmware-tools-on-ubuntu-hardy-804-under-vmware-fusion.html"/>
   }
   <updated>2008-05-05T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/05/installing-vmware-tools-on-ubuntu-804-hardy</id>
   <content type="html">
     &lt;p&gt;If you&amp;rsquo;re a VMware user and want to play around with the latest version of Ubuntu in a VM (like me),
you&amp;rsquo;ll need to get the vmware-tools installed. Unfortunately, things are not quite as
&lt;a href=&quot;/2007/11/installing-vmware-tools-on-ubuntu-gutsy/&quot;&gt;straight forward as the previous release&lt;/a&gt;
of Ubuntu yet, but it was a pretty easy thanks to this
&lt;a href=&quot;http://peterc.org/2008/62-how-to-install-vmware-tools-on-ubuntu-hardy-804-under-vmware-fusion.html&quot;&gt;great guide&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The latest version of Ubuntu (8.04 a.k.a. Ubuntu Hardy &amp;ndash; the world&amp;rsquo;s most popular Linux distribution)
came out yesterday on April 24th. I downloaded it right away to play with on VMware Fusion, my Mac
virtualization tool of choice (though I&amp;rsquo;ve now been told this works in VMware Workstation and VMware
Player on the PC too!). It worked pretty well out of the box, with even seamless mouse support working
right away, but I needed, of course, to install VMware Tools too, as any good VMware user would do. From
there, things turned sour, and I was bombarded with error messages &amp;hellip;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Installing VMware Tools on Ubuntu 8.04 (Hardy)'&quot; href=&quot;http://hocuspokus.net/2008/05/installing-vmware-tools-on-ubuntu-804-hardy&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Spanning Sync 2.0 to Add Contact Sync</title>
   
   <link href="http://blog.spanningsync.com/2008/04/video-preview-s.html"/>
   }
   <updated>2008-04-22T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/spanning-sync-20-to-add-contact-sync</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;m already a lover of &lt;a href=&quot;http://www.spanningsync.com/&quot;&gt;Spanning Sync&lt;/a&gt;, version 2 promises to have contact
syncing between all your Google apps with the Mac address book. This could be very very good. Check the
link for a video of it in action.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;People know Spanning Sync for its ability to sync Apple iCal with Google Calendar. In fact, more than
70,000 people have used Spanning Sync to do just that. But calendars are only one part of the equation.&lt;/p&gt;

&lt;p&gt;Our users tell us that they also need to be able to sync their Mac Address Book with their contacts in
Gmail and Google Apps. So Spanning Sync 2.0 does both calendars and contacts.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Spanning Sync 2.0 to Add Contact Sync'&quot; href=&quot;http://hocuspokus.net/2008/04/spanning-sync-20-to-add-contact-sync&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>AVG Free Gets an Update</title>
   
   <link href="http://www.theregister.co.uk/2008/04/22/avg8_free/"/>
   }
   <updated>2008-04-22T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/avg-free-gets-an-update</id>
   <content type="html">
     &lt;p&gt;If you, like most of the world, are a Windows user, having to run things such as anti-virus and
anti-spyware programs are just a part of everyday life to try and keep your system running nicely.&lt;/p&gt;

&lt;p&gt;My personal favorite, that I install on all the Windows PCs that I regularly have to keep in check
(family, friends who haven&amp;rsquo;t seen the light of Mac or Linux etc.) is &lt;a href=&quot;http://free.grisoft.com/&quot;&gt;AVG&lt;/a&gt;.
Great news is that AVG plan to release the new free edition of AVG 8.0 on Thursday now with added spyware
protection to boot! Great news, and sounds like it could be an essential upgrade.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;AVG Technologies plans to release a revamped version of its popular, free anti-malware scanner on
Thursday.&lt;/p&gt;

&lt;p&gt;Version 8.0 of the software will add anti-spyware and safe search features to its core anti-virus engine.
Safe surfing features, that give users warnings about visiting insecure websites all the time not just
when they search, will remain a paid feature of AVG&amp;rsquo;s full fat product.&lt;/p&gt;

&lt;p&gt;Both the safe search and safe surfing features use Linkscanner technology, acquired by AVG when it bought
Exploit Prevention Labs last December&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'AVG Free Gets an Update'&quot; href=&quot;http://hocuspokus.net/2008/04/avg-free-gets-an-update&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Some People Have Waaay Too Much Time...</title>
   
   <link href="http://www.engadget.com/2008/04/21/rancilios-silvia-espresso-machine-gets-hacked-via-the-arduino-a/"/>
   }
   <updated>2008-04-21T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/some-people-have-waaay-too-much-time</id>
   <content type="html">
     &lt;p&gt;This is one way to get your perfect coffee fix&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you&amp;rsquo;re both a coffee and gadget freak, this project by DIY'er Tim Hirzel will probably be a notably
inspiring hack. By combining a fancy-pants Rancilio Silvia espresso machine, the multi-purpose Arduino
micro-controller, a Wii nunchuk, and some seriously high-level hacking, Tim has created a one-of-a-kind
masterpiece. The typically straight-up espresso maker is now controlled electronically, allowing
integration of a calendar, sleep timer, wake-up alarm, and temperature regulation. The system also allows
a user to time its functions (to get that perfect cup of espresso), and the nunchuk can be used to alter
settings on the unit. Be sure and take a look at the video after the break to see this mod in action.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Some People Have Waaay Too Much Time...'&quot; href=&quot;http://hocuspokus.net/2008/04/some-people-have-waaay-too-much-time&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Open Sauce?</title>
   
   <link href="http://www.opensourcefood.com/"/>
   }
   <updated>2008-04-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/open-sauce</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/open-source-food.png&quot;
  alt=&quot;Open Sauce?&quot;
  title=&quot;Open Sauce?&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Okay, really bad pun&amp;hellip;&lt;/p&gt;

&lt;p&gt;Just come across this website &lt;a href=&quot;http://www.opensourcefood.com&quot;&gt;Open Source Food&lt;/a&gt;. It&amp;rsquo;s yet another social
networking site, but the difference with this one is that it is centered around one of my favorite things
&amp;ndash; Food!&lt;/p&gt;

&lt;p&gt;Should be well worth a look for a few interesting recipes.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Amazing Recipes. Delicious Food. Beautiful Photography. Created and rated by you and fellow food-lovers
from all over the world. Open Source Food is your gastronomic hub where every visit will bring
inspiration and a rumbling belly&amp;hellip;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Open Sauce?'&quot; href=&quot;http://hocuspokus.net/2008/04/open-sauce&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Fring for iPhone</title>
   
   <link href="http://www.engadget.com/2008/04/15/iphone-gets-voip-and-chat-options-thanks-to-fring/"/>
   }
   <updated>2008-04-16T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/fring-for-iphone</id>
   <content type="html">
     &lt;p&gt;Dan in the office has &lt;a href=&quot;http://www.fring.com&quot;&gt;Fring&lt;/a&gt; on his Nokia and it seems pretty cool &amp;ndash; this looks
quite useful, let&amp;rsquo;s just hope the
&lt;a href=&quot;http://iphone.macworld.com/2008/04/voip_on_iphone_not_home_yet_le.php&quot;&gt;call quality gets improved&lt;/a&gt;
though (3G should help this out).&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Sure, the iPhone is cool looking, works out a lot, and is really good at math&amp;hellip; but it can&amp;rsquo;t do VoIP,
can it? Well, yes it can &amp;mdash; and you can, thanks to a company called Fring and a piece of ingenious
software (for jailbreakers only). Using the native app, it&amp;rsquo;s now possible to place and receive calls via
your WiFi connection, thus making AT&amp;amp;T CEOs cry like little babies. Besides doing Skype and the like,
the app also lets you connect for chats via MSN Messenger, ICQ, GTalk, SIP, Twitter, AIM, and Yahoo!,
which should make this an attractive package even if you don&amp;rsquo;t want to harness the raw power of IP
telephony. You can get the application for free by loading up Installer with the company&amp;rsquo;s repo. Check
the video after the break to see the magic happen.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Check out the link for a video of it in action.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Fring for iPhone'&quot; href=&quot;http://hocuspokus.net/2008/04/fring-for-iphone&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>iPhone &pound;100 Cheaper? Yes Please!</title>
   
   <link href="http://www.reghardware.co.uk/2008/04/15/o2_to_cut_iphone_price/"/>
   }
   <updated>2008-04-15T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/iphone-100-cheaper-yes-please</id>
   <content type="html">
     &lt;p&gt;Ohh, now the question is &amp;ndash; do we wait for the 3G version or not&amp;hellip; (I think this &amp;ndash; if it is true &amp;ndash; is a
pretty good sign that the 3G version is around the corner).&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;O2 will cut &amp;pound;100 off the price of the Apple iPhone tomorrow, it has been claimed. Carphone
Warehouse is said to be planning to match the move.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s no official confirmation yet, of course. The claim was
&lt;a href=&quot;http://www.mobiletoday.co.uk/O2_to_cut_the_price_of_the_iPhone_by_&amp;amp;pound;100.html&quot;&gt;made&lt;/a&gt; today by
website Mobile Today.&lt;/p&gt;

&lt;p&gt;If O2 and CW do knock &amp;pound;100 off the price of the iPhone, taking the handset&amp;rsquo;s price to &amp;pound;169,
it will undoubtedly further fuel speculation that carriers are clearing out stocks of the 2.5G phone
ahead of the widely anticipated introduction of a 3G version in June.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'iPhone &amp;pound;100 Cheaper? Yes Please!'&quot; href=&quot;http://hocuspokus.net/2008/04/iphone-100-cheaper-yes-please&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>COD4 is Awesome!</title>
   
   <link href="http://hocuspokus.net/2008/04/cod4-is-awesome"/>
   }
   <updated>2008-04-13T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/cod4-is-awesome</id>
   <content type="html">
     &lt;p&gt;Late to the game as always, I finally got onto &lt;a href=&quot;http://www.callofduty.com/&quot;&gt;COD4&lt;/a&gt; last night.&lt;/p&gt;

&lt;p&gt;Oh. my. god. This game is frigging awesome!&lt;/p&gt;

&lt;p&gt;I had no idea what I was doing half the time, and spent most of the night watching replays of how I died,
but I haven&amp;rsquo;t had a laugh like this with a game since &lt;a href=&quot;http://gearsofwar.com/&quot;&gt;Gears of War&lt;/a&gt; came out.
&lt;a href=&quot;http://www.halo3.com/&quot;&gt;Halo 3&lt;/a&gt; was good, great even &amp;ndash; but it just didn&amp;rsquo;t have that stand out &amp;lsquo;you&amp;rsquo;re
gonna remember this&amp;rsquo; feeling to it, it was just more, well, Halo.&lt;/p&gt;

&lt;p&gt;Maybe this is because COD4 is my first COD game and i&amp;rsquo;ve just been missing out all of these years (the
WWII stuff never really appealed).&lt;/p&gt;

&lt;p&gt;Anyway, enough of my rambling&amp;hellip; If you own a machine capable of gaming in anyway, be it Xbox, PS3, Wii,
PC, your toaster, whatever &amp;ndash; you need to try out COD4.&lt;/p&gt;

&lt;p&gt;Oh, and for real giggles, try an 18 player free-for-all on the world&amp;rsquo;s smallest map &amp;lsquo;Shipment&amp;rsquo;. I think I
had on average about 5 seconds between respawns! :D&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Quake 3 for the iPod Touch/iPhone</title>
   
   <link href="http://www.engadget.com/2008/04/05/quake-3-hits-the-ipod-touch-makes-for-portable-lan-party/"/>
   }
   <updated>2008-04-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/quake-3-for-the-ipod-touch-iphone</id>
   <content type="html">
     &lt;p&gt;I somehow managed to miss this one. Quake 3 running on hacked iPod Touch&amp;rsquo;s! They keep making it harder
and harder to resist an iPhone/iPod Touch&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Future generations will most likely divide the timeline of history at this point: when Quake 3 achieved
motion-sensing, wireless network play on two iPod touches. Just think, less than a year ago we were
salivating (or at least mildly enthused) at the prospect of rocking Doom on this thing, and now Quake 3
Arena is yours for the taking &amp;mdash; or at least will be once we get any sort of hard info on this app.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Quake 3 for the iPod Touch/iPhone'&quot; href=&quot;http://hocuspokus.net/2008/04/quake-3-for-the-ipod-touch-iphone&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>London Teen Orders 'cab, innit'</title>
   
   <link href="http://www.theregister.co.uk/2008/04/11/cab_innit/"/>
   }
   <updated>2008-04-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/london-teen-orders-cab-innit</id>
   <content type="html">
     &lt;p&gt;This made me chuckle so much I had to link to it!
&lt;a href=&quot;http://www.urbandictionary.com/define.php?term=omgi&quot;&gt;Omgi&amp;rsquo;s&lt;/a&gt; need to be stopped&amp;hellip; ;)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A 19-year-old Saaarf London girl has been advised to use the Queen&amp;rsquo;s English on the phone after her hunt
for a cab to whisk her to Bristol airport ended less than satisfactorily.&lt;/p&gt;

&lt;p&gt;According to the Daily Mail, the unnamed teen rang directory enquiries two weeks ago and initially
requested a number for a &amp;ldquo;Joe Baxi&amp;rdquo; firm. The nonplussed operator told her she couldn&amp;rsquo;t find anyone by
that name, to which the lass replied: &amp;ldquo;It ain&amp;rsquo;t a person, it&amp;rsquo;s a cab, innit.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;The enlightened operator duly put her through to Bishop&amp;rsquo;s Stortford-based retail display supplier
Displaysense, where she &amp;ldquo;spoke to an equally bemused saleswoman&amp;rdquo; before thundering: &amp;ldquo;Look love, how hard
is it? All I want is your cheapest cab, innit. I need it for 10am. How much is it?&amp;rdquo;&lt;/p&gt;

&lt;p&gt;The answer was &amp;pound;180, and with the deal done by credit card, Displaysense obliged by delivering a
display cabinet to her door the next morning.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'London Teen Orders 'cab, innit''&quot; href=&quot;http://hocuspokus.net/2008/04/london-teen-orders-cab-innit&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>10 Ways to Instantly DEcrease Productivity on your Mac</title>
   
   <link href="http://macenstein.com/default/archives/1251"/>
   }
   <updated>2008-04-02T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2008/04/10-ways-to-instantly-decrease-productivity-on-your-mac</id>
   <content type="html">
     &lt;p&gt;A great guide to help you in &lt;strong&gt;not&lt;/strong&gt; getting things done. :D&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Sure, we&amp;rsquo;ve all read those lists of tweaks you can make to your system to increase productivity, but what
if you&amp;rsquo;re not in such an all-fired hurry to get things done? What if you&amp;rsquo;re already plenty efficient, and
actually need to &lt;strong&gt;slow things&lt;/strong&gt; down a bit until that five o'clock whistle blows? Well, lucky for you,
we&amp;rsquo;ve compiled a list of the top ten best ways to slow down your system, and decrease productivity.
Please feel free to add your favorites in the comments. (Oh, and we by no means recommend you do any of
these to your friends' computers, even if it IS April 1st).&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to '10 Ways to Instantly DEcrease Productivity on your Mac'&quot; href=&quot;http://hocuspokus.net/2008/04/10-ways-to-instantly-decrease-productivity-on-your-mac&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Unix Toolbox</title>
   
   <link href="http://cb.vu/unixtoolbox.xhtml"/>
   }
   <updated>2008-03-23T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/03/unix-toolbox</id>
   <content type="html">
     &lt;p&gt;Found this via a &lt;a href=&quot;http://digg.com/linux_unix/Biggest_Unix_Cheat_Sheet&quot;&gt;post on Digg&lt;/a&gt;. A very useful read
if you want to get some more advanced things done in Unix.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This document is a collection of Unix/Linux/BSD commands and tasks which are useful for IT work or for
advanced users. This is a practical guide with concise explanations, however the reader is supposed to
know what s/he is doing.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Unix Toolbox'&quot; href=&quot;http://hocuspokus.net/2008/03/unix-toolbox&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Developing Rails Applications on Mac OS X Leopard</title>
   
   <link href="http://developer.apple.com/tools/developonrailsleopard.html"/>
   }
   <updated>2008-03-16T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/03/developing-rails-applications-on-mac-os-x-leopard</id>
   <content type="html">
     &lt;p&gt;First in a series of three articles from Apple on Ruby on Rails development on Mac OS X Leopard.
Definitely worth a bookmark.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ruby on Rails is a popular and powerful open source web framework for rapidly creating high-quality web
applications to help you keep up with the speed of the Web. Rails is thriving on Mac OS X, and Leopard
comes pre-installed with Ruby, Rails, Mongrel, Capistrano, Subversion, and other tools that help to
streamline the development and deployment of Rails applications. In addition, the Organizer feature of
XCode 3.0 keeps your development workflow efficient.&lt;/p&gt;

&lt;p&gt;This article gives you a full tour of Ruby on Rails 2.0 on Leopardâ€”starting with building a web
application using the latest Rails features with Xcode 3.0, and finishing with deploying the application
to a production server running Leopard Server. Along the way we&amp;rsquo;ll explore unique features and benefits
that Leopard brings to the party. In the end you&amp;rsquo;ll be better equipped to consider the advantages of
powering your web application with Rails on Leopard.&lt;/p&gt;

&lt;p&gt;This is the first in a series of three articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This article on Development, where you learn to build a basic RESTful Rails application using Xcode 3.0;&lt;/li&gt;
&lt;li&gt;Customization, where we discuss working with views and web forms, adding AJAX support, and supporting an iPhone interface;&lt;/li&gt;
&lt;li&gt;Deployment, where we set up version control, write a Capistrano recipe, and deploy on Leopard Server.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Together they will give you a great start in working with Rails on Mac OS X Leopard.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Developing Rails Applications on Mac OS X Leopard'&quot; href=&quot;http://hocuspokus.net/2008/03/developing-rails-applications-on-mac-os-x-leopard&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>IE8 Will Be Standards-Compliant By Default</title>
   
   <link href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx?CommentPosted=true#commentmessage"/>
   }
   <updated>2008-03-08T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/03/ie8-will-be-standards-compliant-by-default</id>
   <content type="html">
     &lt;p&gt;I have to say that I&amp;rsquo;m quite surprised at this u-turn, but hell it&amp;rsquo;s great news! :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We&amp;rsquo;ve decided that IE8 will, by default, interpret web content in the most standards compliant way it
can. This decision is a change from what we&amp;rsquo;ve posted previously.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'IE8 Will Be Standards-Compliant By Default'&quot; href=&quot;http://hocuspokus.net/2008/03/ie8-will-be-standards-compliant-by-default&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Bio-Linux - Bioinformatics Tools for Linux</title>
   
   <link href="http://hocuspokus.net/2008/03/bio-linux-bioinformatics-tools-for-linux"/>
   }
   <updated>2008-03-07T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/03/bio-linux-bioinformatics-tools-for-linux</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://nebc.nox.ac.uk/biolinux.html&quot;&gt;Bio-Linux&lt;/a&gt; is a specialised Linux disro that provides both standard
and cutting edge bioinformatics software tools on a Linux base.&lt;/p&gt;

&lt;p&gt;I wrote a post on my old blog a little while back now detailing how to use the packages from Bio-Linux in
&lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu Linux&lt;/a&gt;, but it got missed in the migration (sorry to all those who have
been searching for it). Here&amp;rsquo;s a repost and update for Ubuntu 7.10&amp;hellip;&lt;/p&gt;

&lt;p&gt;Log into your system and open up a terminal, then follow these steps:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo gedit /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Add the following lines to the end of the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;# Bio-Linux package repository
deb http://envgen.nox.ac.uk/bio-linux/ unstable bio-linux
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save and close the file, now back at the terminal type the following (Note that we need to install the
&lt;code&gt;bio-linux-staden&lt;/code&gt; package, without this we&amp;rsquo;d have to do a bit more hacking in config files to stop
getting errors whenever we open up a terminal):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo apt-get update
sudo apt-get install bio-linux-base-directories bio-linux-staden
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Next step is to set-up your environment for Bio-Linux&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo gedit /etc/bash.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Add the following lines to the end of the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Set up Bio-Linux Environment&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; /usr/local/bioinf/config_files/aliasrc
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; /usr/local/bioinf/config_files/bioenvrc
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save and close the file.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s it, now all of the packages available through Bio-Linux are now available to you in Ubuntu. One
final word of warning&amp;hellip; I&amp;rsquo;ve noticed that a few of the packages are a little out of date, (the Bio-Linux
version of Taverna is 1.4, but 1.7 is &lt;a href=&quot;http://taverna.sourceforge.net/&quot;&gt;now available&lt;/a&gt;) so it might
be worth checking the version numbers before installing things.&lt;/p&gt;

&lt;p&gt;The other thing to note with the Bio-Linux version of Taverna &amp;ndash; it doesn&amp;rsquo;t start properly without a
little bit of hacking&amp;hellip; :( (If you decided to go with the Bio-Linux version, you can launch it by
running the following in the terminal: &lt;code&gt;/usr/local/bioinf/taverna/taverna/runme.sh&lt;/code&gt;).&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Oh god, 8 is on the way...</title>
   
   <link href="http://blog.wired.com/monkeybites/2008/02/microsoft-quiet.html"/>
   }
   <updated>2008-02-25T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/oh-god-8-is-on-the-way</id>
   <content type="html">
     &lt;p&gt;Hold onto your hats people, it looks like Microsoft is getting IE8 somewhere near usable. It&amp;rsquo;s started a
private beta test already with a public one set to follow&amp;hellip; Let&amp;rsquo;s hope they do a u-turn on this stupid
version meta tag and have the damn thing render in &amp;ldquo;super-standards&amp;rdquo; mode from the outset.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Microsoft has sent out invitations to a select number of testers allowing them to participate in a
&amp;ldquo;limited technical beta program&amp;rdquo; for the upcoming Internet Explorer 8. The announcement also says that
there will be a public beta as well, once the invitation version is complete.&lt;/p&gt;

&lt;p&gt;So far we know that Microsoft claims that IE 8 will pass the ACID 2 compatibility test and include
support for a controversial version tag, which will allow web developers to force the browser into
&amp;ldquo;super-standards mode&amp;rdquo; enabling the browser to correctly render webpages that adhere to the W3C&amp;rsquo;s
standards.&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;ve written before about the
&lt;a href=&quot;http://blog.wired.com/monkeybites/2008/01/saving-the-web.html&quot;&gt;contentious debate surrounding the so-called version tag&lt;/a&gt;,
but the basic idea is that website developers will be able to add a meta tag to their pages telling IE
how it should render the page in traditional mode (non-standard IE 6-style rendering), standards mode (IE
7&amp;rsquo;s half-baked concept of standards) and super standards mode (where IE will render similar to the way
Firefox, Opera and Safari have been doing for the last five years).&lt;/p&gt;

&lt;p&gt;A number of developers have decried the meta-tag flagging as a way of versioning the web, which they feel
is a bad idea. But regardless of how the meta-tag might play out, we find it interesting that, if the
rumors are to be believed, IE 8 will automatically render in traditional mode.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Oh god, 8 is on the way...'&quot; href=&quot;http://hocuspokus.net/2008/02/oh-god-8-is-on-the-way&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Gears of War 2 - November</title>
   
   <link href="http://www.reghardware.co.uk/2008/02/21/gears_of_war_2_release/"/>
   }
   <updated>2008-02-21T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/gears-of-war-2-november</id>
   <content type="html">
     &lt;p&gt;This has officially just made my day! :D&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Microsoft has officially announced that the Xbox 360 sequel to the popular shooter Gears of War will
launch in November of this year.&lt;/p&gt;

&lt;p&gt;Much of the Xbox 360&amp;rsquo;s first year success was dependent on Epic&amp;rsquo;s Gears of War. It proved much more than
just substitute until Halo 3 arrived and really showed the gaming quality that the console could deliver.
In fact, many still favour Marcus Fenix over Master Chief Petty Officer John-117.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Gears of War 2 - November'&quot; href=&quot;http://hocuspokus.net/2008/02/gears-of-war-2-november&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>UK ISPs To Start Tracking Your Surfing To Serve You Ads</title>
   
   <link href="http://rss.slashdot.org/~r/Slashdot/slashdot/~3/237243781/article.pl"/>
   }
   <updated>2008-02-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/uk-isps-to-start-tracking-your-surfing-to-serve-you-ads</id>
   <content type="html">
     &lt;p&gt;Don&amp;rsquo;t the ISP&amp;rsquo;s already have a revenue stream?!? I mean I &lt;strong&gt;do&lt;/strong&gt; pay for my internet connection, why on
earth would they think that i&amp;rsquo;d like adverts shoved down my throat as well! O2/Be &amp;ndash; you better not be
looking into this&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;TechDirt has an interesting article about a UK-based company that is trying to work with ISPs to make use
of user surfing data to &lt;a href=&quot;http://techdirt.com/articles/20080218/024203278.shtml&quot;&gt;serve targeted ads&lt;/a&gt;.
&amp;ldquo;Late last year, we heard about a company that was trying to work with ISPs to make use of that data
themselves to &lt;a href=&quot;http://www.techdirt.com/articles/20071211/024003.shtml&quot;&gt;insert their own ads&lt;/a&gt; based on
your surfing history &amp;mdash; and now we&amp;rsquo;ve got the first report of some big ISPs moving into this realm. Over
in the UK three big ISPs, BT, Carphone Warehouse and Virgin Media have announced plans to
&lt;a href=&quot;http://www.iht.com/articles/2008/02/15/business/AD18.php&quot;&gt;use your clickstream data&lt;/a&gt; to insert relevant
ads as you surf through a new startup called Phorm.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'UK ISPs To Start Tracking Your Surfing To Serve You Ads'&quot; href=&quot;http://hocuspokus.net/2008/02/uk-isps-to-start-tracking-your-surfing-to-serve-you-ads&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>R.I.P. HD DVD</title>
   
   <link href="http://www.reghardware.co.uk/2008/02/19/tosh_drops_hd_dvd/"/>
   }
   <updated>2008-02-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/rip-hd-dvd</id>
   <content type="html">
     &lt;p&gt;Boy am I glad I didn&amp;rsquo;t buy that HD DVD player for my Xbox 360&amp;hellip; :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Toshiba has abandoned HD DVD &amp;ldquo;following recent major changes in the market&amp;rdquo;, it announced this morning.
The company spun the failure of its favourite format as a move made to strengthen the industry.&lt;/p&gt;

&lt;p&gt;The consumer electronics giant said it will &amp;ldquo;no longer develop, manufacture and market HD DVD players and
recorders&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;It will begin to reduce shipments of HD DVD players to retail channels, aiming to stop shipping product
by the end of March.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'R.I.P. HD DVD'&quot; href=&quot;http://hocuspokus.net/2008/02/rip-hd-dvd&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>HP 2133 UMPC</title>
   
   <link href="http://www.engadget.com/2008/02/19/hps-umpc-2133-revealed/"/>
   }
   <updated>2008-02-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/hp-2133-umpc</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/hp-2133.jpg&quot;
  alt=&quot;HP 2133 UMPC&quot;
  title=&quot;HP 2133 UMPC&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.engadget.com/&quot;&gt;Engadget&lt;/a&gt; are running a story with pics for HP&amp;rsquo;s answer to the Eee PC. It does
look quite sweet, but no details of the full spec or final price as yet.&lt;/p&gt;

&lt;p&gt;If they could pitch this about the same price as the Eee &amp;ndash; I could see this being quite sweet&amp;hellip; However,
it says that it can come with Vista or Linux &amp;ndash; my bet is that it&amp;rsquo;s going to be a touch more powerful than
the Eee (it&amp;rsquo;ll need to be if Vista is an option!), and a shedload more cash!!! Please let me be wrong,
(on the cash point ;) )!&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'HP 2133 UMPC'&quot; href=&quot;http://hocuspokus.net/2008/02/hp-2133-umpc&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>How to Fix Microsoft's Browser Issues</title>
   
   <link href="http://www.theregister.co.uk/2008/02/19/hakon_ms_reform_plan/"/>
   }
   <updated>2008-02-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/how-to-fix-microsofts-browser-issues</id>
   <content type="html">
     &lt;p&gt;Hakon Wium Lie (CTO of Opera):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In the area of web browsers, Opera Software has proposed a specific kind of remedy &amp;ndash; that Microsoft only
be allowed to distribute standards-compliant browsers. Microsoft&amp;rsquo;s IE is bug-ridden and the company,
despite its vast resources, has shown little interest in fixing problems that cost web designers time and
sleep. IE dominates the web due to its being bundled with Windows. This forces web designers to
prioritize coding for IE. Coding for standards-compliant browsers becomes a secondary consideration.&lt;/p&gt;

&lt;p&gt;Microsoft is keenly aware of this and therefore has little interest in improving their support for
standards. They will never become standards compliant unless forced by someone in a position to demand a
change, something that users and customers are not. Requiring standard compliance would greatly lessen
Microsoft&amp;rsquo;s monopolistic stranglehold in the web browser market, would delight web developers everywhere
and would, ironically, make IE a better product.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;He&amp;rsquo;s a fan of Microsoft&amp;rsquo;s &lt;a href=&quot;http://www.alistapart.com/articles/beyonddoctype&quot;&gt;latest proposals&lt;/a&gt; in
conjunction with IE8&amp;hellip;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'How to Fix Microsoft's Browser Issues'&quot; href=&quot;http://hocuspokus.net/2008/02/how-to-fix-microsofts-browser-issues&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Breakdown of Modern Web Design</title>
   
   <link href="http://hocuspokus.net/2008/02/breakdown-of-modern-web-design"/>
   }
   <updated>2008-02-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/breakdown-of-modern-web-design</id>
   <content type="html">
     &lt;p&gt;&lt;img
  src=&quot;/images/2008/web-design.gif&quot;
  alt=&quot;Breakdown of Modern Web Design&quot;
  title=&quot;Breakdown of Modern Web Design&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Found this tongue-in-cheek look at what a web designers/developers time is
spent doing on a project&amp;hellip;  Funny, but scarily realistic!&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Stephen Fry on the Eee PC</title>
   
   <link href="http://stephenfry.com/blog/?p=39"/>
   }
   <updated>2008-02-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/02/stephen-fry-on-the-eee-pc</id>
   <content type="html">
     &lt;p&gt;I really like the Eee PC &amp;ndash; some people at work here have them, and if I could get it past the wife, i&amp;rsquo;d
happily have one! ;)&lt;/p&gt;

&lt;p&gt;Seems like the well spoken geek Stephen Fry is quite a fan too:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I am writing this article on a kind of mini John the Baptist, a system that prepares the way of the
software saviour whose coming will deliver the 90% of world computer users who suffer under Windows from
the expensive, clumsy, costly, ugly, pricey toils of Microsoft.&lt;/p&gt;

&lt;p&gt;The Asus EEE PC perched on my knee combines GNU software with a Linux kernel powered by an Intel Celeron
Mobile Processor to produce a very extraordinary little laptop. It weighs less than a kilogram, starts up
from cold in about 12 seconds and shuts down in five. It has no internal hard disk and no CD drive. It
offers 512MB of RAM, 4GB of storage and a seven-inch display; wireless, dial-out modem and ethernet
adaptors are available for networking and internet connections, three USB ports, mini-jack sockets for
headphones and microphone, a VGA out, an SD card slot and a built-in webcam. All for about &amp;pound;200 &amp;ndash;
less than the price of a show, dinner and taxi for two in London&amp;rsquo;s West End.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Stephen Fry on the Eee PC'&quot; href=&quot;http://hocuspokus.net/2008/02/stephen-fry-on-the-eee-pc&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>SitePoint CSS Reference</title>
   
   <link href="http://reference.sitepoint.com/css"/>
   }
   <updated>2008-01-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/sitepoint-css-reference</id>
   <content type="html">
     &lt;p&gt;Check out the &lt;a href=&quot;http://reference.sitepoint.com/css&quot;&gt;SitePoint CSS Reference&lt;/a&gt; &amp;ndash; useful for anyone writing
CSS.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'SitePoint CSS Reference'&quot; href=&quot;http://hocuspokus.net/2008/01/sitepoint-css-reference&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Hiding Keynote Presentations</title>
   
   <link href="http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/223758635/"/>
   }
   <updated>2008-01-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/hiding-keynote-presentations</id>
   <content type="html">
     &lt;p&gt;I don&amp;rsquo;t give many presentations these days, but this is a great tip:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you give many presentations on the Mac, chances are you&amp;rsquo;re using Apple&amp;rsquo;s Keynote presentation
software. One cool feature in Keynote is the ability to demo something on your Mac without giving away
your next slide or notes. When you&amp;rsquo;re in the middle of a presentation, just hit the &amp;ldquo;h&amp;rdquo; key on your
keyboard. This will hide the entire Keynote application and show your desktop.&lt;/p&gt;

&lt;p&gt;When you press the h key, the Keynote icon in the dock will change and include a play button. When you
want to resume your presentation, just click the Keynote icon in the dock.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2008/keynote-icon-in-dock.png&quot;
  alt=&quot;keynote-icon-in-dock.png&quot;
  title=&quot;keynote-icon-in-dock.png&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Hiding Keynote Presentations'&quot; href=&quot;http://hocuspokus.net/2008/01/hiding-keynote-presentations&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Is the MacBook Air THAT Bad?!?</title>
   
   <link href="http://daringfireball.net/linked/2008/january#thu-24-macalope"/>
   }
   <updated>2008-01-25T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/is-the-macbook-air-that-bad</id>
   <content type="html">
     &lt;p&gt;Finally, a &lt;a href=&quot;http://blogs.cnet.com/8301-13509_1-9854634-20.html?part=rss&amp;amp;tag=feed&amp;amp;subj=TheMacalope:AnAppleblog&quot;&gt;common sense&lt;/a&gt;
response to all of these MacBook Air bashing articles. I admit &amp;ndash; I don&amp;rsquo;t want one, i&amp;rsquo;d rather have a
&amp;lsquo;regular&amp;rsquo; MacBook or a MacBook Pro, but there are people out there that would want something like this&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Direct from the Canadian Ministry of Silly Punditry we learn that the MacBook Air may increase risk of
laptop loss (tip o' the antlers to Colin Morton).&lt;/p&gt;

&lt;p&gt;Indeed. The only way to ensure your laptop won&amp;rsquo;t get stolen is to buy big fat honkin' ugly ones.&lt;/p&gt;

&lt;p&gt;But, clearly, neither of those beats this gem from PC World&amp;rsquo;s Mike Barton:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.pcworld.com/staffblog/archives/006314.html&quot;&gt;MacBook Air Amiss: Time to License Mac OS X?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good question! Like &amp;ldquo;I Have Stubbed My Toe And Find It Painful: Time to Commit Suicide?&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Is the MacBook Air THAT Bad?!?'&quot; href=&quot;http://hocuspokus.net/2008/01/is-the-macbook-air-that-bad&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title> SPARQL Graduates to W3C Recommendation</title>
   
   <link href="http://developers.slashdot.org/article.pl?sid=08/01/16/198205&from=rss"/>
   }
   <updated>2008-01-17T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/sparql-graduates-to-w3c-recommendation</id>
   <content type="html">
     &lt;p&gt;I watched a presentation on this about 18 months ago at a conference and it looked pretty interesting &amp;ndash;
some good potential applications in the scientific field. Glad to see things are progressing.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;ldquo;The W3C just gave SPARQL the stamp of approval. SPARQL is a query language for the Semantic Web, and
differs from other query languages in that is usable across different data sources. There are already 14
implementations of the spec available. Most of them are free software. There are also billions of
relations out there that are query-able, thanks to the Linking Open Data project. The structured data of
Wikipedia is now query-able at DBpedia. Also, have a look at Ivan Herman&amp;rsquo;s presentations on this topic.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to ' SPARQL Graduates to W3C Recommendation'&quot; href=&quot;http://hocuspokus.net/2008/01/sparql-graduates-to-w3c-recommendation&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>CSS Gradient Text Effect</title>
   
   <link href="http://www.webdesignerwall.com/tutorials/css-gradient-text-effect/"/>
   }
   <updated>2008-01-17T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/css-gradient-text-effect</id>
   <content type="html">
     &lt;p&gt;Found this in my feeds today &amp;ndash; genius way of making very stylish headings without resorting to image
replacement.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Do you want to create fancy headings without rendering each heading with Photoshop? Here is a simple CSS
trick to show you how to create gradient text effect with a PNG image (pure CSS, no Javascript or Flash).
All you need is an empty &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; tag in the heading and apply the background image overlay using the CSS
position:absolute property. This trick has been tested on most browsers: Firefox, Safari, Opera, and even
Internet Explorer 6. Continue to read this article to find out how.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2008/shiny-headings.gif&quot;
  alt=&quot;shiny-headings.gif&quot;
  title=&quot;shiny-headings.gif&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'CSS Gradient Text Effect'&quot; href=&quot;http://hocuspokus.net/2008/01/css-gradient-text-effect&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Britain Advises Against Vista, Office 2007 for Schools</title>
   
   <link href="http://rss.slashdot.org/~r/Slashdot/slashdot/~3/215280622/article.pl"/>
   }
   <updated>2008-01-12T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/britain-advises-against-vista-office-2007-for-schools</id>
   <content type="html">
     &lt;p&gt;Although I do have to admit to liking MS Office (and indeed MS Office 2007 is good), I have to agree with
this recommendation. There is pretty much nothing MS Office could do that
&lt;a href=&quot;http://www.openoffice.org&quot;&gt;OpenOffice&lt;/a&gt; could not do for you in a school setting &amp;ndash; so why shell out all
that money for Office licenses and force the kids parents to as well (or resort to dodgy copies) when
free software is good enough. And as for Vista&amp;hellip; Linux has my vote for schools every time.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Britain Advises Against Vista, Office 2007 for Schools: &amp;ldquo;An anonymous reader writes &amp;lsquo;The British
government&amp;rsquo;s educational IT authority has issued a report advising schools in the country not to upgrade
their classroom or office systems to Windows Vista or Office 2007. According to this InformationWeek
story, the British Educational Communications and Technology Agency says costs for Vista and Office 2007
'are significant and the benefits remain unclear.&amp;rsquo; Instead, Becta is advising British schools to take a
long look at Linux and open source suites like OpenOffice.org.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Britain Advises Against Vista, Office 2007 for Schools'&quot; href=&quot;http://hocuspokus.net/2008/01/britain-advises-against-vista-office-2007-for-schools&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>SSH Shared-Key Setup - SSH Logins Without Passwords</title>
   
   <link href="http://hocuspokus.net/2008/01/ssh-shared-key-setup-ssh-logins-without-passwords"/>
   }
   <updated>2008-01-10T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/ssh-shared-key-setup-ssh-logins-without-passwords</id>
   <content type="html">
     &lt;p&gt;SSH is a great tool for remotely accessing another machine, but entering your password every time you log
into a remote box can be a pain if you would like to set-up some background scripts to connect to a
server and do something (i.e. a backup script running as a cron job). Here&amp;rsquo;s how I set-up my Mac to be
able to log into my server without the need for a password to be entered each time &amp;ndash; the instructions
should be good for any variant of Unix/Linux, but you need to take into account path names etc. on your
machine.&lt;/p&gt;

&lt;p&gt;The first thing we will do is generate a key for the SHH version 1 protocol (just in case you are
connecting to an older machine):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;ssh-keygen -t rsa1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;SSH-Keygen will respond with something like the following:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;Generating public/private rsa1 key pair.
Enter file in which to save the key (/Users/daz/.ssh/identity):
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;At this point hit enter then you will be prompted for a passphrase &amp;ndash; this is a form of password that will
be used to generate your unique keys and can contain any set of characters and spaces &amp;ndash; something like
&lt;em&gt;&amp;quot;I&amp;rsquo;m really liking all of this geeky nonsense!&amp;quot;&lt;/em&gt; is a perfectly acceptable passphrase &amp;ndash; just
whatever you do, don&amp;rsquo;t use an empty passphrase. After entering (and confirming) your passphrase you will
get the following output:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;Your identification has been saved in /Users/daz/.ssh/identity.
Your public key has been saved in /Users/daz/.ssh/identity.pub.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This means that our identity keys have been generated. Now we just need to create a pair of keys for the
SSH2 protocol &amp;ndash; you can use the same or different passphrases for these keys &amp;ndash; it&amp;rsquo;s up to you&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;ssh-keygen -t dsa
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;ssh-keygen -t rsa
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You should now have three sets of keys in your &lt;code&gt;~/.ssh&lt;/code&gt; directory, the ones with the .pub extension are
your public keys (what we need to put on your other machines) and the others are your private keys &amp;ndash;
these must be kept safe!&lt;/p&gt;

&lt;p&gt;So, let&amp;rsquo;s use &lt;code&gt;scp&lt;/code&gt; to copy the files across:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;scp ~/.ssh/*.pub daz@MyServer:/home/daz/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then log into your server using &lt;code&gt;ssh&lt;/code&gt; and issue the following commands:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;cat identity.pub &amp;gt;&amp;gt;~/.ssh/authorized_keys
cat id_dsa.pub &amp;gt;&amp;gt;~/.ssh/authorized_keys
cat id_rsa.pub &amp;gt;&amp;gt;~/.ssh/authorized_keys
rm identity.pub id_dsa.pub id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This populates the &lt;code&gt;authorized_keys&lt;/code&gt; file on our server with the three public keys that we have just
transferred and then removes them as they&amp;rsquo;re no longer needed here.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s everything done, now all we have to do is log out of our server, and then try and log back in via
ssh &amp;ndash; a password should no longer be required!&lt;sup&gt;*&lt;/sup&gt; :)&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; This isn&amp;rsquo;t strictly true &amp;ndash; on OS X it asks you for the &lt;code&gt;id_rsa&lt;/code&gt; passphrase that we
established before, you will need to enter this, but you can then have it stored in the keychain for
hassle free use from here.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>NetNewsWire's Now Freeware</title>
   
   <link href="http://inessential.com/?comments=1&postid=3461"/>
   }
   <updated>2008-01-10T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/netnewswires-now-freeware</id>
   <content type="html">
     &lt;p&gt;This is great news &amp;ndash; &lt;a href=&quot;http://www.newsgator.com/Individuals/NetNewsWire/&quot;&gt;NetNewsWire&lt;/a&gt;, the best news
reader on the Mac is now completely free! Not just the &amp;lsquo;Lite&amp;rsquo; version anymore, but the full product! This
is my default (and only) news reader on the Mac.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There&amp;rsquo;s a &lt;a href=&quot;http://www.newsgator.com/CompanyInfo/FreeClientFAQ.aspx&quot;&gt;FAQ&lt;/a&gt; that explains a bunch of things
I&amp;rsquo;m not going to repeat it all here.&lt;/p&gt;

&lt;p&gt;But I will say that, for me personally, this is a dream come true. Every developer wants to be able to
work on the software they love, make a living at it, and give it to the world for free.&lt;/p&gt;

&lt;p&gt;Usually you get to pick two out of three if you&amp;rsquo;re lucky. Me, I get all three.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'NetNewsWire's Now Freeware'&quot; href=&quot;http://hocuspokus.net/2008/01/netnewswires-now-freeware&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>A better ls for Mac OS X</title>
   
   <link href="http://hocuspokus.net/2008/01/a-better-ls-for-mac-os-x"/>
   }
   <updated>2008-01-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2008/01/a-better-ls-for-mac-os-x</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;m a bit of a command-line freak and like to spend a fair amount of time with the terminal open&amp;hellip; As
such I like to spend a small amount of time getting the terminal set-up nicely. Other than changing the
default colour scheme and font, one (slightly) more drastic change is to replace the standard
implementation of &lt;code&gt;ls&lt;/code&gt; for one that is slightly more configurable.&lt;/p&gt;

&lt;p&gt;The default &lt;code&gt;ls&lt;/code&gt; on OS X comes from BSD and compared to the GNU/Linux alternative is slightly lacking
when it comes to changing how things look &amp;ndash; so what I like to do is replace it with the GNU &lt;code&gt;ls&lt;/code&gt;
available in &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; &amp;ndash; this allows me to get a terminal setup like below:&lt;/p&gt;

&lt;p&gt;&lt;img
  src=&quot;/images/2008/terminal.png&quot;
  alt=&quot;terminal.png&quot;
  title=&quot;terminal.png&quot;
  class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To get this done is pretty simple, once you have MacPorts set up correctly (if you can type &lt;code&gt;man port&lt;/code&gt;
and get a manual page you&amp;rsquo;re ready), just run the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install coreutils +with_default_names
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This installs the &amp;lsquo;GNU File, Shell, and Text utilities&amp;rsquo; which &lt;code&gt;ls&lt;/code&gt; is part of &amp;ndash; the extra option at the
end &lt;code&gt;+with_default_names&lt;/code&gt; makes it override (only override &amp;ndash; not replace, this is totally removable) the
default &lt;code&gt;ls&lt;/code&gt; and other tools otherwise they will have a &amp;lsquo;g&amp;rsquo; prefix &amp;ndash; i.e. &lt;code&gt;ls&lt;/code&gt; would be &lt;code&gt;gls&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next we add some extra configuration to our &lt;code&gt;~/.bash_profile&lt;/code&gt; file (i&amp;rsquo;ll include my MacPorts config in
case you get stuck above)&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# MacPorts&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/bin:/opt/local/sbin:&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MANPATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/opt/local/share/man:&lt;span class=&quot;nv&quot;&gt;$MANPATH&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Terminal colours (after installing GNU coreutils)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;38m\]&amp;quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#means no background and white lines&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;HI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;37m\]&amp;quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#change this for letter colors&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;HII&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;31m\]&amp;quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#change this for letter colors&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0;33m\]&amp;quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#this is for the current directory&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;IN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;\[\033[0m\]&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PS1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$NM[ $HI\u $HII\h $SI\w$NM ] $IN&amp;quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;$TERM&amp;quot;&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;dumb&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LS_OPTIONS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;--color=auto&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;dircolors ~/.dir_colors&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Useful aliases&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;ls $LS_OPTIONS -hF&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;ls $LS_OPTIONS -lhF&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;ls $LS_OPTIONS -lAhF&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;cd..&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;cd ..&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;clear&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;exit&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;ssh -X&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;alias&lt;/span&gt; ..&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;cd ..&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then finally we need to create a file called &lt;code&gt;.dir_colors&lt;/code&gt; in our home directory that allows us to
configure the colours used by &lt;code&gt;ls&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;touch ~/.dir_colors
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then add the contents of the file here:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.

# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.

# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM linux-c
TERM mach-color
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM xterm
TERM xterm-color
TERM xterm-debian
TERM rxvt
TERM screen
TERM screen-w
TERM vt100

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00   # global default, although everything should be something.
FILE 00     # normal file
DIR 01;36   # directory
LINK 01;37  # symbolic link.  (If you set this to &amp;#39;target&amp;#39; instead of a
            # numerical value, the color is as for the file pointed to.)
FIFO 40;33  # pipe
SOCK 01;35  # socket
DOOR 01;35  # door
BLK 40;33;01    # block device driver
CHR 40;33;01    # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file

# This is for files with execute permission:
EXEC 01;35

# List any file extensions like &amp;#39;.gz&amp;#39; or &amp;#39;.tar&amp;#39; that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a &amp;#39;#&amp;#39;)

# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32

.tar 01;31 # archives or compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z   01;31
.Z   01;31
.gz  01;31
.bz2 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
.dmg 01;31

# image formats
.jpg 01;35
.png 01;35
.gif 01;35
.bmp 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.png 01;35
.mpg 01;35
.avi 01;35
.fli 01;35
.gl 01;35
.dl 01;35

# source code files
.pl 00;33
.PL 00;33
.pm 00;33
.tt 00;33
.yml 00;33
.sql 00;33
.html 00;33
.css 00;33
.js 00;33
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Finally, all you need to do is close and re-open the Terminal.  Now we should be sorted. :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Active Scaffold Ajax CRUD Interfaces for Ruby on Rails</title>
   
   <link href="http://www.webappers.com/2007/12/30/active-scaffold-ajax-crud-interfaces-for-ruby-on-rails/"/>
   }
   <updated>2007-12-30T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/12/active-scaffold-ajax-crud-interfaces-for-ruby-on-rails</id>
   <content type="html">
     &lt;p&gt;This could be most useful in the near future&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Most web applications have many more model objects exposed on the backend, or admin side, than they do on
the front. Coding interfaces for all those models is redundant and a waste of resources when all you need
is CRUD functionality that&amp;rsquo;s smart enough to handle all your ActiveRecord associations.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://activescaffold.com/&quot;&gt;ActiveScaffold&lt;/a&gt; is a Ruby on Rails plugin that provides you with a wealth of
dynamically created goodness, just plug the ActiveScaffold into your controller, you can have a AJAXified
table interface for creating, updating, and deleting objects then. It has the following main features as
well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic handling of ActiveRecord associations&lt;/li&gt;
&lt;li&gt;Sorting, Search and Pagination&lt;/li&gt;
&lt;li&gt;Graceful JavaScript degradation&lt;/li&gt;
&lt;li&gt;RESTful API support (XML/YAML/JSON) baked in&lt;/li&gt;
&lt;li&gt;Sexy CSS styling and theming support&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/active-scaffold.png&quot; alt=&quot;active-scaffold.png&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Active Scaffold Ajax CRUD Interfaces for Ruby on Rails'&quot; href=&quot;http://hocuspokus.net/2007/12/active-scaffold-ajax-crud-interfaces-for-ruby-on-rails&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Getting your DVDs onto your Mac/iPod/iPhone</title>
   
   <link href="http://www.tuaw.com/2007/12/28/get-those-dvds-onto-your-iphone-or-mac/"/>
   }
   <updated>2007-12-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/12/getting-your-dvds-onto-your-macipodiphone</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;d looked at &lt;a href=&quot;http://handbrake.m0k.org/&quot;&gt;Handbrake&lt;/a&gt; a while back but the GUI was far too confusing for a
simpleton like me. It seems like it&amp;rsquo;s been cleaned up quite a bit now and looks rather useful! (The
&lt;a href=&quot;http://www.macworld.com/article/131321/2007/12/mwvodcast29.html&quot;&gt;little video&lt;/a&gt; giving an overview of how
to work things helps too!)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;http://handbrake.m0k.org/&quot;&gt;Handbrake&lt;/a&gt; is one of those applications that we adore here at TUAW HQ. It makes
converting DVDs into a variety of digital files a snap (though only use it with DVDs you own. Don&amp;rsquo;t be
pirates, kids). Chris Breen, of Macworld fame (and an amateur astronomer it would seem) shows us
&lt;a href=&quot;http://www.macworld.com/article/131321/2007/12/mwvodcast29.html&quot;&gt;how to use HandBrake like a pro&lt;/a&gt;. Breen
goes a step beyond &amp;lsquo;use the presets&amp;rsquo; and delves into what many of the options HandBrake offers up actually
do, and how they impact your files.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Getting your DVDs onto your Mac/iPod/iPhone'&quot; href=&quot;http://hocuspokus.net/2007/12/getting-your-dvds-onto-your-macipodiphone&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Google Chart API</title>
   
   <link href="http://www.webappers.com/2007/12/09/include-a-chart-in-a-webpage-with-google-chart-api/"/>
   }
   <updated>2007-12-13T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/12/google-chart-api</id>
   <content type="html">
     &lt;p&gt;The chaps over at Google have come up with a neat webservice &amp;ndash; an easy way to get charts onto your
webpages, the &lt;a href=&quot;http://code.google.com/apis/chart/&quot;&gt;Google Chart API&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Google has finally released Google Charts API, which returns a PNG-format image in response to a URL.
Several types of image can be generated: line, bar, and pie charts for example. For each image type you can
specify attributes such as size, colors, and labels.&lt;/p&gt;

&lt;p&gt;You can include a Chart API image in a webpage by embedding a URL within an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. When the webpage
is displayed in a browser the Chart API renders the image within the page.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Google Chart API'&quot; href=&quot;http://hocuspokus.net/2007/12/google-chart-api&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Flot: Pure Javascript Plotting Library</title>
   
   <link href="http://www.webappers.com/2007/12/06/flot-pure-javascript-plotting-library-for-jquery/"/>
   }
   <updated>2007-12-13T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/12/flot-pure-javascript-plotting-library</id>
   <content type="html">
     &lt;p&gt;Yet more chart drawing goodness. This takes a different approach to the Google model by generating really
good looking graphs all on the client-side in javascript &amp;ndash; very nice!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/flot/&quot;&gt;Flot&lt;/a&gt; is a pure Javascript plotting library for jQuery. It produces
graphical plots of arbitrary datasets on-the-fly client-side. The focus is on simple usage (all settings
are optional), attractive looks and interactive features like zooming. Although Flot is easy to use, it is
also advanced enough to be suitable for Web 2.0 data mining/business intelligence purposes which is its
original application. The plugin is targeting all newer browsers.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Flot: Pure Javascript Plotting Library'&quot; href=&quot;http://hocuspokus.net/2007/12/flot-pure-javascript-plotting-library&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Microformats Plugin for Safari</title>
   
   <link href="http://www.tuaw.com/2007/11/28/microformats-plugin-for-safari/"/>
   }
   <updated>2007-11-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/microformats-plugin-for-safari</id>
   <content type="html">
     &lt;p&gt;&lt;img src=&quot;/images/2007/microformats.png&quot; alt=&quot;microformats.png&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m a fan of the &lt;a href=&quot;http://blog.codeeg.com/tails-firefox-extension-03/&quot;&gt;Tails plugin&lt;/a&gt; for Firefox&amp;hellip;  Now Safari (on Leopard) gets its own &lt;a href=&quot;http://zappatic.net/safarimicroformats/&quot;&gt;Microformats Plugin&lt;/a&gt;! :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Of course, in order to take advantage of Microformats and perhaps bring the information they offer onto your system, you need a browser that will read them &amp;ndash; there&amp;rsquo;s Firefox plugins, and NetNewsWire 3.0&amp;rsquo;s built-in browser reads them. But what about Safari? Thanks to SIMBL, there&amp;rsquo;s a small array of Safari plugins available and from the maker of Safari Tidy comes Safari Microformats. Whenever visiting a site with Microformats, an icon appears in the right of the address bar (not unlike the RSS icon). Clicking it brings up a menu of available hCards and hCalendars you can add to Address Book and iCal.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Microformats Plugin for Safari'&quot; href=&quot;http://hocuspokus.net/2007/11/microformats-plugin-for-safari&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Google Maps for Mobile Adds Positioning</title>
   
   <link href="http://www.news.com/8301-10784_3-9824546-7.html?part=rss&subj=news&tag=2547-1_3-0-20"/>
   }
   <updated>2007-11-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/google-maps-for-mobile-adds-positioning</id>
   <content type="html">
     &lt;p&gt;Sounds like a good new feature&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Google is set on Wednesday to launch a new feature in its Google Maps
for Mobile program that automatically sets your location even in phones
that lack a global positioning system (GPS) device.&lt;/p&gt;

&lt;p&gt;Until now, if you were in a cafe and you wanted to search for a nearby
photocopy shop, you had to type in an address to set your location
before Google Maps for Mobile could provide local listings.&lt;/p&gt;

&lt;p&gt;The beta feature triangulates your approximate location based on nearby
cell towers so you don&amp;rsquo;t have to type in your address. Given that less
than 15 percent of mobile phones are GPS-enabled, this feature will be
helpful to many people.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Google Maps for Mobile Adds Positioning'&quot; href=&quot;http://hocuspokus.net/2007/11/google-maps-for-mobile-adds-positioning&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Darwin Calendar Server</title>
   
   <link href="http://hocuspokus.net/2007/11/darwin-calendar-server"/>
   }
   <updated>2007-11-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/darwin-calendar-server</id>
   <content type="html">
     &lt;p&gt;At the moment I&amp;rsquo;m a very happy user of &lt;a href=&quot;http://www.google.com/calendar&quot;&gt;Google calendar&lt;/a&gt; and
&lt;a href=&quot;http://www.spanningsync.com/&quot;&gt;Spanning Sync&lt;/a&gt; for all my scheduling needs. But the geek in me fancies
playing about with things so I&amp;rsquo;m thinking about setting up a CalDav server (when time permits) so Cat
and I can organise our lives accordingly.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s some pages I&amp;rsquo;ve been reading &lt;a href=&quot;http://trac.macosforge.org/projects/calendarserver&quot;&gt;whilst&lt;/a&gt;
&lt;a href=&quot;http://blogs.ittoolbox.com/emergingtech/macsploitation/archives/who-needs-leopard-server-calendar-server-on-linux-19982&quot;&gt;doing&lt;/a&gt;
&lt;a href=&quot;http://www.mail-archive.com/calendarserver-users@lists.macosforge.org/msg00195/LinuxBuildAndRun-DarwinCalendarServer&quot;&gt;my&lt;/a&gt;
&lt;a href=&quot;http://sicem.biz/personal/erny/dcs&quot;&gt;research&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Will possibly post more as and when I get a chance to play about with things&amp;hellip;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Color Wizard - Colour Scheme Generator</title>
   
   <link href="http://www.webappers.com/2007/11/28/color-wizard-color-scheme-generator/"/>
   }
   <updated>2007-11-29T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/color-wizard-colour-scheme-generator</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://www.colorsontheweb.com/colorwizard.asp&quot;&gt;Color Wizard&lt;/a&gt; is an online colour scheme generator.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/color-wizard.png&quot; alt=&quot;color-wizard.png&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are many of these kind of tools around, but I quite like interface on this one. The randomise
feature is also quite useful.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Color Wizard - Colour Scheme Generator'&quot; href=&quot;http://hocuspokus.net/2007/11/color-wizard-colour-scheme-generator&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Quick Look Folder and Zip plugins</title>
   
   <link href="http://www.tuaw.com/2007/11/27/quick-look-folder-and-zip-plugins/"/>
   }
   <updated>2007-11-27T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/quick-look-folder-and-zip-plugins</id>
   <content type="html">
     &lt;p&gt;This is yet another example of why I want to upgrade to Leopard&amp;hellip;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/quicklook-zip.jpg&quot; alt=&quot;quicklook-zip.jpg&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Quick Look is a beautiful thing, and in my view practically itself worth the cost of admission to Leopard.
Unfortunately, the more you get used to it, the more annoying it is when you get to a file format that
Quick Look doesn&amp;rsquo;t support. Fortunately, Apple was smart enough to design Quick Look with an open
architecture that allows developers to write their own plugins and support more file formats, which
Japanese developer Taiyo used to write two excellent plugins.&lt;/p&gt;

&lt;p&gt;The first addresses a serious annoyance with the default Quick Look implementation on folders. If you
invoke Quick Look with a folder selected in the Finder you&amp;rsquo;ll get&amp;hellip;a picture of the folder icon. Frankly,
that&amp;rsquo;s pretty stupid. Taiyo&amp;rsquo;s &lt;a href=&quot;http://d.hatena.ne.jp/t_trace/20071124/p3&quot;&gt;Folder Quick Look Plugin&lt;/a&gt; fixes
this by displaying the folder&amp;rsquo;s contents, which is how it should have been done in the first place.
Likewise, Taiyo&amp;rsquo;s &lt;a href=&quot;http://d.hatena.ne.jp/t_trace/20071125/p2&quot;&gt;Zip Quick Look Plugin&lt;/a&gt; displays the contents
of zip files.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Quick Look Folder and Zip plugins'&quot; href=&quot;http://hocuspokus.net/2007/11/quick-look-folder-and-zip-plugins&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>IconGrabber</title>
   
   <link href="http://www.tuaw.com/2007/11/27/icongrabber-easy-icon-extraction/"/>
   }
   <updated>2007-11-27T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/icongrabber</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://lipidity.com/apple/icongrabber/&quot;&gt;IconGrabber&lt;/a&gt; is a useful little application for getting an OS X
applications icon for use on the web. It&amp;rsquo;s also available as a
&lt;a href=&quot;http://lipidity.com/plugins/quicksilver/icongrabber/&quot;&gt;Quicksilver plugin&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It couldn&amp;rsquo;t be easier. Just drop the file or folder that you want
the icon from onto IconGrabber, and choose a place to save it. The
extension you choose determines the format, otherwise it defaults to
tiff. That&amp;rsquo;s it!&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'IconGrabber'&quot; href=&quot;http://hocuspokus.net/2007/11/icongrabber&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Ack, a Grep Replacement</title>
   
   <link href="http://daringfireball.net/linked/2007/november#tue-27-ack"/>
   }
   <updated>2007-11-27T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/ack-a-grep-replacement</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://petdance.com/ack/&quot;&gt;Ack&lt;/a&gt; is a grep alternative, written in pure Perl, using Perl&amp;rsquo;s regular
expressions to do your searches (just one of the long list of reasons to use this over grep). I think
i&amp;rsquo;ll be using this then&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;ack is a tool like grep, aimed at programmers with large trees of
heterogeneous source code. ack is written purely in Perl, and takes
advantage of the power of Perl&amp;rsquo;s regular expressions.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Ack, a Grep Replacement'&quot; href=&quot;http://hocuspokus.net/2007/11/ack-a-grep-replacement&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Getting Gmail IMAP Running Nicely</title>
   
   <link href="http://hocuspokus.net/2007/11/getting-gmail-imap-running-nicely"/>
   }
   <updated>2007-11-19T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/getting-gmail-imap-running-nicely</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve just managed to get my Gmail service upgraded to the new version with IMAP support, (If you&amp;rsquo;re a
user in the UK like me and are still waiting for your Gmail service to upgrade, simply navigate into your
Gmail settings and change your language settings from &amp;lsquo;English (UK)&amp;rsquo; to &amp;lsquo;English (US)&amp;rsquo;. This should make
your Gmail switch to version 2 instantly!) and as such i&amp;rsquo;ve been trawling the net for information on how
to get this all set-up nicely. By this I mean moving my mail filtering rules onto Gmail itself and
getting IMAP to play a bit more nicely with Apple Mail&amp;hellip;&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s how to get Apple Mail to work as expected, thanks to &lt;a href=&quot;http://5thirtyone.com/&quot;&gt;5ThirtyOne&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Similar steps must be taken to ensure that any emails sent, saved as drafts, or deleted are properly identified by Gmail&amp;rsquo;s servers. After completing the IMAP setup steps for Apple Mail, instructing Mail is a few simple clicks away. Once your Gmail IMAP account is added to Mail, you&amp;rsquo;ll notice your [Gmail account] in the left sidebar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Highlight &amp;lsquo;[Gmail] Sent Mail&amp;rsquo; in the sidebar and select &amp;lsquo;Mailbox&amp;rsquo; (menu bar) &gt; &amp;lsquo;Use This Mailbox For&amp;rsquo; &gt; &amp;lsquo;Sent&amp;rsquo;.&lt;/li&gt;
&lt;li&gt;Highlight &amp;lsquo;[Gmail] Drafts&amp;rsquo; in the sidebar and select &amp;lsquo;Mailbox&amp;rsquo; (menu bar) &gt; &amp;lsquo;Use This Mailbox For&amp;rsquo; &gt; &amp;lsquo;Drafts&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Highlight &amp;lsquo;[Gmail] Trash&amp;rsquo; in the sidebar and select &amp;lsquo;Mailbox&amp;rsquo; (menu bar) &gt; &amp;lsquo;Use This Mailbox For&amp;rsquo; &gt; &amp;lsquo;Trash&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Highlight &amp;lsquo;[Gmail] Spam&amp;rsquo; in the sidebar and select &amp;lsquo;Mailbox&amp;rsquo; (menu bar) &gt; &amp;lsquo;Use This Mailbox For&amp;rsquo; &gt; &amp;lsquo;Junk&amp;rsquo;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Once properly configured, managing email from Apple Mail or the iPhone will be no different from managing emails within the Gmail web client &amp;ndash; sent, drafts, trash, and junk properly sorted between your various email clients and web interface.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Read the &lt;a href=&quot;http://5thirtyone.com/archives/862&quot;&gt;full article&lt;/a&gt; for even more information (including iPhone
set-up).&lt;/p&gt;

&lt;p&gt;And the best hints for setting up slightly more complex filters in Gmail came from
&lt;a href=&quot;http://lifehacker.com/&quot;&gt;Lifehacker&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I needed to set up a filter that would apply label &amp;lsquo;work&amp;rsquo; to any
email that came from &amp;lsquo;xyz@workplace.com&amp;rsquo; OR had the word &amp;lsquo;workoholic&amp;rsquo;
in it. Unfortunately, Gmail&amp;rsquo;s inbuilt &amp;lsquo;Create a filter&amp;rsquo; feature&amp;rsquo;s
dialog boxes are connected with an AND operator. Example: if I wrote
&amp;lsquo; xyz@workplace.com&amp;rsquo; in the &amp;lsquo;from:&amp;rsquo; field of the &amp;lsquo;Create a filter&amp;rsquo;
page, and &amp;lsquo;workoholic&amp;rsquo; in the &amp;lsquo;Has the words:&amp;rsquo; field, then only emails
that came from &amp;lsquo;xyz@workplace&amp;rsquo; AND had the word &amp;lsquo;workoholic&amp;rsquo; would be
picked up by this filter. So, to get the desired result, I needed TWO
filters. Unless&amp;hellip;&lt;/p&gt;

&lt;p&gt;[&amp;hellip;]&lt;/p&gt;

&lt;p&gt;Incorporate both the conditions in the &amp;lsquo;Has the words:&amp;rsquo; field
itself! So my &amp;lsquo;Has the words&amp;rsquo; field reads as: (from:(xyz@workplace.com)
OR (workoholic)). Voila! c'est fini! But the possibilities are endless!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Read the &lt;a href=&quot;http://lifehacker.com/software/gmail/supercharge-your-gmail-filters-204781.php&quot;&gt;full article&lt;/a&gt;
for more information.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Top 10 Quicksilver Plugins</title>
   
   <link href="http://lifehacker.com/software/lifehacker-top-10/top-10-quicksilver-plug+ins-322363.php"/>
   }
   <updated>2007-11-18T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/top-10-quicksilver-plugins</id>
   <content type="html">
     &lt;p&gt;I love Quicksilver, it&amp;rsquo;s one of those applications that makes working on the Mac really really great.
Lifehacker has a quick rundown on 10 of the best plugins to help improve your Quicksilver experience:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Open source Mac utility Quicksilver isn&amp;rsquo;t just an application launcherâ€”it&amp;rsquo;s a comprehensive keyboard
interface. Launching applications and documents is just Quicksilver&amp;rsquo;s gateway drug: The more you get used
to doing things with Quicksilver, the more things you want to do with it. Out of the box Quicksilver comes
with the barest essentials, but once you add the right plug-ins that interact with menus, apps, documents,
and settings, you can accomplish more and more complex tasks from that familiar three-paned prompt. After
the jump, check out top 10 favorite Quicksilver plug-ins, and how to set them up.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Top 10 Quicksilver Plugins'&quot; href=&quot;http://hocuspokus.net/2007/11/top-10-quicksilver-plugins&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>CSS Styled Tables</title>
   
   <link href="http://veerle.duoh.com/blog/comments/a_css_styled_table_version_2/"/>
   }
   <updated>2007-11-18T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/css-styled-tables</id>
   <content type="html">
     &lt;p&gt;Veerle comes up with another look at styling tables with CSS. A great read.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In 2005 I wrote an article about styling a table with CSS. After
receiving so many requests I finally decided to give in and write
another tutorial. Seems like a popular topic and an interesting
one to share some tricks on how you can nicely style them. This
article is about the proper usage of tables, for tabular data. How you
can implement them with accessibility in mind and how to make them
appealing for the eye using CSS.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'CSS Styled Tables'&quot; href=&quot;http://hocuspokus.net/2007/11/css-styled-tables&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Mount ISO Files With Nautilus</title>
   
   <link href="http://hocuspokus.net/2007/11/mount-iso-files-with-nautilus"/>
   }
   <updated>2007-11-14T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/mount-iso-files-with-nautilus</id>
   <content type="html">
     &lt;p&gt;Here&amp;rsquo;s two short bash scripts that allow you to mount and unmount an ISO image easily within the
right-click menu in Nautilus (the file manager in Gnome):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo mkdir /media/ISO
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/.gnome2/nautilus-scripts/
gedit &lt;span class=&quot;s2&quot;&gt;&amp;quot;Mount ISO Image&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now paste this code into the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;I in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;gksudo -u root -k -m &lt;span class=&quot;s2&quot;&gt;&amp;quot;enter your password for root terminal access&amp;quot;&lt;/span&gt; /bin/echo &lt;span class=&quot;s2&quot;&gt;&amp;quot;got r00t?&amp;quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
sudo mount -o loop -t iso9660 &lt;span class=&quot;nv&quot;&gt;$I&lt;/span&gt; /media/ISO
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
exit0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save, and exit gedit.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;gedit &lt;span class=&quot;s2&quot;&gt;&amp;quot;Unmount ISO Image&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then paste this code in this file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;I in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;gksudo -u root -k -m &lt;span class=&quot;s2&quot;&gt;&amp;quot;enter your password for root terminal access&amp;quot;&lt;/span&gt; /bin/echo &lt;span class=&quot;s2&quot;&gt;&amp;quot;got r00t?&amp;quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
sudo umount &lt;span class=&quot;nv&quot;&gt;$I&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
exit0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save, and exit gedit. Now finally&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;chmod a+x *
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now you can mount and unmount ISO files by using the &amp;lsquo;Scripts&amp;rsquo; options in the right-click menu. :)&lt;/p&gt;

&lt;p&gt;Thanks to the &lt;a href=&quot;http://ubuntu.wordpress.com/2005/10/24/nautilus-script-to-mount-iso-files/&quot;&gt;Ubuntu Blog&lt;/a&gt; for
the information.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Install phpPgAdmin on Ubuntu 7.10</title>
   
   <link href="http://hocuspokus.net/2007/11/install-phppgadmin-on-ubuntu-710"/>
   }
   <updated>2007-11-14T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/install-phppgadmin-on-ubuntu-710</id>
   <content type="html">
     &lt;p class=&quot;alert&quot;&gt;
    &lt;strong&gt;Update:&lt;/strong&gt; These instructions have been tested and work fine in the
    latest version of Ubuntu (8.04, Hardy Heron).
&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.phppgadmin.org/&quot;&gt;phpPgAdmin&lt;/a&gt; is a web based GUI for administrating a
&lt;a href=&quot;http://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; database server.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s some quick notes on getting it installed easily on Ubuntu 7.10&amp;hellip;&lt;/p&gt;

&lt;p&gt;In the terminal enter the following:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo apt-get install phppgadmin
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This will set up and install all of the phpPgAdmin packages. It will also set-up and configure Apache and
php5 for you too if you haven&amp;rsquo;t installed these already.&lt;/p&gt;

&lt;p&gt;Next we need to create a symlink to phpPgAdmin so that Apache can find it:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo ln -s /etc/phppgadmin/apache.conf /etc/apache2/conf.d/phppgadmin.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now if you navigate to &lt;a href=&quot;http://localhost/phppgadmin&quot;&gt;http://localhost/phppgadmin&lt;/a&gt; you should be greeted
with the phpPgAdmin screen. If your user account has a PostgreSQL account however, you will be logged in
automagically.&lt;/p&gt;

&lt;p&gt;Optionally, if you would like to be able to use the phpPgAdmin interface as the default &amp;lsquo;postgres&amp;rsquo;
administration account, (I am assuming here that you have set-up your PostgreSQL server using my
&lt;a href=&quot;/2007/11/install-postgresql-on-ubuntu-710/&quot;&gt;set-up instructions&lt;/a&gt; and therefore have a password
protected &amp;lsquo;postgres&amp;rsquo; account and that logins require passwords.) you will need to do the following
(Please make sure you understand the security implications of allowing this type of access to your
database server &amp;ndash; if you have not secured your administration accounts, do it now!)&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo gedit /usr/share/phppgadmin/conf/config.inc.php
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now find and change the following line&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;x&quot;&gt;$conf[&amp;#39;extra_login_security&amp;#39;] = true;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;to&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&lt;span class=&quot;x&quot;&gt;$conf[&amp;#39;extra_login_security&amp;#39;] = false;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save and close gedit.  Now all you need to do is restart Apache.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo /etc/init.d/apache2 reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now if you head on over to &lt;a href=&quot;http://localhost/phppgadmin&quot;&gt;http://localhost/phppgadmin&lt;/a&gt; all should be ready
for you.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Zotero</title>
   
   <link href="http://www.zotero.org/"/>
   }
   <updated>2007-11-13T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/zotero</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt; is a new reference management tool that comes in the form of a Firefox
(and Flock) extension. It looks like it could be a very good (and free) alternative to commercial reference
management software tools like Endnote and Reference Manager. It even has plugins for
&lt;a href=&quot;http://www.zotero.org/documentation/word_processor_integration&quot;&gt;Word and OpenOffice&lt;/a&gt; for
cite-while-you-write functionality, and &lt;a href=&quot;http://dev.zotero.org/wordpress&quot;&gt;Wordpress&lt;/a&gt; so that writers of
Wordpress based blogs can ensure that their posts are cleanly imported for users of Zotero.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Zotero [zoh-TAIR-oh] is a free, easy-to-use Firefox extension to help you collect, manage, and cite your
research sources. It lives right where you do your work &amp;ndash; in the web browser itself.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If you have any potential use for reference management (i.e. if you are a student or scientist) &amp;ndash; I
seriously recommend checking this out.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Zotero'&quot; href=&quot;http://hocuspokus.net/2007/11/zotero&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Installing Apache and PHP Troubles</title>
   
   <link href="http://hocuspokus.net/2007/11/installing-apache-and-php-troubles"/>
   }
   <updated>2007-11-13T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/installing-apache-and-php-troubles</id>
   <content type="html">
     &lt;p&gt;I just recently set Apache up on my home server (more on the server at some point in the future), but I was
having problems serving up php pages. Every time I tried to access a php based page, Firefox came up asking
if I wanted to download a &amp;lsquo;.PHTML&amp;rsquo; file!!! :(&lt;/p&gt;

&lt;p&gt;Thankfully the answer (like most things with Ubuntu) was found on the
&lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=209120&quot;&gt;Ubuntu Forums&lt;/a&gt;&amp;hellip;&lt;/p&gt;

&lt;p&gt;Simply edit the file &lt;code&gt;/etc/apache2/apache2.conf&lt;/code&gt; by adding the following line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&lt;span class=&quot;nb&quot;&gt;AddType&lt;/span&gt; application/x-httpd-php .php .phtml
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now php files should be handled by the server in the way that they were intended.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>American Style Pancakes</title>
   
   <link href="http://hocuspokus.net/2007/11/american-style-pancakes"/>
   }
   <updated>2007-11-12T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/american-style-pancakes</id>
   <content type="html">
     &lt;p&gt;These are a great idea for a quick and easy dessert when there&amp;rsquo;s nothing else to hand (they saved me last
night)! Cheers to &lt;a href=&quot;http://desarapen.blogspot.com/2004/12/american-style-pancakes.html&quot;&gt;Celia&lt;/a&gt;
for the recipe.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/pancake.jpg&quot; alt=&quot;pancake.jpg&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;Ingredients&lt;/h4&gt;

&lt;p&gt;2 &amp;frac12; cups flour&lt;br /&gt;
&amp;frac14; cup sugar&lt;br /&gt;
1 Tbsp baking powder&lt;br /&gt;
&amp;frac12; tsp salt&lt;br /&gt;
2 cups milk or buttermilk&lt;br /&gt;
2 eggs &amp;ndash; beaten&lt;br /&gt;
1/3 cup vegetable oil&lt;/p&gt;

&lt;h4&gt;Method&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Mix dry ingredients in a large bowl.&lt;/li&gt;
&lt;li&gt;Mix all liquid ingredients in another bowl.&lt;/li&gt;
&lt;li&gt;Add wet to dry ingredients and stir until mixed. (If the batter looks too thick add water or milk a little at a time until you get the consistency that you want). Let rest for about 10-15 minutes.&lt;/li&gt;
&lt;li&gt;Pour onto medium hot greased pan. Once bubbles cover the surface, flip the pancake, cover pan and lower heat for about 1 minute. The cover will help the pancake to rise more.&lt;/li&gt;
&lt;li&gt;Remove from pan and serve with butter and syrup.&lt;/li&gt;
&lt;/ol&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>A First Look at Android</title>
   
   <link href="http://hocuspokus.net/2007/11/a-first-look-at-android"/>
   }
   <updated>2007-11-12T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/a-first-look-at-android</id>
   <content type="html">
     &lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;
  &lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/_avwGFsv60U?fs=1&amp;amp;hl=en_US&quot;&gt;&lt;/param&gt;
  &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;
  &lt;embed src=&quot;http://www.youtube.com/v/_avwGFsv60U?fs=1&amp;amp;hl=en_US&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;
&lt;/object&gt;


&lt;p&gt;I really thought that Android was going to be a complete turkey, but after watching some of the videos up
on YouTube it does look like it could be quite promising. If someone releases some decent hardware at a
reasonable price the iPhone could have some competition&amp;hellip;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Stacks Overlays</title>
   
   <link href="http://t.ecksdee.org/post/19001860"/>
   }
   <updated>2007-11-11T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/stacks-overlays</id>
   <content type="html">
     &lt;p&gt;This is a great idea to improve the appearance (and usability) of stacks in Leopard.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Stacks is pretty much Leopard&amp;rsquo;s only non-eyecandy change to the dock, and it had the potential to be pretty
handy, but the fact that the icon representing the stack is whatever the top file in the folder happens to
be really ruins it (for me at least). However, if you haven&amp;rsquo;t yet given up on stacks and thrown them off
your dock, there is a solution: overlaying stacks icons.&lt;/p&gt;

&lt;p&gt;In essence, these are just small-ish semi-transparent icons that are permanently our top icon. This picture
explain it best (before &amp;amp; after):&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/stacks-overlay.jpg&quot; alt=&quot;stacks-overlay.jpg&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Stacks Overlays'&quot; href=&quot;http://hocuspokus.net/2007/11/stacks-overlays&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Stephen Fry on the iPhone</title>
   
   <link href="http://stephenfry.com/blog/?p=24"/>
   }
   <updated>2007-11-10T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/stephen-fry-on-the-iphone</id>
   <content type="html">
     &lt;p&gt;Stephen Fry:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I have been using an Apple iPhone now for more than four months. This is due to an unhealthy mixture of
friendship with its designer, a slobbery and pathetic love of the new, the possession of an American
billing address (necessary until today for the activation and use of the device) and a willingness to pay
preposterous international roaming charges. It puts me in a good position however, to tell you what you&amp;rsquo;re
in for if you decide to own one of these honeys.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Stephen Fry on the iPhone'&quot; href=&quot;http://hocuspokus.net/2007/11/stephen-fry-on-the-iphone&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Broken Arrow</title>
   
   <link href="http://hocuspokus.net/2007/11/broken-arrow"/>
   }
   <updated>2007-11-08T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/broken-arrow</id>
   <content type="html">
     &lt;p&gt;&lt;img src=&quot;/images/2007/broken-arrow.jpg&quot; alt=&quot;broken_arrow.jpg&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note to self:&lt;/em&gt; Buy Broken Arrow on DVD. Caught a bit of it on TV last night &amp;ndash; I forgot just how damn
good that film is! (The soundtrack is great too)!&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Use Folder Icons in Leopard Stacks</title>
   
   <link href="http://www.stairways.com/blog/2007-11-03-leopard-dock"/>
   }
   <updated>2007-11-06T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/use-folder-icons-in-leopard-stacks</id>
   <content type="html">
     &lt;p&gt;Peter N Lewis:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The Leopard Dock shows folders as a layer of icons, which is crazy for folders as you cannot easily
recognize a folder based on its contents. Especially crazy when the folders have recognizable icons
already!&lt;/p&gt;

&lt;p&gt;Of course, here at Stairways we prefer to find solutions to problems rather than just grumble, so here is a
trivial solution. Simply create an alias to the folder, name it to sort as the first icon, and put it in
the folder.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Here&amp;rsquo;s &lt;a href=&quot;http://www.macosxhints.com/comment.php?mode=view&amp;amp;cid=92070&quot;&gt;another way&lt;/a&gt; to achieve the
same idea, but with icons sorted by date &amp;ndash; i.e. the downloads stack.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Use Folder Icons in Leopard Stacks'&quot; href=&quot;http://hocuspokus.net/2007/11/use-folder-icons-in-leopard-stacks&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Massive Data Loss Bug in Leopard</title>
   
   <link href="http://tomkarpik.com/articles/massive-data-loss-bug-in-leopard/"/>
   }
   <updated>2007-11-06T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/massive-data-loss-bug-in-leopard</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve been reading about this in a few places now.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Leopard&amp;rsquo;s Finder has a glaring bug in its directory-moving code, leading to horrendous data loss if a
destination volume disappears while a move operation is in action. I first came across it when Samba
crashed while I was moving a directory from my desktop over to a Samba mount on my FreeBSD server.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This is why you should &lt;strong&gt;NEVER&lt;/strong&gt; just move data from one drive to another &amp;ndash; copy it first, only then delete
the original.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Massive Data Loss Bug in Leopard'&quot; href=&quot;http://hocuspokus.net/2007/11/massive-data-loss-bug-in-leopard&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Use Leopards Quick Look from the Terminal</title>
   
   <link href="http://www.tuaw.com/2007/11/05/terminal-tip-use-quick-look-from-the-leopard-command-line/"/>
   }
   <updated>2007-11-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/use-leopards-quick-look-from-the-terminal</id>
   <content type="html">
     &lt;p&gt;Useful info from over at the Unofficial Apple Weblog:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;TUAW reader Shaun Haber sent us a link to his personal blog with a great post about using Leopard&amp;rsquo;s Quick
Look from the command line, which is wonderfully handy for anyone who spends a chunk of their day in
Terminal. The &lt;code&gt;qlmanage&lt;/code&gt; utility gives you direct access to many Quick Look functions; of specific interest
is the -p flag. This option displays the Quick Look generated preview for any file. So if you tell it to
&lt;code&gt;qlmanage -p foo.png&lt;/code&gt;, the image immediately pops up in a Quick Look pane.&lt;/p&gt;

&lt;p&gt;Even better, Quick Look supports slide shows. So if you &lt;code&gt;cd&lt;/code&gt; into a folder of images and run &lt;code&gt;qlmanage -p
*.jpg&lt;/code&gt;, you&amp;rsquo;ll be rewarded with a full-on presentation of your pictures.&lt;/p&gt;

&lt;p&gt;Other qlmanage flags of interest include -h (displays a help message) -t (thumbnail generation) and -f (a
zoom factor to display with).&lt;/p&gt;

&lt;p&gt;The downside of qlmanage is that it&amp;rsquo;s full of NSLog-style messages. Haber recommends you pipe the output
into /dev/null as follows: &lt;code&gt;qlmanage -p *.jpg &amp;gt;&amp;amp; /dev/null&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Use Leopards Quick Look from the Terminal'&quot; href=&quot;http://hocuspokus.net/2007/11/use-leopards-quick-look-from-the-terminal&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Phantom Hourglass Review</title>
   
   <link href="http://games.slashdot.org/article.pl?sid=07/11/05/1753209"/>
   }
   <updated>2007-11-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/phantom-hourglass-review</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve been looking forward to the release of the latest in the Zelda series.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Of all the titles in the Legend of Zelda series, some of the most-respected have been for handheld
consoles. &lt;em&gt;Link&amp;rsquo;s Awakening&lt;/em&gt;, the &lt;em&gt;Oracle&lt;/em&gt; duo, and &lt;em&gt;Minish Cap&lt;/em&gt; all manage to combine on-the-road gaming
with a certain purity of Zelda-ness. Link&amp;rsquo;s most recent adventure on the small screen, Phantom Hourglass,
generally continues this tradition and introduces a number of new elements to the property. Unique
controls, a true sequel, and cel-shaded graphics all make &lt;em&gt;Hourglass&lt;/em&gt; stand out from &amp;lsquo;traditional&amp;rsquo; Zelda
games, and together the whole hangs together fairly well.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Phantom Hourglass Review'&quot; href=&quot;http://hocuspokus.net/2007/11/phantom-hourglass-review&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Is a Domain Name an Automatic Trademark?</title>
   
   <link href="http://ask.slashdot.org/article.pl?sid=07/11/04/0239245"/>
   }
   <updated>2007-11-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/is-a-domain-name-an-automatic-trademark</id>
   <content type="html">
     &lt;p&gt;Just read this post on Slashdot:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;ldquo;I registered a descriptive domain name (something like &quot;thesimpledog.com&amp;rdquo;) and started a blog on it. About
a month later I get a threatening letter from a link farmer who owns &amp;ldquo;simpledog.com&amp;rdquo; The owner of
simpledog.com is claiming that he owns the trademark to the words simpledog even though he has no real
business or rights by that name other than a static page with some text and Adsense slapped on it. There is
no product, service or brand whatsoever. Does simply registering a two or three word domain give you
instant trademark rights to those words even though you&amp;rsquo;ve never done anything with them? Should I give up
my domain to a link farmer who is trying to bully me, or does he have a valid right to any phrase he
registers that isn&amp;rsquo;t already trademarked?&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;My opinion &amp;ndash; tell him where to go. I thought the idea of a trademark was that you had to actively be using
that name in a trade? He has no brand, no real business using that name (you can&amp;rsquo;t claim a static page full
of AdSense links is a real business), and no product. He doesn&amp;rsquo;t have any sort of case, he&amp;rsquo;s just trying to
bully the guy into give over his domain name&amp;hellip; I hate stuff like this, when I was looking for a new domain
name, every decent name I thought of was home to some troll like this. :(&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Is a Domain Name an Automatic Trademark?'&quot; href=&quot;http://hocuspokus.net/2007/11/is-a-domain-name-an-automatic-trademark&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Install PostgreSQL on Ubuntu 7.10</title>
   
   <link href="http://hocuspokus.net/2007/11/install-postgresql-on-ubuntu-710"/>
   }
   <updated>2007-11-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/install-postgresql-on-ubuntu-710</id>
   <content type="html">
     &lt;p class=&quot;alert&quot;&gt;
    If you are using the latest version of Ubuntu (8.04 - Hardy Heron), you might find these
    &lt;a href=&quot;/2008/05/install-postgresql-on-ubuntu-804/&quot;&gt;slightly updated instructions&lt;/a&gt; useful.
&lt;/p&gt;


&lt;p&gt;This quick walk-through are my notes for installing the PostgreSQL database server and the PgAdmin
administration application on Ubuntu Linux, and also set up the server so it allows access to other PC&amp;rsquo;s
on your network.&lt;/p&gt;

&lt;p&gt;Before we move on, this guide was tested on the current release of Ubuntu Linux, (7.10 &amp;ndash; Gutsy Gibbon) and
PostgreSQL 8.2, but it should also be applicable to older versions (of Ubuntu and PostgreSQL) and other
Debian based distros.&lt;/p&gt;

&lt;p&gt;Right for the basic installation, at the command-line, enter the following commands (or search for the
listed packages in synaptic if you prefer that way of working):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo apt-get install postgresql postgresql-client postgresql-contrib
sudo apt-get install pgadmin3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This installs the database server/client, some extra utility scripts and the pgAdmin GUI application for
working with the database.&lt;/p&gt;

&lt;p&gt;Now we need to reset the password for the &amp;lsquo;postgres&amp;rsquo; admin account for the server, so we can use this for
all of the system administration tasks. Type the following at the command-line (substitute in the password
you want to use for your administrator account):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo su postgres -c psql template1
template1=# ALTER USER postgres WITH PASSWORD &amp;#39;password&amp;#39;;
template1=# \q
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;That alters the password for within the database, now we need to do the same for the unix user &amp;lsquo;postgres&amp;rsquo;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo passwd -d postgres
sudo su postgres -c passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now enter the same password that you used previously.&lt;/p&gt;

&lt;p&gt;Then, from here on in we can use both pgAdmin and command-line access (as the postgres user) to run the
database server. But before you jump into pgAdmin we should set-up the PostgreSQL admin pack that enables
better logging and monitoring within pgAdmin. Run the following at the command-line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo su postgres -c psql &amp;lt; /usr/share/postgresql/8.2/contrib/adminpack.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Finally, we need to open up the server so that we can access and use it remotely &amp;ndash; unless you only want to
access the database on the local machine. To do this, first, we need to edit the postgresql.conf file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo gedit /etc/postgresql/8.2/main/postgresql.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, to edit a couple of lines in the &amp;lsquo;Connections and Authentication&amp;rsquo; section&amp;hellip;&lt;/p&gt;

&lt;p&gt;Change the line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;#listen_addresses = &amp;#39;localhost&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;to&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;listen_addresses = &amp;#39;*&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;and also change the line:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;#password_encryption = on
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;to&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;password_encryption = on
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then save the file and close gedit.&lt;/p&gt;

&lt;p&gt;Now for the final step, we must define who can access the server. This is all done using the pg_hba.conf
file. (The following advice can also be given to you &amp;ndash; plus you don&amp;rsquo;t even need to figure out IP addresses
and subnet masks &amp;ndash; from the latest versions of pgAdmin (1.6.x). However, this is not the version that ships
with Ubuntu, so i&amp;rsquo;ll leave these instructions here.)&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo gedit /etc/postgresql/8.2/main/pg_hba.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Comment out, or delete the current contents of the file, then add this text to the bottom of the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database
# super user can access the database using some other method.
# Noninteractive
# access to all databases is required during automatic maintenance
# (autovacuum, daily cronjob, replication, and similar tasks).
#
# Database administrative login by UNIX sockets
local   all         postgres                          ident sameuser
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# &amp;quot;local&amp;quot; is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

# Connections for all PCs on the subnet
#
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host    all         all         [ip address]          [subnet mask]  md5
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;and in the last line, add in your subnet mask (i.e. 255.255.255.0) and the IP address of the machine that
you would like to access your server (i.e. 138.250.192.115). However, if you would like to enable access
to a range of IP addresses, just substitute the last number for a zero and all machines within that range
will be allowed access (i.e. 138.250.192.0 would allow all machines with an IP address 138.250.192.x to
use the database server).&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s it, now all you have to do is restart the server:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo /etc/init.d/postgresql-8.2 restart
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And all should be working.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Creating New Accounts in PostgreSQL</title>
   
   <link href="http://hocuspokus.net/2007/11/creating-new-accounts-in-postgresql"/>
   }
   <updated>2007-11-05T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/creating-new-accounts-in-postgresql</id>
   <content type="html">
     &lt;p&gt;Getting a new account set up on PostgreSQL is a simple process&amp;hellip;&lt;/p&gt;

&lt;p&gt;Create our new user:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo su postgres -c createuser daz
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then you have to give this new user role a name (I called it daz), and then say &amp;lsquo;y&amp;rsquo; to the question
&amp;ldquo;Shall the new role be a superuser?&amp;rdquo; if you want the user to be an administrator.&lt;/p&gt;

&lt;p&gt;Give the user a database password (this does not have to be the same as their unix password):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;sudo su postgres -c psql
postgres=# ALTER USER daz WITH PASSWORD &amp;#39;mypassword&amp;#39;;
postgres=# \q
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Finally, give the new user a database to play with:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo su postgres -c createdb daz
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Pretty straight forward&amp;hellip; :)&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>EVE Online for Mac/Linux on Tuesday</title>
   
   <link href="http://games.slashdot.org/article.pl?sid=07/11/04/0543230"/>
   }
   <updated>2007-11-04T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/eve-online-for-maclinux-on-tuesday</id>
   <content type="html">
     &lt;p&gt;Ohhhh, I always fancied looking at EVE. Now all I need to do is get the PhD thesis out of the way and I
might have enough time to look into it. :)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The official EVE Online site has details of upcoming patch &amp;lsquo;Revelations
2.3&amp;rsquo;. Along with a number of bug-fixes to the PvP-focused Massively
Multiplayer Online Game, this game fix will offer up compatibility
with Mac OS X and Linux. Though the Mac client is a native port, Linux
will require the used of Cedega. The post suggests that if you&amp;rsquo;d like
a preview of what the game will be like on your rig, you can download
the client and tool around the test server. System requirements are
also listed, as are the distributions of Linux they are specifically
supporting: Ubuntu 7+, Suse 10+, and Linspire 6.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'EVE Online for Mac/Linux on Tuesday'&quot; href=&quot;http://hocuspokus.net/2007/11/eve-online-for-maclinux-on-tuesday&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>iPhone "Invention of the Year"???</title>
   
   <link href="http://www.iphonematters.com/article/the_iphone_winning_invention_of_the_year_is_an_embarrassment_382"/>
   }
   <updated>2007-11-03T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/iphone-invention-of-the-year</id>
   <content type="html">
     &lt;p&gt;I like the look of the iPhone &amp;ndash; I want one even. But it&amp;rsquo;s hardly the single greatest invention of the
year&amp;hellip; Thankfully someone out there has put some reasonable thought into this:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Invention of the year. Take some time and dwell on that statement for a moment. Not invention of the month.
Not invention of the week. Not gadget of the year. Invention of the year!&lt;/p&gt;

&lt;p&gt;&amp;hellip;&lt;/p&gt;

&lt;p&gt;The iPhone may be &amp;ldquo;pretty&amp;rdquo; but it certainly does not reduce pollution, protect people from hurricanes,
distributes solar energy, or allow an amputee to have a finger.&lt;/p&gt;

&lt;p&gt;This is not to say the iPhone isn&amp;rsquo;t amazing but to give it Time Magazine&amp;rsquo;s Invention of the Year is truly
an embarrassment to the magazine.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Definately gadget of the year &amp;ndash; but no way invention of the year. There are much more worthy examples in
the article, let&amp;rsquo;s face it, the iPhone won because it&amp;rsquo;ll sell magazines. I sometimes wonder about the
culture of today&amp;hellip;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'iPhone &quot;Invention of the Year&quot;???'&quot; href=&quot;http://hocuspokus.net/2007/11/iphone-invention-of-the-year&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Installing VMware Tools on Ubuntu Gutsy</title>
   
   <link href="http://hocuspokus.net/2007/11/installing-vmware-tools-on-ubuntu-gutsy"/>
   }
   <updated>2007-11-03T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/installing-vmware-tools-on-ubuntu-gutsy</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve just started to play about with the new Ubuntu (7.10 &amp;ndash; Gutsy), I have to say that I quite like it &amp;ndash; I
was a big fan of Feisty and all other Ubuntu releases previously, so this is more of the same good stuff.&lt;/p&gt;

&lt;p&gt;As I&amp;rsquo;m working with &lt;a href=&quot;http://www.vmware.com/mac&quot;&gt;VMWare Fusion&lt;/a&gt;, the first thing that needs to be done is
install the VMWare Tools. This is quite simply done with the following lines in the terminal once you have
started your VM and mounted the tools image (Virtual Machine &gt; Install VMWare Tools in the menu):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo aptitude update
sudo aptitude install build-essential linux-headers-&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname -r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
cp -a /media/cdrom/VMwareTools* /tmp/
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /tmp/
tar -vxzf VMwareTools*.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;vmware-tools-distrib/
sudo ./vmware-install.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The just accept all of the defaults for the installation package.&lt;/p&gt;

&lt;p&gt;Cheers to &lt;a href=&quot;http://ubuntu-tutorials.com/2007/10/02/how-to-install-vmware-tools-on-ubuntu-guests/&quot;&gt;Ubuntu Tutorials&lt;/a&gt;
for the info.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>And the Fastest Vista Laptop is...</title>
   
   <link href="http://www.pcworld.com/article/id,136649-page,3-c,notebooks/article.html"/>
   }
   <updated>2007-11-03T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/and-the-fastest-vista-laptop-is</id>
   <content type="html">
     &lt;p&gt;I just love articles like this&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The fastest Windows Vista notebook we&amp;rsquo;ve tested this year is a Mac. Try
that again: The fastest Windows Vista notebook we&amp;rsquo;ve tested this year
&amp;ndash; or for that matter, ever &amp;ndash; is a Mac. Not a Dell, not a Toshiba, not
even an Alienware. The $2419 (plus the price of a copy of Windows
Vista, of course) MacBook Pro&amp;rsquo;s PC WorldBench 6 Beta 2 score of 88
beats Gateway&amp;rsquo;s E-265M by a single point, but the MacBook&amp;rsquo;s score is
far more impressive simply because Apple couldn&amp;rsquo;t care less whether you
run Windows.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'And the Fastest Vista Laptop is...'&quot; href=&quot;http://hocuspokus.net/2007/11/and-the-fastest-vista-laptop-is&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Adding/Deleting Rows In TableKit Tables Revisited</title>
   
   <link href="http://hocuspokus.net/2007/11/adding-deleting-rows-in-tablekit-tables-revisited"/>
   }
   <updated>2007-11-01T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/11/adding-deleting-rows-in-tablekit-tables-revisited</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://www.millstream.com.au/view/code/tablekit/&quot;&gt;TableKit&lt;/a&gt; is a great javascript library for making
your HTML tables fully editable. However, one problem is that you can&amp;rsquo;t add or delete rows from the
tables&amp;hellip;&lt;/p&gt;

&lt;p&gt;I came up with a solution to this
&lt;a href=&quot;/2007/10/adding-deleting-rows-to-tablekit-tables/&quot;&gt;not so long ago&lt;/a&gt;, but it still had a problem
&amp;ndash; TableKit caches the tables on loading, so after we update the table body (adding or deleting a row)
the sorting and editing of the table is completely screwed! :( However, with a little more work, and
some help from one of the guys in the office &amp;ndash; we&amp;rsquo;ve finally got this cracked! :)&lt;/p&gt;

&lt;p&gt;The basic idea to the fix is, instead of updating the table body, replace the entire table with a new
one and get TableKit to do its stuff on the new table. Although this is not the ideal solution (That
would be knowing more about javascript and the dom so that we can make changes to TableKits cache as we
update the table body &amp;ndash; thus keeping the original table) &amp;ndash; this &lt;em&gt;does&lt;/em&gt; work quite well. Here&amp;rsquo;s the
details (We&amp;rsquo;re using the code from the
&lt;a href=&quot;/2007/10/adding-deleting-rows-to-tablekit-tables/&quot;&gt;previous post&lt;/a&gt; as a starting point).&lt;/p&gt;

&lt;p&gt;First, we&amp;rsquo;ll update the code from our template file (&lt;code&gt;/root/src/users/list.tt&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;[% META title = &amp;#39;User List&amp;#39; -%]

&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;users_div&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;users&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortable resizable editable&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortfirstasc noedit&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;noedit nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tfoot&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tfoot&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tbody&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;user_body&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    [% FOREACH user IN users -%]
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;[% user.id %]&amp;#39;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.id %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.firstname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.lastname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;delete&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onclick=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;deleteUser([% user.id %]); return false&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;delete&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    [% END -%]
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;br&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;add&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onclick=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;addUser(); return false&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;add a user&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then add this javascript code to the bottom of the same file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;users_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TableKit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;editAjaxURI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_update_user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]&amp;#39;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;new_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_add_user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]?timestamp=&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Updater&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users_div&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;onComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TableKit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;new_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;editAjaxURI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_update_user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;deleteUser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;new_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_delete_user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]?user_id=&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;amp;timestamp=&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;answer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Are you sure you want to delete this user?&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Updater&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users_div&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;onComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TableKit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;new_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nx&quot;&gt;editAjaxURI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_update_user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]&amp;#39;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The main differences in the above from last time round are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &amp;lsquo;users&amp;rsquo; table is now inside a div with the id &amp;lsquo;users_div&amp;rsquo;&lt;/li&gt;
&lt;li&gt;The link to add a user now calls a javascript function rather than an Ajax.Updater call directly.&lt;/li&gt;
&lt;li&gt;The functions to add and delete users are essentially the same:&lt;/li&gt;
&lt;li&gt;They create a timestamp to individually identify the new table we are going to create (this is &lt;strong&gt;the&lt;/strong&gt; most important thing here to         remember)!&lt;/li&gt;
&lt;li&gt;They then use an Ajax.Updater call to talk to the Perl controller and generate the new table with a row added or removed.&lt;/li&gt;
&lt;li&gt;Once the Ajax.Updater is complete, TableKit is then called again to make our new table editable and sortable.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That&amp;rsquo;s the template sorted, now let&amp;rsquo;s look at the controller (&lt;code&gt;/lib/MyApp/Controller/Users.pm&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;nb&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;MyApp::Controller::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;warnings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;Catalyst::Controller&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head1 NAME&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;MyApp::Controller::Users - Catalyst Controller&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head1 DESCRIPTION&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Catalyst Controller.&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head1 METHODS&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 index&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Private {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;/users/list&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 list&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Fetch all user objects and pass to users/list.tt in stash to be displayed&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;users/list.tt&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 _update_user&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Ajax method to update the users table&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_update_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 _delete_user&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Ajax method to delete users from the users table&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_delete_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Look-up our user entry&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;__return_all_users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;null&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 _add_user&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Ajax method to add users to the users table&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_add_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# create a new user...&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;firstname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;[First Name]&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lastname&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;[Last Name]&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__return_all_users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 __return_all_users&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Private method for the Users ajax interaction.&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;Returns a html table.&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;__return_all_users&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Private {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@users&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;#39;&amp;lt;table id=&amp;quot;users&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$timestamp&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;&amp;quot; class=&amp;quot;sortable resizable editable&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;thead&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;tr&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th id=&amp;quot;id&amp;quot; class=&amp;quot;sortfirstasc noedit&amp;quot;&amp;gt;Id&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th id=&amp;quot;firstname&amp;quot;&amp;gt;First Name&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th id=&amp;quot;lastname&amp;quot;&amp;gt;Last Name&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th class=&amp;quot;noedit nocol&amp;quot;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;/tr&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;/thead&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;tfoot&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;tr&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th&amp;gt;First Name&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th&amp;gt;Last Name&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;th class=&amp;quot;nocol&amp;quot;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;/tr&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;/tfoot&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;lt;tbody id=&amp;quot;user_body&amp;quot;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scalar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;@users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scalar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;@users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;new&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;rowodd&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;                 &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;roweven&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;tr class=\&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;\&amp;quot; id=\&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;\&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;          &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;          &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;firstname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;          &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lastname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;          &amp;lt;td class=\&amp;quot;nocol\&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;              &amp;lt;a class=\&amp;quot;delete\&amp;quot; href=\&amp;quot;#\&amp;quot; onclick=\&amp;quot; deleteUser(&amp;quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;); return false\&amp;quot;&amp;gt;delete&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;          &amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;#39;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;nocol&amp;quot;&amp;gt;All Users Deleted&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head1 AUTHOR&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Darren Oakley&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head1 LICENSE&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;This library is free software, you can redistribute it and/or modify&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;it under the same terms as Perl itself.&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The only real changes in the controller are a general code clean-up, and a slight change to the
&amp;lsquo;__return_all_users&amp;rsquo; method &amp;ndash; this now returns a whole table (identified by the unique timestamped id
that we generated in the javascript functions). Nothing really needed changing in the back-end.&lt;/p&gt;

&lt;p&gt;There you go! Now our TableKit based tables can be used to not only edit entries in the database, we can
now add and remove them! :)&lt;/p&gt;

&lt;p&gt;The files used in this example can be found below.&lt;/p&gt;

&lt;h4&gt;Attached Files:&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;/downloads/2007/myapp3.zip&quot; title=&quot;myapp.zip&quot; title=&quot;MyApp - v3&quot; class=&quot;archive&quot;&gt;MyApp.zip &amp;ndash; v3&lt;/a&gt;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>K2 Styles Are In...</title>
   
   <link href="http://hocuspokus.net/2007/10/k2-styles-are-in"/>
   }
   <updated>2007-10-30T00:00:00+00:00</updated>
   <id>http://hocuspokus.net/2007/10/k2-styles-are-in</id>
   <content type="html">
     &lt;p&gt;Here are my old styles for &lt;a href=&quot;http://www.wordpress.org&quot;&gt;Wordpress&lt;/a&gt; blogs and &lt;a href=&quot;http://getk2.com&quot;&gt;K2&lt;/a&gt;. Take a
look at Bix, Chameleon, Coffee, Penguin, Slick, Sparkle and Stripe. (&lt;em&gt;Note:&lt;/em&gt; They might be in need of a
bit of an update to work with the latest releases of K2 &amp;ndash; i&amp;rsquo;ll leave that as an exercise for anyone
wanting to use them ;) ).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/bix.zip&quot;&gt;bix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/chameleon.zip&quot;&gt;chameleon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/coffee.zip&quot;&gt;coffee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/penguin.zip&quot;&gt;penguin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/slick.zip&quot;&gt;slick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/sparkle.zip&quot;&gt;sparkle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/downloads/2007/stripe.zip&quot;&gt;stripe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


     
   </content>
 </entry>
 
 <entry>
   <title>Apple Wireless Keyboard LED at 40x Magnification</title>
   
   <link href="http://www.flickr.com/photos/16066408@N08/1734058747/"/>
   }
   <updated>2007-10-25T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/apple-wireless-keyboard-led-at-40x-magnification</id>
   <content type="html">
     &lt;p&gt;You know&amp;hellip; I HAD been wondering this!!!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ever wonder how the power LED shows through the aluminum of Apple&amp;rsquo;s
new wireless keyboard when it&amp;rsquo;s on, but blends into the metal when
it&amp;rsquo;s off? Here&amp;rsquo;s how.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Apple Wireless Keyboard LED at 40x Magnification'&quot; href=&quot;http://hocuspokus.net/2007/10/apple-wireless-keyboard-led-at-40x-magnification&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Visualizing your DBIC schema</title>
   
   <link href="http://blog.jrock.us/articles/Visualizing%20your%20DBIC%20schema.pod"/>
   }
   <updated>2007-10-19T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/visualizing-your-dbic-schema</id>
   <content type="html">
     &lt;p&gt;What a great idea &amp;ndash; will give this a bash next week&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you want a somewhat pretty picture of your DBIC schema (with
relationships drawn, of course), install GraphViz, SQL::Translator, and
DBICx::Deploy from the CPAN, and then run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ dbicdeploy -Ilib MyApp::Schema ~/graphs GraphViz&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;~/graphs will then contain a .sql file that is actually a png of your
schema. Rename it and see your schema in your favorite png viewing
application.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Visualizing your DBIC schema'&quot; href=&quot;http://hocuspokus.net/2007/10/visualizing-your-dbic-schema&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Remove Case-Sensitivity In Oracle</title>
   
   <link href="http://hocuspokus.net/2007/10/remove-case-sensitivity-in-oracle"/>
   }
   <updated>2007-10-18T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/remove-case-sensitivity-in-oracle</id>
   <content type="html">
     &lt;p&gt;Oracle is a great RDBMS, but the fact that searches against the database are case-sensitive can be a pain
in the butt. Here&amp;rsquo;s how you can make searches case-insensitive&amp;hellip;&lt;/p&gt;

&lt;p&gt;In SQL&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;alter&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NLS_SORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BINARY_CI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;alter&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NLS_COMP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LINGUISTIC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;For use in Perl::DBI&amp;hellip;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DBI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$dbh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DBI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;#39;dbi:Oracle:schema_name&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;RaiseError&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;AutoCommit&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;on_connect_do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;#39;alter session set NLS_SORT=BINARY_CI&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;#39;alter session set NLS_COMP=LINGUISTIC&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;die&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;Database connection not made: $DBI::errstr&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$dbh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disconnect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




     
   </content>
 </entry>
 
 <entry>
   <title>It's Official - iPhone SDK Coming Soon</title>
   
   <link href="http://www.apple.com/hotnews/"/>
   }
   <updated>2007-10-18T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/its-official-iphone-sdk-coming-soon</id>
   <content type="html">
     &lt;p&gt;Great news! Straight from the horses mouth, (well, Steve&amp;rsquo;s anyway) Apple have announced that an iPhone
SDK will be coming in February.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Let me just say it: We want native third party applications on the
iPhone, and we plan to have an SDK in developers' hands in February. We
are excited about creating a vibrant third party developer community
around the iPhone and enabling hundreds of new applications for our
users. With our revolutionary multi-touch interface, powerful hardware
and advanced software architecture, we believe we have created the best
mobile platform ever for developers.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: if that dissapears (as there seems to be no permalink for this article), have a read of
&lt;a href=&quot;http://www.macrumors.com/2007/10/17/steve-jobs-announces-3rd-party-sdk-for-iphone-for-february-2008/&quot;&gt;Mac Rumors copy&lt;/a&gt;
of the whole article.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'It's Official - iPhone SDK Coming Soon'&quot; href=&quot;http://hocuspokus.net/2007/10/its-official-iphone-sdk-coming-soon&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Spooks</title>
   
   <link href="http://hocuspokus.net/2007/10/spooks"/>
   }
   <updated>2007-10-17T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/spooks</id>
   <content type="html">
     &lt;p&gt;&lt;img src=&quot;/images/2007/spooks.gif&quot; alt=&quot;spooks.gif&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One of the only shows on TV worth watching these days came back onto the BBC last night, bloody hell was
it good!&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;ve never seen or even heard of spooks before, get yourself over to the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Spooks&quot;&gt;wikipedia entry&lt;/a&gt;, read up about it, watch the
&lt;a href=&quot;http://www.bbc.co.uk/drama/spooks/series6_ep1.shtml&quot;&gt;catch up clip&lt;/a&gt; of last nights
episode and be there next Tuesday at 9pm, BBC1!&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>MySQL 4.x to Oracle Notes</title>
   
   <link href="http://www.jebriggs.com/blog/oscon/mysql-4x-to-oracle-10g-migration-notes.html"/>
   }
   <updated>2007-10-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/mysql-4x-to-oracle-notes</id>
   <content type="html">
     &lt;p&gt;Stumbled across this useful page full of examples and notes on how MySQL 4.x and Oracle differ, and how
you can avoid complications if you want to migrate a database between the two&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;About once a year I need to migrate a medium-sized web application
using MySQL to Oracle.&lt;/p&gt;

&lt;p&gt;Usually it&amp;rsquo;s to prepare a successful intranet application for a move
to a formally supported production environment &amp;ndash; and in Silicon
Valley, that usually means Oracle.&lt;/p&gt;

&lt;p&gt;I was apologizing to Monty at OSCON this year about my latest
migration project away from MySQL.&lt;/p&gt;

&lt;p&gt;His surprising response was, &amp;ldquo;It&amp;rsquo;s not a bad thing. I don&amp;rsquo;t mind
hearing about conversions because successful migrations demonstrate
that people don&amp;rsquo;t have to worry about database lock-in.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s some notes on doing migrations.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'MySQL 4.x to Oracle Notes'&quot; href=&quot;http://hocuspokus.net/2007/10/mysql-4x-to-oracle-notes&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Adding/Deleting Rows In TableKit Tables</title>
   
   <link href="http://hocuspokus.net/2007/10/adding-deleting-rows-to-tablekit-tables"/>
   }
   <updated>2007-10-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/adding-deleting-rows-to-tablekit-tables</id>
   <content type="html">
     &lt;p class=&quot;alert&quot;&gt;
    This post has now been &lt;a href=&quot;/2007/11/adding-deleting-rows-in-tablekit-tables-revisited/&quot;&gt;updated&lt;/a&gt;.
    Please head over to the new post for something better...
&lt;/p&gt;


&lt;p&gt;Following on from my &lt;a href=&quot;/2007/09/making-editable-tables-with-catalyst-and-tablekit/&quot;&gt;previous post&lt;/a&gt; on
how to integrate the excellent &lt;a href=&quot;http://www.millstream.com.au/view/code/tablekit/&quot;&gt;TableKit&lt;/a&gt; into your
&lt;a href=&quot;http://www.catalystframework.org/&quot;&gt;Catalyst&lt;/a&gt; webapp (to make your data tables dynamically editable),
here&amp;rsquo;s how i&amp;rsquo;ve gone about adding ajax inserts and deletes so that you can add and remove data rows in
your tables.&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;ll need the code from the &lt;a href=&quot;/2007/09/making-editable-tables-with-catalyst-and-tablekit/&quot;&gt;previous post&lt;/a&gt;
to follow along.&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;re going to be using prototype to do the background ajax calls, as this is already in our app as a
requirement of TableKit. Now let&amp;rsquo;s get on with doctoring our template. First we add in a delete button
for each row of our table. Open up &lt;code&gt;/root/src/users/list.tt&lt;/code&gt; and change the code of our table to look
like the following (the changes come on lines 9, 17, 20 and 26-28):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;users&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortable resizable editable&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortfirstasc noedit&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;noedit nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;tfoot&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tfoot&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;tbody&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;user_body&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  [% FOREACH user IN users -%]
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;[% user.id %]&amp;#39;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.id %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.firstname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.lastname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nocol&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;delete&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onclick=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;userDelete([% user.id %]); return false&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;delete&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  [% END -%]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The above code adds a &amp;lsquo;delete&amp;rsquo; link into each row of the table. This link is to run a short javascript
function (called &lt;code&gt;userDelete&lt;/code&gt;) that we shall add now at the bottom of the template (within the original
javascript block):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;nx&quot;&gt;userDelete&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;answer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Are you sure you want to delete this user?&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Updater&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;user_body&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% c.uri_for(&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_delete_user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;) %]?user_id=&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This function basically asks the user to confirm that they want to delete the user entry, the sets up an
Ajax.Updater that passes the &lt;code&gt;user_id&lt;/code&gt; to be deleted to a new function in our controller (that we shall
write next) which deletes it, and then passes the new table body back to be updated on screen. Let&amp;rsquo;s now
create a new function &lt;code&gt;_delete_user&lt;/code&gt; (and a helper function &lt;code&gt;__return_all_users&lt;/code&gt;) in our user controller
&lt;code&gt;/lib/MyApp/Controller/Users.pm&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;cm&quot;&gt;=head _delete_user&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Ajax method to delete users from the users table&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_delete_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Look-up our user entry&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__return_all_users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;null&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;4&amp;quot; class=&amp;quot;nocol&amp;quot;&amp;gt;All Users Deleted&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=head2 __return_all_users&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Private method for the Users ajax interaction.&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;Returns the inner body of a html table.&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;__return_all_users&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Private {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@users&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order_by&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;id ASC&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;scalar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;@users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;new&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;rowodd&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;roweven&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;tr class=\&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;\&amp;quot; id=\&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;\&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;firstname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lastname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;td class=\&amp;quot;nocol\&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;        &amp;lt;a class=\&amp;quot;delete\&amp;quot; href=\&amp;quot;#\&amp;quot; onclick=\&amp;quot; userDelete(&amp;quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;); return false\&amp;quot;&amp;gt;delete&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;/td&amp;gt;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;      &amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$html&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;_delete_user&lt;/code&gt; function, takes the &lt;code&gt;user_id&lt;/code&gt; that we sent to it, deletes the entry from the
database, then calls the &lt;code&gt;__return_all_users&lt;/code&gt; function to rebuild the table body. This table body is
then used to update the table back on the web page.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s the delete functionality sorted, now on with the row adding&amp;hellip; Back in the template, add we add
another Ajax.Updater link below the table:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;br&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;add&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onclick=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  new Ajax.Updater( &amp;#39;user_body&amp;#39;,&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    &amp;#39;[% c.uri_for(&amp;#39;/users/_add_user&amp;#39;) %]&amp;#39;,&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;    { asynchronous: 1, }&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  ); return false &amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;add a user&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And add another new method into our controller to add a new user into the database and table:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;cm&quot;&gt;=head _add_user&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;Ajax method to add users to the users table&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;=cut&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_add_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# create a new user...&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;firstname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;[First Name]&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lastname&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;[Last Name]&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__return_all_users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$new_user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This function, like the delete function, does its business on the database, then rebuilds the table body
and sends it back to the web page.&lt;/p&gt;

&lt;p&gt;The final icing on the cake, is a little addition to our CSS to make this all look a little nicer. Open
up &lt;code&gt;/root/css/myapp.css&lt;/code&gt; and add the following to the bottom of the file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;nc&quot;&gt;.nocol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.nocol&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#fff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;tr&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.new&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#ff9697&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;outline&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.delete&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url(&amp;#39;/images/add.png&amp;#39;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;center&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;no-repeat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.delete&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url(&amp;#39;/images/delete.png&amp;#39;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;center&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;no-repeat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.delete&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.8em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And there you go. Now you can edit, add and delete users to your database and table without having to
reload the page.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2007/add-remove-tablekit.png&quot; alt=&quot;add-remove-tablekit.png&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;However, there is one small bug that needs to be squashed to make this perfect&amp;hellip; TableKit caches the
tables on page load &amp;ndash; if you have a go at re-sorting one of the tables after deleting or adding a row,
this causes the table to essentially double in size as the original cached data is reloaded onto the
screen! :( I now need to figure out a way to clean out the cache for the current table and re-initalise
TableKit. Any suggestions would be more than welcome! :)&lt;/p&gt;

&lt;p&gt;The files used in the examples can be downloaded below.&lt;/p&gt;

&lt;h4&gt;Attached Files:&lt;/h4&gt;

&lt;p&gt;&lt;a href='/downloads/2007/myapp2.zip' title='MyApp - v2' class=&quot;archive&quot;&gt;MyApp &amp;ndash; v2&lt;/a&gt;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Some Useful Catalyst Tips</title>
   
   <link href="http://blog.jrock.us/articles/Catalyst%20Tips%3A%20Part%201.pod"/>
   }
   <updated>2007-10-10T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/some-useful-catalyst-tips</id>
   <content type="html">
     &lt;p&gt;Found this small selection of tips that can come in use whilst working with Catalyst&amp;hellip;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Some Useful Catalyst Tips'&quot; href=&quot;http://hocuspokus.net/2007/10/some-useful-catalyst-tips&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Multi-Safari and IE</title>
   
   <link href="http://mir.aculo.us/2007/10/8/multi-safari"/>
   }
   <updated>2007-10-10T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/multi-safari-and-ie</id>
   <content type="html">
     &lt;p&gt;Useful tools for when you&amp;rsquo;re web developing&amp;hellip;  Been using the
&lt;a href=&quot;http://tredosoft.com/Multiple_IE&quot;&gt;Multi-IE&lt;/a&gt; for a while, but now some bright chap has made it
possible to &lt;a href=&quot;http://michelf.com/projects/multi-safari/&quot;&gt;run multiple versions of Safari&lt;/a&gt; on your Mac.&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Multi-Safari and IE'&quot; href=&quot;http://hocuspokus.net/2007/10/multi-safari-and-ie&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>X-Wing Launches, Falls Apart...</title>
   
   <link href="http://hocuspokus.net/2007/10/x-wing-launches-falls-apart"/>
   }
   <updated>2007-10-08T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/x-wing-launches-falls-apart</id>
   <content type="html">
     &lt;p&gt;Oh dear, the &lt;a href=&quot;/2007/10/rocket-powered-x-wing-model/&quot;&gt;rocket-powered X-Wing&lt;/a&gt; that was revealed
last week never made it past launch day&amp;hellip; It did get off the ground quite impressively though.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a &lt;a href=&quot;http://gizmodo.com/gadgets/boom/x+wing-rocket-launches-disintegrates-mid+air-307945.php&quot;&gt;video of the launch&lt;/a&gt;. :D&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Accidental Caps Lock Protection On Your Keyboard</title>
   
   <link href="http://rentzsch.com/notes/applesantiCAPSLOCK"/>
   }
   <updated>2007-10-08T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/accidental-caps-lock-protection-on-your-keyboard</id>
   <content type="html">
     &lt;p&gt;I&amp;rsquo;ve just got one of the new &lt;a href=&quot;http://www.apple.com/uk/keyboard/&quot;&gt;Apple wireless keyboards&lt;/a&gt;. I have to say
&amp;ndash; i&amp;rsquo;m very impressed with it! It&amp;rsquo;s incredibly thin, good to look at, and doesn&amp;rsquo;t seem to gather as much
crap in it as the old Apple keyboard. :)&lt;/p&gt;

&lt;p&gt;Little did I know that it&amp;rsquo;s even quite smart about people hitting the caps lock key by accident. I like
it even more now (as I do hit the caps lock key quite a lot by accident)!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;But I did notice something odd. I rarely use the Caps Lock key, but
often accidently bang it, missing the left Shift key. I would feel the
mistake while typing, but then I&amp;rsquo;d look down and see Caps Lock hadn&amp;rsquo;t
been engaged after all. Oh, I must have just &lt;em&gt;imagined&lt;/em&gt; my mis-strike.&lt;/p&gt;

&lt;p&gt;Over the next few weeks, this kept happening to the point where I
started questioning reality. I was &lt;em&gt;positive&lt;/em&gt; I hit it. This required
scientifical investigation.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Accidental Caps Lock Protection On Your Keyboard'&quot; href=&quot;http://hocuspokus.net/2007/10/accidental-caps-lock-protection-on-your-keyboard&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>NodeBox</title>
   
   <link href="http://nodebox.net/"/>
   }
   <updated>2007-10-05T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/nodebox</id>
   <content type="html">
     &lt;p&gt;A very interesting looking app. Some of the example images in
&lt;a href=&quot;http://nodebox.net/code/index.php/Gallery&quot;&gt;their gallery&lt;/a&gt; look fantastic!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;NodeBox is a Mac OS X application that lets you create 2D visuals
(static, animated or interactive) using Python programming code
and export them as a PDF or a QuickTime movie. NodeBox is free and
well-documented.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'NodeBox'&quot; href=&quot;http://hocuspokus.net/2007/10/nodebox&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Log/Audit Tables In Oracle</title>
   
   <link href="http://hocuspokus.net/2007/10/logaudit-tables-in-oracle"/>
   }
   <updated>2007-10-05T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/logaudit-tables-in-oracle</id>
   <content type="html">
     &lt;p&gt;One of the useful things that i&amp;rsquo;ve been asked to set-up lately is automatic logging of changes to several
of our database tables.&lt;/p&gt;

&lt;p&gt;My first thought was to do this in Perl (as the rest of the system is in Perl), but this would mean
adding extra methods and calls in the Perl code to update the database (both the original tables and the
new log tables). That seemed like a solution &amp;ndash; a pain in the arse to implement, but a solution.&lt;/p&gt;

&lt;p&gt;Thankfully one of the helpful chaps in my department suggested doing it all in the database with triggers
as this is quite common in banks and the like. What a damn fine idea! Only a little SQL to write and no
extra Perl.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s an example&amp;hellip;&lt;/p&gt;

&lt;p&gt;First, here&amp;rsquo;s the table that we want to create an audit log for:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT&amp;quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NUMBER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_BODY&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;USER&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;CREATED_DATE&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;CONSTRAINT&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;PK_COMMENT&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, we create the audit table &amp;ndash; the audit table is exactly the same as the table that we wish to keep a
log of, except for one extra column, &amp;ldquo;AUDIT_DATE&amp;rdquo;, this will keep record the date/time of when an change
occurred on the original table.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_AUDIT&amp;quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NUMBER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_BODY&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;USER&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;CREATED_DATE&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;AUDIT_DATE&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SYSTIMESTAMP&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Finally, we create the trigger to keep a log of changes to our original table.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;REPLACE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TRIGGER&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;TA_COMMENT&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;before&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COMMENT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;row&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deleting&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updating&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;insert&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;into&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comment_audit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;COMMENT_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;COMMENT_BODY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;CREATED_DATE&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;old&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COMMENT_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;old&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COMMENT_BODY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;old&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;old&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CREATED_DATE&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TRIGGER&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;TA_COMMENT&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ENABLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now whenever a delete or update action is performed on the &amp;ldquo;COMMENT&amp;rdquo; table, a record of the old values
and the date/time at which they were changed is recorded in the audit table.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Rocket-Powered X-Wing Model!</title>
   
   <link href="http://gizmodo.com/gadgets/star-wars/rocketpowered-21foot-long-xwing-model-actually-flies-updated-new-pics-show-it-even-has-builtin-r2d2-305976.php"/>
   }
   <updated>2007-10-04T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/rocket-powered-x-wing-model</id>
   <content type="html">
     &lt;p&gt;&lt;img src=&quot;/images/2007/x-wing35.jpg&quot; alt=&quot;It's a damn rocket powered x-wing!!!&quot; class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;oh. my. god. :D&lt;/p&gt;

&lt;p&gt;This is what happens when nerds have waaay too much time on their hands. Will be great to see if this
thing actually gets off the ground though! On October 10th we&amp;rsquo;ll either have our first &amp;lsquo;real&amp;rsquo; X-Wing or
one very crispy model of R2-D2!&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Rocket-Powered X-Wing Model!'&quot; href=&quot;http://hocuspokus.net/2007/10/rocket-powered-x-wing-model&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Google Maps For Mobiles</title>
   
   <link href="http://www.google.co.uk/gmm/index.html"/>
   }
   <updated>2007-10-04T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/google-maps-for-mobiles</id>
   <content type="html">
     &lt;p&gt;Dammit! This would have been VERY useful to know about last weekend whilst I was lost looking for a mates
house in Bedford (and being quite late for the house warming party)&amp;hellip;&lt;/p&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Google Maps For Mobiles'&quot; href=&quot;http://hocuspokus.net/2007/10/google-maps-for-mobiles&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Auto-Increment ID's In Oracle</title>
   
   <link href="http://hocuspokus.net/2007/10/auto-increment-ids-in-oracle"/>
   }
   <updated>2007-10-04T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/auto-increment-ids-in-oracle</id>
   <content type="html">
     &lt;p&gt;This is old news to most people who have been using Oracle for a while, but to me this is something new that I learnt today.  How to have MySQL like &amp;ldquo;auto-increment&amp;rdquo; id&amp;rsquo;s for your tables in Oracle. :)  Here&amp;rsquo;s an example&amp;hellip;&lt;/p&gt;

&lt;p&gt;First we need to create a sequence for the ID&amp;rsquo;s:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SEQUENCE&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;S_COMMENT_ID&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;START&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WITH&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;INCREMENT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;CACHE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then we create the table and the required trigger:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT&amp;quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NUMBER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_BODY&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;USER&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;&amp;quot;CREATED_DATE&amp;quot;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DATE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;CONSTRAINT&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;PK_COMMENT&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;&amp;quot;COMMENT_ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;REPLACE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TRIGGER&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;TR_COMMENT_ID&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;BEFORE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;INSERT&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COMMENT&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;REFERENCING&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NEW&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NEW&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;OLD&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;OLD&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;FOR&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;EACH&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ROW&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;BEGIN&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comment_id&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;S_COMMENT_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nextval&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COMMENT_ID&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;END&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TRIGGER&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;&amp;quot;TR_COMMENT_ID&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ENABLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And there you go &amp;ndash; an auto-incrementing primary key&amp;hellip; Damn that&amp;rsquo;s a lot more code to write than a simple
&amp;lsquo;auto-increment&amp;rsquo;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit:&lt;/em&gt; An alternative when using &lt;a href=&quot;http://www.oracle.com/technology/software/products/sql/index.html&quot;&gt;SQL Developer&lt;/a&gt;
is to create your table, select it, then go to the &amp;lsquo;Triggers&amp;rsquo; tab. In there you will find a useful
&amp;lsquo;Actions&amp;hellip;&amp;rsquo; button where you can create a new trigger linking your tables primary key to a sequence.&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>F1 Got Exciting!</title>
   
   <link href="http://hocuspokus.net/2007/10/f1-got-exciting"/>
   }
   <updated>2007-10-01T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/10/f1-got-exciting</id>
   <content type="html">
     &lt;p&gt;Wow! I&amp;rsquo;ve been an F1 fan for quite some time, but over the last few years it&amp;rsquo;s become quite dull. Thank
goodness for this year!&lt;/p&gt;

&lt;p&gt;Nothing like some rain to bring on the fun in Japan! :D&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/2007/f1_2007_japanese2.jpg' alt='f1_2007_japanese2.jpg' class=&quot;center border&quot; /&gt;
&lt;img src='/images/2007/f1-2007-japanese.jpg' alt='f1-2007-japanese.jpg' class=&quot;center border&quot; /&gt;
&lt;img src='/images/2007/f1_2007_japanese3.jpg' alt='f1_2007_japanese3.jpg' class=&quot;center border&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;All images &amp;copy; &lt;a href=&quot;http://www.itv-f1.com/&quot;&gt;itv-f1.com&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>My Halo 3 Profile</title>
   
   <link href="http://hocuspokus.net/2007/09/my-halo-3-profile"/>
   }
   <updated>2007-09-30T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/my-halo-3-profile</id>
   <content type="html">
     &lt;p&gt;I never knew that &lt;a href=&quot;http://www.bungie.net/stats/PlayerStatsHalo3.aspx?player=DroopyWizard&quot;&gt;so many damn stats&lt;/a&gt;
were taken from each game!&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>Pixelmator Released</title>
   
   <link href="http://pixelmator.com"/>
   }
   <updated>2007-09-25T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/pixelmator-released</id>
   <content type="html">
     &lt;p&gt;The new image editing app come Photoshop contender for OS X got its full release today. I have to say
that it does look very good, and at only $59 (less than 30 of our shiny british pounds) any license of
Photoshop (even student ones) are looking way over priced! Will have to give it a go when I get started
on some new project.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Pixelmator Team today released Pixelmator 1.0, GPU-powered image
editing tool that provides everything needed to create, edit, and
enhance still images.&lt;/p&gt;

&lt;p&gt;&amp;quot;After two months of bug squashing we are very excited to finally
release Pixelmator,&amp;quot; said Saulius Dailide of the Pixelmator Team.
&amp;quot;With its use of latest Mac OS X technologies, breakthrough
ease-of-use, innovation and low $59 price tag we think all Mac users
will find Pixelmator very useful and fun.&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Pixelmator Released'&quot; href=&quot;http://hocuspokus.net/2007/09/pixelmator-released&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>One Day To Go...</title>
   
   <link href="http://games.slashdot.org/article.pl?sid=07/09/24/150232"/>
   }
   <updated>2007-09-25T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/one-day-to-go</id>
   <content type="html">
     &lt;p&gt;Yay! Halo 3 is out tomorrow and getting good reviews. I think i&amp;rsquo;d better get ready to rush into my local
Game at some point tomorrow!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;From a certain point of view, &lt;em&gt;Halo 3&lt;/em&gt; is without a doubt
the biggest game of the year. The combination of fan anticipation,
marketing, and the skill of Bungie&amp;rsquo;s design combine to create a game
that&amp;rsquo;s larger than life; if gaming has a blockbuster franchise to
match the movie industry&amp;rsquo;s punch, it&amp;rsquo;s the tale of Master Chief. The
importance of the &lt;em&gt;Halo&lt;/em&gt; franchise to gaming is a very big
issue, though, and one worth it&amp;rsquo;s own article. Having played through
the game, there&amp;rsquo;s really only one question I&amp;rsquo;m here to answer
today. Does it meet expectations? In a word: yes. It&amp;rsquo;s not the best
game ever made, and it may not even be the best game this year. Will
it make the fans happy, and deservedly sell thousands of Xbox
360s? Very much yes.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'One Day To Go...'&quot; href=&quot;http://hocuspokus.net/2007/09/one-day-to-go&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Making Editable Tables with Catalyst and TableKit</title>
   
   <link href="http://hocuspokus.net/2007/09/making-editable-tables-with-catalyst-and-tablekit"/>
   }
   <updated>2007-09-23T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/making-editable-tables-with-catalyst-and-tablekit</id>
   <content type="html">
     &lt;p&gt;&lt;a href=&quot;http://www.catalystframework.org/&quot;&gt;Catalyst&lt;/a&gt; is an MVC web-development framework for Perl, very similar
in concepts, ideas (and even some of the implementation) to &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt;.
I&amp;rsquo;m using Catalyst a lot in my job now, and one of the first challenges that i&amp;rsquo;ve had to go through is
making dynamically editable tables for some of the views we are using (in other words, Ajax driven
edit-in-place tables).&lt;/p&gt;

&lt;p&gt;Following a short Google, there seemed to be only two ready-made options I could see: one, using the
Catalyst controller module
&lt;a href=&quot;http://search.cpan.org/~karman/Catalyst-Controller-Rose-0.04/lib/Catalyst/Controller/Rose/EIP.pm&quot;&gt;Catalyst::Controller::ROSE::EIP&lt;/a&gt;;
or two, by integrating and using the stand-alone javascript package
&lt;a href=&quot;http://www.millstream.com.au/view/code/tablekit/&quot;&gt;TableKit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately the first option, ROSE::EIP is dependent on the use of the
&lt;a href=&quot;http://search.cpan.org/~jsiracusa/Rose-DB-Object-0.765/lib/Rose/DB/Object.pm&quot;&gt;Rose::DB::Object&lt;/a&gt; as your
database ORM mapper. As our webapp is already using
&lt;a href=&quot;http://search.cpan.org/~ash/DBIx-Class-0.08007/lib/DBIx/Class.pm&quot;&gt;DBIx::Class&lt;/a&gt; as its ORM layer, that
rules ROSE::EIP out and TableKit was the way to go. Here&amp;rsquo;s a quick rundown of how I got it going, using
a very simple table to store a users first and last names as an example (all files used in this tutorial
are available for download at the bottom of this post) and a single controller called &amp;lsquo;users&amp;rsquo;.&lt;/p&gt;

&lt;p&gt;First off, head on over to the &lt;a href=&quot;http://www.millstream.com.au/view/code/tablekit/&quot;&gt;TableKit&lt;/a&gt; site and
download the latest TableKit package, then create the following three directories in your &lt;code&gt;/MyApp/root/&lt;/code&gt;
directory: &lt;em&gt;javascript&lt;/em&gt;, &lt;em&gt;css&lt;/em&gt;, and &lt;em&gt;images&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;From the TableKit download, copy the files: &lt;em&gt;tablekit.js&lt;/em&gt;, &lt;em&gt;fastinit.js&lt;/em&gt; and &lt;em&gt;prototype.js&lt;/em&gt; (found in
scriptaculous/lib) into your new &amp;lsquo;&lt;em&gt;javascript&lt;/em&gt;&amp;rsquo; directory; then copy the two images &amp;ndash; &lt;em&gt;down.gif&lt;/em&gt; and
&lt;em&gt;up.gif&lt;/em&gt; into the &lt;em&gt;images&lt;/em&gt; directory.&lt;/p&gt;

&lt;p&gt;Now create a new file and add in the following CSS code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;nt&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border-collapse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;collapse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;td&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.5em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#CCC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;thead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;tfoot&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#DDD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;thead&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2px&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#f08900&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;tfoot&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2px&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#f08900&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;tr&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.rowodd&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#FFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;tr&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.roweven&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#F2F2F2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.sortcol&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-repeat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;no-repeat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.sortasc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#DDFFAC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url(&amp;#39;/images/up.gif&amp;#39;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.sortdesc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#B9DDFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url(&amp;#39;/images/down.gif&amp;#39;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.nosort&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;th&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.resize-handle-active&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;e-resize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.resize-handle&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;e-resize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;border-right&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;dashed&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#1E90FF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;absolute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Save this file as &amp;lsquo;&lt;em&gt;myapp.css&lt;/em&gt;&amp;rsquo; in your new &lt;em&gt;css&lt;/em&gt; directory. This will give your tables a on okay
looking starting point and nice striping on odd and even rows when we&amp;rsquo;re finished.&lt;/p&gt;

&lt;p&gt;Next, open up the &lt;code&gt;/MyApp/root/lib/site/html&lt;/code&gt; file and add the following lines within the head tags:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/css/myapp.css&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;media=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;screen&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/javascript/prototype.js&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/javascript/fastinit.js&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/javascript/tablekit.js&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, we update our &lt;code&gt;/MyApp/root/src/users/list.tt&lt;/code&gt; file so that the users table looks like the following
snippet of code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;[% META title = &amp;#39;User List&amp;#39; -%]
&lt;span class=&quot;nt&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;users&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortable resizable editable&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;sortfirstasc noedit&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;tfoot&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Id&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;First Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Last Name&lt;span class=&quot;nt&quot;&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tfoot&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
    [% FOREACH user IN users -%]
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tr&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;[% user.id %]&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.id %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.firstname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;td&amp;gt;&lt;/span&gt;[% user.lastname %]&lt;span class=&quot;nt&quot;&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    [% END -%]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;In the above lines of code there are two important details that need to be done in order for the table
sorting and editing to work:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One: The id properties&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The id properties on each column of the table are set to the same names as the fields in the database
table. and the table rows, (in the body of the table) also have an id associated with them &amp;ndash; this
becomes the database row &amp;lsquo;ID&amp;rsquo; attribute when the template is interpreted. These id&amp;rsquo;s then become some of
the parameters that are passed via TableKit to our Ajax.Updater controller method.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Two: The class properties&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the table header, the id column has two classes applied to it &amp;ndash; &amp;lsquo;sortfirstasc&amp;rsquo; and &amp;lsquo;noedit&amp;rsquo; &amp;ndash; this
tells TableKit to first sort the table based on this column (and ascending), and that the values of this
column are not to be editable.&lt;/p&gt;

&lt;p&gt;Also in the declaration of the table, the table has the classes: &amp;lsquo;sortable&amp;rsquo; &amp;lsquo;resizable&amp;rsquo; and &amp;lsquo;editable&amp;rsquo; &amp;ndash;
these tell TableKit what you&amp;rsquo;d like to be able to do with your table.&lt;/p&gt;

&lt;p&gt;Finally, add the following snippet of Javascript code to the bottom of the same file
(&lt;code&gt;/MyApp/root/src/users/list.tt&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;comments_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TableKit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;editAjaxURI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;[% update_uri %]&amp;#39;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This initializes the TableKit actions and tells TableKit the uri that the Prototype Ajax.Updater is to
call (a Catalyst controller method that we&amp;rsquo;re about to create).&lt;/p&gt;

&lt;p&gt;The final step is now back in the &amp;lsquo;Users&amp;rsquo; controller. Here&amp;rsquo;s the code that we need for both the initial
list of users and the Ajax.Updater method that TableKit calls:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;users/list.tt&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update_uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uri_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;/users/_update_user&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;_update_user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;: Local {&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;MyAppDB::Users&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
      &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;There you go, you should now have a table on your &amp;lsquo;/users/list&amp;rsquo; page that is sortable, resizable, and
now even in-place editable. I hope these instructions are clear enough (there&amp;rsquo;s quite a lot in there!),
any questions, comments or improvements people could give me would be most appreciated.&lt;/p&gt;

&lt;p&gt;Next up, i&amp;rsquo;ll go through how I made the tables more functional by adding in add and delete buttons (to
add and delete rows to the table, and therefore create new database entries). :)&lt;/p&gt;

&lt;h4&gt;Attached Files:&lt;/h4&gt;

&lt;p&gt;&lt;a href='/downloads/2007/myapp.zip' title='MyApp' class=&quot;archive&quot;&gt;MyApp&lt;/a&gt;&lt;/p&gt;

     
   </content>
 </entry>
 
 <entry>
   <title>At Last! iCal To Show Correct Date!</title>
   
   <link href="http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/160269630/"/>
   }
   <updated>2007-09-23T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/at-last-ical-to-show-correct-date</id>
   <content type="html">
     &lt;p&gt;This makes me happy&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;One final note: It looks like Leopard&amp;rsquo;s iCal dock icon displays the
proper date at all times! The dozen or so people who have clamored for
this may rejoice.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'At Last! iCal To Show Correct Date!'&quot; href=&quot;http://hocuspokus.net/2007/09/at-last-ical-to-show-correct-date&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Macs Really Do Run Windows Better</title>
   
   <link href="http://stevenf.com/2007/09/macs_really_do_run_windows_better.php"/>
   }
   <updated>2007-09-22T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/macs-really-do-run-windows-better</id>
   <content type="html">
     &lt;p&gt;Oh so very true&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ever since Boot Camp appeared on the scene, there have been several
comments about Macs being better Windows machines than Windows
machines. The weird thing is &lt;em&gt;it&amp;rsquo;s actually true&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;

     
     &lt;div&gt;
       &lt;a title=&quot;Permanent link to 'Macs Really Do Run Windows Better'&quot; href=&quot;http://hocuspokus.net/2007/09/macs-really-do-run-windows-better&quot; target=&quot;_blank&quot;&gt;&#187;&lt;/a&gt;
     &lt;/div&gt;
     
   </content>
 </entry>
 
 <entry>
   <title>Let's get started...</title>
   
   <link href="http://hocuspokus.net/2007/09/lets-get-started"/>
   }
   <updated>2007-09-11T00:00:00+01:00</updated>
   <id>http://hocuspokus.net/2007/09/lets-get-started</id>
   <content type="html">
     &lt;p&gt;Welcome to the introductory post to &lt;a href=&quot;http://hocuspokus.net&quot;&gt;hocuspokus.net&lt;/a&gt;! So, what&amp;rsquo;s going on here
then?!?&lt;/p&gt;

&lt;p&gt;Well, basically this is going to be a place for me, Darren Oakley to dump my thoughts and little ideas
that I have on a semi-regular basis&amp;hellip; Expect posts on subjects such as Apple (god &amp;ndash; not another mac
blogger!), Perl programming, Bioinformatics (it&amp;rsquo;s what I do for a living), Unix geekiness, Xbox 360 and
many things in between as I go about my daily life.&lt;/p&gt;

&lt;p&gt;Anyway &amp;ndash; enough of this boring first post nonsense! Will be back soon with more interesting things to
say!&lt;/p&gt;

     
   </content>
 </entry>
 

</feed>


