<?xml version="1.0" encoding="UTF-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0"
  xml:lang="en"
   >
  <title type="text">All Unkept</title>
  <subtitle type="text"></subtitle>

  <updated>2013-05-24T11:16:23Z</updated>
  <generator uri="http://blogofile.com/">Blogofile</generator>

  <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog" />
  <id>http://lukeplant.me.uk/blog/feed/atom/</id>
  <link rel="self" type="application/atom+xml" href="http://lukeplant.me.uk/blog/feed/atom/" />
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Emacs and personal trac wiki]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/emacs-and-personal-trac-wiki/" />
    <id>http://lukeplant.me.uk/blog/posts/emacs-and-personal-trac-wiki/</id>
    <updated>2009-03-18T02:01:12Z</updated>
    <published>2009-03-18T02:01:12Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Python" />
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Personal and misc" />
    <summary type="html"><![CDATA[Emacs and personal trac wiki]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/emacs-and-personal-trac-wiki/"><![CDATA[
<p>
I've blogged before about
<a class="ext-link" href="http://lukeplant.me.uk/blog/posts/personal-wiki-and-desktop-integration/"><span class="icon">using trac as a personal wiki</span></a>,
and that has been working very well for me.
</p><p>
But of course the day would was bound to come when using the text box
in a web browser was just too painful.  I want to use emacs to edit
the text, and do so painlessly.
</p><p>
Of course, I should have realised before that someone else would have
already done the hard work:
</p><p>
<a class="ext-link" href="http://trac-hacks.org/wiki/EmacsWikiEditScript"><span class="icon">http://trac-hacks.org/wiki/EmacsWikiEditScript</span></a>
</p><p>
It has a few dependencies, as you might expect, and I also had to
<a class="ext-link" href="http://savannah.nongnu.org/bugs/?25314"><span class="icon">patch xml-rpc.el</span></a> because I'm
using Emacs 23 (the author of trac-wiki.el, Shun-ichi GOTO, helpfully
pointed me in the right direction), but it's now working beautifully.
</p><p>
It allows you edit wiki pages directly in Emacs, and much more: it's
got syntax highlighting, completion of page names, history and diff
modes etc., with key bindings and integration for everything you might
want.
</p><p>
A few little Python XML-RPC scripts later, and I can convert this post
(written in my wiki, using Emacs, of course) into HTML ready for
posting on my blog).
</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[reStructuredText, HsColour and Pygments]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/restructuredtext-hscolour-and-pygments/" />
    <id>http://lukeplant.me.uk/blog/posts/restructuredtext-hscolour-and-pygments/</id>
    <updated>2007-07-19T20:38:17Z</updated>
    <published>2007-07-19T20:38:17Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Python" />
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Haskell" />
    <summary type="html"><![CDATA[reStructuredText, HsColour and Pygments]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/restructuredtext-hscolour-and-pygments/"><![CDATA[
<p>I like to write blog postings in <a class="reference" href="http://docutils.sourceforge.net/docs/ref/rst/introduction.html">reStructuredText</a>, and I use
rst2html from Python's docutils to turn them into HTML before pasting
into my blog software.</p>
<p>One thing missing is source highlighting for Haskell, Python etc.
Thankfully, Both reST and Python's docutils are written to be
extensible.  Below is a replacement 'rst2html' which includes support
for Haskell colouring using <a class="reference" href="http://www.cs.york.ac.uk/fp/darcs/hscolour/">HsColour</a>, and just about everything
else using <a class="reference" href="http://pygments.org/">Pygments</a>.</p>
<p>Example usage:</p>
<div class="codeblock rst">
<div class="highlight"><pre><span class="cp">.. code-block:: python</span>

<span class="cp">   import os</span>
<span class="cp">   # Standard hello world stuff</span>
<span class="cp">   class Hello()</span>
<span class="cp">       def do_it(self)</span>
<span class="cp">           print &quot;Hello world&quot;</span>

<span class="cp">   if __name__ == &#39;__main__&#39;:</span>
<span class="cp">       Hello().do_it()</span>


<span class="cp">     def main()</span>
<span class="cp">         print &quot;Hello world&quot;</span>
</pre></div>

</div>
<p>Output:</p>
<div class="codeblock python">
<div class="highlight"><pre><span class="k">import</span> <span class="nn">os</span>
<span class="c"># Standard hello world stuff</span>
<span class="k">class</span> <span class="nc">Hello</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">do_it</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">print</span> <span class="s">&quot;Hello world&quot;</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">Hello</span><span class="p">()</span><span class="o">.</span><span class="n">do_it</span><span class="p">()</span>
</pre></div>

</div>
<p>Some sample Haskell:</p>
<div class="codeblock haskell">
<pre><span class='keyword'>class</span> <span class='conid'>Show</span> <span class='varid'>a</span> <span class='keyword'>where</span>
    <span class='varid'>show</span>      <span class='keyglyph'>::</span> <span class='varid'>a</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span>
    <span class='varid'>showsPrec</span> <span class='keyglyph'>::</span> <span class='conid'>Int</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>a</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>ShowS</span>
    <span class='varid'>showList</span>  <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='varid'>a</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>ShowS</span>

    <span class='comment'>-- Minimal complete definition: show or showsPrec</span>
    <span class='varid'>show</span> <span class='varid'>x</span>          <span class='keyglyph'>=</span> <span class='varid'>showsPrec</span> <span class='num'>0</span> <span class='varid'>x</span> <span class='str'>""</span>
    <span class='varid'>showsPrec</span> <span class='keyword'>_</span> <span class='varid'>x</span> <span class='varid'>s</span> <span class='keyglyph'>=</span> <span class='varid'>show</span> <span class='varid'>x</span> <span class='varop'>++</span> <span class='varid'>s</span>
    <span class='varid'>showList</span> <span class='conid'>[]</span>     <span class='keyglyph'>=</span> <span class='varid'>showString</span> <span class='str'>"[]"</span>
    <span class='varid'>showList</span> <span class='layout'>(</span><span class='varid'>x</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>showChar</span> <span class='chr'>'['</span> <span class='varop'>.</span> <span class='varid'>shows</span> <span class='varid'>x</span> <span class='varop'>.</span> <span class='varid'>showl</span> <span class='varid'>xs</span>
                      <span class='keyword'>where</span> <span class='varid'>showl</span> <span class='conid'>[]</span>     <span class='keyglyph'>=</span> <span class='varid'>showChar</span> <span class='chr'>']'</span>
                            <span class='varid'>showl</span> <span class='layout'>(</span><span class='varid'>x</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>showChar</span> <span class='chr'>','</span> <span class='varop'>.</span> <span class='varid'>shows</span> <span class='varid'>x</span> <span class='varop'>.</span> <span class='varid'>showl</span> <span class='varid'>xs</span>

<span class='keyword'>class</span> <span class='conid'>Eq</span> <span class='varid'>a</span> <span class='keyword'>where</span>
    <span class='layout'>(</span><span class='varop'>==</span><span class='layout'>)</span><span class='layout'>,</span> <span class='layout'>(</span><span class='varop'>/=</span><span class='layout'>)</span> <span class='keyglyph'>::</span> <span class='varid'>a</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>a</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Bool</span>

    <span class='comment'>-- Minimal complete definition: (==) or (/=)</span>
    <span class='varid'>x</span> <span class='varop'>==</span> <span class='varid'>y</span>      <span class='keyglyph'>=</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>x</span><span class='varop'>/=</span><span class='varid'>y</span><span class='layout'>)</span>
    <span class='varid'>x</span> <span class='varop'>/=</span> <span class='varid'>y</span>      <span class='keyglyph'>=</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>x</span><span class='varop'>==</span><span class='varid'>y</span><span class='layout'>)</span></pre>
</div>
<p>Here is the code:</p>
<div class="codeblock python">
<div class="highlight"><pre><span class="c">#!/usr/bin/python</span>

<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">rst2html</span>

<span class="sd">A minimal front end to the Docutils Publisher, producing HTML,</span>
<span class="sd">with an extension for colouring code-blocks</span>
<span class="sd">&quot;&quot;&quot;</span>

<span class="k">try</span><span class="p">:</span>
    <span class="k">import</span> <span class="nn">locale</span>
    <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>


<span class="k">from</span> <span class="nn">docutils</span> <span class="k">import</span> <span class="n">nodes</span><span class="p">,</span> <span class="n">parsers</span>
<span class="k">from</span> <span class="nn">docutils.parsers.rst</span> <span class="k">import</span> <span class="n">states</span><span class="p">,</span> <span class="n">directives</span>
<span class="k">from</span> <span class="nn">docutils.core</span> <span class="k">import</span> <span class="n">publish_cmdline</span><span class="p">,</span> <span class="n">default_description</span>

<span class="k">import</span> <span class="nn">tempfile</span><span class="o">,</span> <span class="nn">os</span>

<span class="k">def</span> <span class="nf">getCommandOutput2</span><span class="p">(</span><span class="n">command</span><span class="p">):</span>
    <span class="n">child_stdin</span><span class="p">,</span> <span class="n">child_stdout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">popen2</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
    <span class="n">child_stdin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">child_stdout</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
    <span class="n">err</span> <span class="o">=</span> <span class="n">child_stdout</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">err</span><span class="p">:</span>
        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s"> failed w/ exit code </span><span class="si">%d</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">data</span>

<span class="k">def</span> <span class="nf">highlight_haskell</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
    <span class="n">fh</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">()</span>
    <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fh</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
    <span class="n">output</span> <span class="o">=</span> <span class="n">getCommandOutput2</span><span class="p">([</span><span class="s">&quot;HsColour&quot;</span><span class="p">,</span> <span class="s">&quot;-css&quot;</span><span class="p">,</span> <span class="s">&quot;-partial&quot;</span><span class="p">,</span> <span class="n">path</span><span class="p">])</span>
    <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fh</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">output</span>

<span class="k">def</span> <span class="nf">get_highlighter</span><span class="p">(</span><span class="n">language</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">language</span> <span class="o">==</span> <span class="s">&#39;haskell&#39;</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">highlight_haskell</span>

    <span class="k">from</span> <span class="nn">pygments</span> <span class="k">import</span> <span class="n">lexers</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">highlight</span><span class="p">,</span> <span class="n">formatters</span>
    <span class="k">import</span> <span class="nn">StringIO</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">lexer</span> <span class="o">=</span> <span class="n">lexers</span><span class="o">.</span><span class="n">get_lexer_by_name</span><span class="p">(</span><span class="n">language</span><span class="p">)</span>
    <span class="k">except</span> <span class="n">util</span><span class="o">.</span><span class="n">ClassNotFound</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>

    <span class="n">formatter</span> <span class="o">=</span> <span class="n">formatters</span><span class="o">.</span><span class="n">get_formatter_by_name</span><span class="p">(</span><span class="s">&#39;html&#39;</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">_highlighter</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
        <span class="n">outfile</span> <span class="o">=</span> <span class="n">StringIO</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
        <span class="n">highlight</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">lexer</span><span class="p">,</span> <span class="n">formatter</span><span class="p">,</span> <span class="n">outfile</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">outfile</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">_highlighter</span>

<span class="c"># Docutils directives:</span>
<span class="k">def</span> <span class="nf">code_block</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">arguments</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span>
               <span class="n">content_offset</span><span class="p">,</span> <span class="n">block_text</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">state_machine</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    The code-block directive provides syntax highlighting for blocks</span>
<span class="sd">    of code.  It is used with the the following syntax::</span>

<span class="sd">    .. code-block:: python</span>

<span class="sd">       import sys</span>
<span class="sd">       def main():</span>
<span class="sd">           sys.stdout.write(&quot;Hello world&quot;)</span>

<span class="sd">    Currently support languages: python (requires pygments),</span>
<span class="sd">    haskell (requires HsColour), anything else supported by pygments</span>
<span class="sd">    &quot;&quot;&quot;</span>


    <span class="n">language</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">highlighter</span> <span class="o">=</span> <span class="n">get_highlighter</span><span class="p">(</span><span class="n">language</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">highlighter</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">error</span> <span class="o">=</span> <span class="n">state_machine</span><span class="o">.</span><span class="n">reporter</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
            <span class="s">&#39;The &quot;</span><span class="si">%s</span><span class="s">&quot; directive does not support language &quot;</span><span class="si">%s</span><span class="s">&quot;.&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">language</span><span class="p">),</span>
            <span class="n">nodes</span><span class="o">.</span><span class="n">literal_block</span><span class="p">(</span><span class="n">block_text</span><span class="p">,</span> <span class="n">block_text</span><span class="p">),</span> <span class="n">line</span><span class="o">=</span><span class="n">lineno</span><span class="p">)</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">content</span><span class="p">:</span>
        <span class="n">error</span> <span class="o">=</span> <span class="n">state_machine</span><span class="o">.</span><span class="n">reporter</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
            <span class="s">&#39;The &quot;</span><span class="si">%s</span><span class="s">&quot; block is empty; content required.&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">),</span>
            <span class="n">nodes</span><span class="o">.</span><span class="n">literal_block</span><span class="p">(</span><span class="n">block_text</span><span class="p">,</span> <span class="n">block_text</span><span class="p">),</span> <span class="n">line</span><span class="o">=</span><span class="n">lineno</span><span class="p">)</span>
        <span class="k">return</span> <span class="p">[</span><span class="n">error</span><span class="p">]</span>

    <span class="n">include_text</span> <span class="o">=</span> <span class="n">highlighter</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content</span><span class="p">))</span>
    <span class="n">html</span> <span class="o">=</span> <span class="s">&#39;&lt;div class=&quot;codeblock </span><span class="si">%s</span><span class="s">&quot;&gt;</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s">&lt;/div&gt;</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">language</span><span class="p">,</span> <span class="n">include_text</span><span class="p">)</span>
    <span class="n">raw</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">.</span><span class="n">raw</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="n">html</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&#39;html&#39;</span><span class="p">)</span>
    <span class="k">return</span> <span class="p">[</span><span class="n">raw</span><span class="p">]</span>

<span class="n">code_block</span><span class="o">.</span><span class="n">arguments</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">code_block</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;language&#39;</span> <span class="p">:</span> <span class="n">parsers</span><span class="o">.</span><span class="n">rst</span><span class="o">.</span><span class="n">directives</span><span class="o">.</span><span class="n">unchanged</span> <span class="p">}</span>
<span class="n">code_block</span><span class="o">.</span><span class="n">content</span> <span class="o">=</span> <span class="mi">1</span>

<span class="c"># Register</span>
<span class="n">directives</span><span class="o">.</span><span class="n">register_directive</span><span class="p">(</span> <span class="s">&#39;code-block&#39;</span><span class="p">,</span> <span class="n">code_block</span> <span class="p">)</span>


<span class="n">description</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;Generates (X)HTML documents from standalone reStructuredText &#39;</span>
               <span class="s">&#39;sources.  &#39;</span> <span class="o">+</span> <span class="n">default_description</span><span class="p">)</span>

<span class="c"># Command line</span>
<span class="n">publish_cmdline</span><span class="p">(</span><span class="n">writer_name</span><span class="o">=</span><span class="s">&#39;html&#39;</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">)</span>
</pre></div>

</div>
<p>I borrowed some things from <a class="reference" href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252170">this recipe</a>,
thanks.  I also discovered <a class="reference" href="http://pygments.org/docs/rstdirective/">Using Pygments in ReST documents</a>  after I wrote this.</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Leading whitespace in comments]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/leading-whitespace-in-comments/" />
    <id>http://lukeplant.me.uk/blog/posts/leading-whitespace-in-comments/</id>
    <updated>2006-05-01T12:21:19Z</updated>
    <published>2006-05-01T12:21:19Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Python" />
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <summary type="html"><![CDATA[Leading whitespace in comments]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/leading-whitespace-in-comments/"><![CDATA[
<p>I fixed my blog comments so that leading whitespace is now preserved -- making it much more friendly to posted Python code.</p>

<p>It was a matter of adding these lines of PHP:</p>
<pre class="php">
  $comment_text = preg_replace("/^(\s*)/me", 
      'spaces_to_nbsp("$1")', $comment_text);
</pre>

<p>...where the implementation of spaces_to_nbsp() should be obvious.  Old comments won't be fixed, but new ones can contain Python code without worrying about whitespace issues.  At work we use Sharepoint, and I noticed that it handles leading whitespace the same way as the above -- it would be nice to see more web apps doing this.</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Scott Adams on blogging]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/scott-adams-on-blogging/" />
    <id>http://lukeplant.me.uk/blog/posts/scott-adams-on-blogging/</id>
    <updated>2005-10-26T22:32:23Z</updated>
    <published>2005-10-26T22:32:23Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <summary type="html"><![CDATA[Scott Adams on blogging]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/scott-adams-on-blogging/"><![CDATA[
<p>I read this hilarious quotation in <a href="http://www.dilbert.com/comics/dilbert/dnrc/html/newsletter61.html">Scott Adam's DNCR newsletter, number 61</a>:

<blockquote>
<p>When I see news stories about people all over the world who are experiencing hardships, I worry about them, and I rack my brain wondering how I can make a difference. So I decided to start my own blog. That way I won't have time to think about other people. </p>

<p>People who are trying to decide whether to create a blog or not go through a thought process much like this: </p>

<ol>
<li>The world sure needs more of ME. </li>
<li>Maybe I'll shout more often so that people nearby can experience the joy of knowing my thoughts. </li>
<li>No, wait, shouting looks too crazy. </li>
<li>I know - I'll write down my daily thoughts and badger people to read them. 
If only there was a description for this process that doesn't involve the words egomaniac or unnecessary. </li>
<li>What? It's called a blog? I'm there! </li>
</ol>

...
<p>The beauty of blogging, as compared to writing a book, is that no editor will be interfering with my random spelling and grammar, my complete disregard for the facts, and my wandering sentences that seem to go on and on and never end so that you feel like you need to take a breath and clear your head before you can even consider making it to the end of the sentence that probably didn't need to be written anyhoo. </p>
</blockquote>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Over and out]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/over-and-out/" />
    <id>http://lukeplant.me.uk/blog/posts/over-and-out/</id>
    <updated>2005-06-13T18:51:32Z</updated>
    <published>2005-06-13T18:51:32Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Personal and misc" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Over and out]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/over-and-out/"><![CDATA[
<p>On Saturday I succeeded in convincing myself that I have better things do than blog or read other people blogs.  In fact, I convinced myself not only to quit the Christian blogosphere, but bin my entire list of news feeds -- I don't know how many hours I've wasted reading news of all sorts that, although it may be interesting, is not nearly important enough for someone who believes in eternity.  It remains only to deal with the few things I think I'll miss.</p>

<ol>
<li><p>The blogs of personal friends.  It is kind of a nice way to stay in touch with what people are doing, but I think personal e-mails are probably better and more meaningful, so I hope that I'll use some of the time I free up from reading blogs for that purpose.</p></li>

<li><p>A chance to air ideas and things I've been thinking about.  This one's easy: have real conversations with real people.  If it's too private, I'll write it in my journal (in fact I've often found that many things that are really on my heart <em>are</em> too personal for a blog, so my posts have tended to be superficial anyway).</p></li>

<li><p>Various other bloggers who I've enjoyed reading:  I suppose I'll pop by from time to time on their websites.  But the days of agregators are over for me.  I'll make Tim Challies proud by reading some of the books he recommends, instead of just his reviews.</p></li>

</ol>

<p>I'll leave this blog up, and comments open for a while (but I imagine the spammers will annoy me too much before long).  I'll still be posting announcements for Kio-Sword here, and perhaps the occasional factual posting of useful information, but that's all.</p>

<p>Right, just deleted all my feeds from my bloglines account, it's over.  The other day I found "The Life of God in the Soul of Man" by Henry Scougal in a digital format on <a href="http://www.ccel.org/" title="Christian Classics Ethereal Library">CCEL</a>.  I've converted it to a <a href="http://www.crosswire.org/sword/">Sword</a> module and printed it off using <a href="http://lukeplant.me.uk/kio-sword/">Kio-Sword</a>.  So I'm off to read a good book :-).</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Blogging critique part 4: Reading matter(s)]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/blogging-critique-part-4-reading-matter-s/" />
    <id>http://lukeplant.me.uk/blog/posts/blogging-critique-part-4-reading-matter-s/</id>
    <updated>2005-06-11T23:24:44Z</updated>
    <published>2005-06-11T23:24:44Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Blogging critique part 4: Reading matter(s)]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/blogging-critique-part-4-reading-matter-s/"><![CDATA[
<p>Part 4 in my series -- hot on the heels of part 3, since, despite the last one being slightly more optimistic, I've kind of got an urge to rid myself of this blogging habit.  And I want "as for blogging, it shall cease", rather than "it shall fade away" to be the conclusion!</p>

<p>I do not doubt that blogging can and does satisfy several (good) desires and needs that humans have, including the need to communicate and interact with others and the desire to learn new things.  My problem is this: does blogging do these things as well as other means?  It is not enough for blogging to be a <em>good</em> at what it's for.  Christians must aspire to the <em>best</em> use of their time.</p>

<p>I've already argued that blogging is not the best way to interact with other Christians in terms of being a genuine influence, since we only get to see a fraction of each other's lives.  I'd add one more thing to that: I don't think that being involved in blogging communities has helped my relationships with other Christians in my church at all -- the opposite if anything.  It's virtually impossible to discuss things you've encountered through bloggers with people who look at you like you're having trouble speaking when you say the word 'blog'.  By blogging I've filled my mind with things that are more likely to distance me from my real Christian family than actually edify them.</p>

<p>With regard to learning, especially in regards to Christianity, I have to rate the vast majority of Christian blogs as, <em>relatively speaking</em>, a very poor source of decent Christian teaching.  This isn't primarily because the authors are not up to scratch (the solution to those is easy -- don't read them).  I'm talking even about the those that I admire and enjoy reading, and whose authors I respect.  The problem I have is with the medium:</p>

<p>I very rarely read long blog posts, and I'm not alone, because I find that very few people create them, knowing that to be popular in this arena, you have to be, above all, <em>brief</em>.  Blogs also have to an attention-grabbing title, and an interesting first paragraph.  Otherwise, the blogger will be classified as unfit to survive by the selective forces of the blogosphere, and will soon be eliminated.</p>

<p>This is all part of the sound bite culture we live in.  Things must tickle our minds for a few minutes (but preferably no more) to be worthy of our  attention.  While this is depressing trend for the way we treat global and local news in the mainstream media, it is catastrophic if we start having the same attitude to theology.</p>

<p>I find I treat books (and sermons for that matter) very differently from  blogs.  When I pick up a book, I already know what to expect in terms of size, and to some extent commit myself to spending quality time thinking about and getting into it -- far more than I'd ever consider with a blog post.  I'll be reading it not because it grabbed my attention, but because <em>I decided to apply my attention to it</em>, hopefully on the basis that it was well recommended as a good book to read, or some other significant qualification.  My diet is then decided not by what other people happen to be blogging about, but what Christians over the years have thought important enough to put into print.  After an hour's reading of a good Christian book I will, hopefully, have made some real progress in understanding of a certain topic.  Compare this to an hour's blog reading, in which you attention has been divided over multiple topics, many of which you really didn't need to know anything about at all.  (For example, I spent at least half an hour this evening being appalled by views on interracial marriage that are apparently still alive and well in America.  For a Brit, this is completely irrelevant--this side of the Atlantic, no pastor or theologian would ever have to write an article like <a href="http://www.desiringgod.org/library/sermons/05/011605.html" title="Racial Harmony and Interracial Marriage">the one that John Piper wrote</a> on this subject).</p>

<p>This comes down to a matter of self-discipline, and choosing wisely, but I think that books and sermons encourage me to do this far better than blogs ever have.</p>

<p>I guess this post parallels the opening sequence of a kids TV program I used to watch, called "Why Don't You?":</p>
<blockquote>
  <em>Why Don't You</em>...turn your TV off and do something interesting instead?
</blockquote>

<p>That's enough for a blog post, especially one that discourages blogging!</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Blogging critique part 3: Nutters]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/blogging-critique-part-3-nutters/" />
    <id>http://lukeplant.me.uk/blog/posts/blogging-critique-part-3-nutters/</id>
    <updated>2005-06-10T21:44:45Z</updated>
    <published>2005-06-10T21:44:45Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Blogging critique part 3: Nutters]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/blogging-critique-part-3-nutters/"><![CDATA[
<p>Having read a few other bloggers over the past few days, in particular Jollyblogger's <a href="http://jollyblogger.typepad.com/jollyblogger/2005/06/why_its_cool_to.html">learthearted response</a> to some of the recent talk about Calvinism, and also various really good posts (mainly on <a href="http://www.challies.com">Challies</a> IIRC), I'm thinking that the view I expressed in my last post was a bit too pessimistic, and maybe I need to lighten up a bit.</p>

<p>Also, I've got some time to finish some thoughts partly triggered by <a href="http://phillipjohnson.blogspot.com/2005/06/quick-and-dirty-calvinism.html">Quick-and-Dirty Calvinism</a> by Phil Johnson (who I had never heard of until a few days ago):</p>

<p>One of the problems with all internet journalism is how easy it is to get involved. This is, of course, one it's great advantages, and there are plenty of examples of how useful this has been, such as a few well-researched bloggers exposing mainstream media (Pamela Jones of <a href="http://www.groklaw.net">Groklaw</a> justly achieved distinction and fame in this way), and marginalised people being enabled to have a voice.</p>

<p>But it also enables complete wackos to get a platform they would never have had from anyone else.  A case in point is <a href="http://www.alexchiu.com/">Alex Chiu</a>, who I came across a few years ago while at University.  Since I last visited, this self proclaimed genius has expanded his apparent range of expertise from medicine and physics (having invented an "Immortality Device", and <a href="http://www.alexchiu.com/spacestation/spacemainmenu.htm">explained the unsolved mysteries of the universe</a>), to politics (<q>How to unite the entire world</q>), biology (<q>Alex Chiu's New Darwinisim</q>) and theology (<q>What is God?</q>).  The guy genuinely believes every word he says, and he has me in stitches within minutes.</p>

<p>The fame achieved by this poor bloke has no greater effect on the scientific establishment than providing some amusement -- the last thing you'll find is any real scientist getting het up about his lunatic explanation of gravity (it works like the static on a comb, apparently).</p>

<p>In the Christian blogosphere too, there are plenty of people who would <em>never</em> be published by anyone who had to make some money from the book, and who may well have no significant influence on others around them in <a href="http://en.wikipedia.org/wiki/Real_life">RL</a>. Of course I'm not saying that either of these mean they must be wrong -- I'm simply pointing out that although someone may be making a significant splash online, they may be no more worthy of our attention than Alex Chiu, and were it not for the internet, we would never spend a moment of our time on their ideas.</p>

<p>But the problem with Christian doctrine is that <em>it actually matters</em>.  So Christian's <em>do</em> get het up when they see people spouting heresy or division, and instead of ignoring sites like 'Outside the camp' (deliberately not linked as you have better things to do with your time), we actually engage with them, especially if we worry that they are having an influence.  Maybe we just need to learn the advice of <a href="http://www.biblegateway.com/passage/?search=Prov+26%3A4&version=47&amp;submit=Lookup">Proverbs 26:4</a>.  Of course, that verse has to be taken with it's sister, <a href="http://www.biblegateway.com/passage/?search=Prov+26%3A5&version=47&amp;submit=Lookup">Proverbs 26:5</a>, but I suspect in the blogging world, with the temptation to correct all the errors we see, it's the former that is the most pertinent. </p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Blogging critique part 2: Mixed witness?]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/blogging-critique-part-2-mixed-witness/" />
    <id>http://lukeplant.me.uk/blog/posts/blogging-critique-part-2-mixed-witness/</id>
    <updated>2005-06-06T23:09:20Z</updated>
    <published>2005-06-06T23:09:20Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Blogging critique part 2: Mixed witness?]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/blogging-critique-part-2-mixed-witness/"><![CDATA[
<p>I've just finished the bulk of some web site development work for a Christian organisation, so I've finally found time to carry on my series on criticisms of blogging.  In <a href="blog.php?id=1107301609" title="Blogging critique part 1: Genuine influence?">my previous post</a>, I wondered whether the Christian blogosphere is really going to be an effective way to change Christian's minds about things.  In this one, I'm developing those thoughts, and looking a bit more outward.</p>

<p>Blogging is often touted as an effective evangelistic tool.  As I see it, the sad truth is that the Christian sector of the blogosphere has a fairly mixed witness to the rest of the world.  Take <a href="http://phillipjohnson.blogspot.com/2005/06/quick-and-dirty-calvinism.html">Phillip Johnson's opening post</a>, for instance.  I do not mean to criticise the post at all, as I in fact agree with most of it and intend to pick up on some of the things he says in a later post.  What interests me most, however, is the discussion in the comments afterwards.  While parts of it are fine, it gets pretty ugly in places--one party mis-judges, another retaliates, and name-calling abounds.  This is by no means the only place I've seen things like this -- the discussion after <a href="http://www.challies.com/archives/000124.php">Tim Challies review of The Purpose Driven Life</a> ends with Tim closing the discussion with the words <cite>If we are Christians, let us not behave as unbelievers.</cite>, and those words could do some heeding in many boards and blogs I've seen.</p>

<p>There are a few things to say about these 'debates'.  First, often those who get worked up aren't the major players, but then again, an outsider probably wouldn't notice who was who, and probably everyone who participates is at least naming the name of Christ.  Second, in some ways it is good that people feel strongly about these things -- if we don't get worked up about theology, there is something wrong with our theology, or our piety.  Third, I think there is a large degree of mis-understanding about the nature of the discussion, so people quickly take offence when none was intended.  For example, in the afore-mentioned book review at Challies, one commenter took offence and described the post as an attack on what he obviously considered to be a work of God and a man of God, despite the fact the review was far from inflamatory in style.</p>

<p>But these aren't just unfortunate accidents.  The medium itself seems to bring out all these things in people.  I doubt that few people who have used the internet for long will have failed to notice how a completely innocent comment on a in an e-mail can come across as sarcastic, grumpy, beligerent or worse, even to people you know.  Add to this the fact that you are complete strangers to most of the people you 'meet' on the internet, even those you think you know well, and so will not have to deal with any fallout from a harsh comment, and then add the strong feelings I mentioned earlier, and you've got a recipe for disaster.</p>

<p>It's become a policy of mine that in any discussions with Christian brothers and sisters, as far as it depends on me, I ought to ensure they understand that I love them before I criticise them.  When it comes to criticising their theology rather than them personally, this is even <i>more</i> important, not less, because it concerns what they believe about God, who, you must assume, is more dear to them than life itself.  With that rule, I just don't know how to engage in any serious debate through blogging, apart from with people I already know.  I should point out that this rule doesn't in any way preclude public debate--I can imagine how to obey it even in public preaching to strangers, or in authoring a book.  Nor am I saying that no bloggers achieve it -- many do so admirably.  But somehow things still seem to get out of hand in blogs and message boards, and with relatively little positive fruit.</p>

<p>So to conclude, I'm inclined to suspect that blogosphere debate of theology is doomed to be a poor witness to any unbelieving onlookers, as well as being very ineffective in changing Christians' minds.</p>

<p>I've got a lot more reasons coming, so I suspect I may have convinced myself to quit this sphere before I get through them.  I'll try to finish the series anyway, in order to crystallise my thoughts and make a more decisive break.</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Blogging critique part 1: Genuine influence?]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/blogging-critique-part-1-genuine-influence/" />
    <id>http://lukeplant.me.uk/blog/posts/blogging-critique-part-1-genuine-influence/</id>
    <updated>2005-04-23T16:22:33Z</updated>
    <published>2005-04-23T16:22:33Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Blogging critique part 1: Genuine influence?]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/blogging-critique-part-1-genuine-influence/"><![CDATA[
<p>I've become more and more skeptical about the usefulness of blogging and the blogosphere, especially from a Christian perspective.  This will be the first in a series of posts that will criticise blogging :-) .  I don't think that's a complete contradiction, as even good things usually need some criticism to keep them good, and inside criticism is much more likely to be effective and accurate than from those who have little idea of what this world is really about.  As well as contributing to general discussion on this topic, I'm hoping to persuade myself to either quit the blogosphere, or moderate and improve my usage of it.</p>

<p>I'd like to start with questioning how well blogs are a real influence for good.  I'm thinking mainly of the Christian sub-culture within the blogosphere.  I've found that in my Christian life, I'm most effectively influenced by the following:</p>

<ul>
 <li>Preaching: authoritative preaching from the Bible.  And more than that, I find preaching where I am present in person so much more challenging and engaging than a sermon from a tape.</li>
 <li>People who are living out the truths they profess.</li>
</ul>

<p>I feel that the medium of blogging fails to provide in both these areas.  Real preaching is very difficult to do right, if at all, on a blog.  The problem is the audience--you have no idea how long you'll have their attention for, and so can't afford to tackle your subject in the way you might do in a sermon.  DV, I'll be addressing the nature of blog posts more fully in a later post--suffice for now to say that blogs are rarely full of meaty sermon-like posts.</p>

<p>Secondly, while bloggers may well be living out holy, God-pleasing lives, I have no way of knowing.  If I could witness opinions being lived out, and like what I see, I might be forced to have a look a at a new idea more closely.  But, despite being faced with thousands of different Christian viewpoints and theologies on the web, I haven't found myself attracted to any of the ones I didn't already appreciate.  I strongly doubt that I am going to make a spiritually life-changing discovery through reading other people's blogs, nor that I will cause something similar for anyone else.</p>

<p>I admit that this last point could change if I got to know some other bloggers more thoroughly.  But again, that requires quite a lot of effort, and can only really be done through non-public media, such as personal e-mails, which then kind of reduces blogging itself to a means of meeting people.</p>

<p>Blogging probably doesn't take away any time I would have spent listening to sermons or Bible studies - for one thing, I tend not to use my computer at all on the Lord's day.  But it might be detracting from time spent with other Christians who I know in the flesh, and I am much more able to fellowship with, learn from and help in a meaningful way, and if so, has a lot to answer for.</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[New blog system]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/new-blog-system/" />
    <id>http://lukeplant.me.uk/blog/posts/new-blog-system/</id>
    <updated>2005-02-13T00:14:42Z</updated>
    <published>2005-02-13T00:14:42Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Software development" />
    <category scheme="http://lukeplant.me.uk/blog" term="Blogging and bloggers" />
    <category scheme="http://lukeplant.me.uk/blog" term="lukeplant.me.uk" />
    <category scheme="http://lukeplant.me.uk/blog" term="Web development" />
    <summary type="html"><![CDATA[New blog system]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/new-blog-system/"><![CDATA[
<p>I've managed to complete my new blogging software, and I'm rather pleased with myself about it too.</p>

<p>The web pages may look fairly similar, but under the hood it's completely brand new.  One new feature is a much better categories system - have a look at the side bar - and a proper template engine, which is reflected in the fact that the title of the page changes on the pages for individual items, amongst other things.  Also, for those of you using the RSS feed, have a look at my <a href='feeds.php'>feeds</a> page where you can customise your feed to posts that are of interest to you.  The comment forms now also have a 'Preview' button.</p>

<p>The lack of filtering by category was one thing that was holding me back a bit - I'm aware that posting about software and computers half the time is going to make this fairly boring to most of the Christians who might read this blog.  But now you can filter that out yourself!</p>

<p>I was pleased with how quickly I was able to develop this lot, and with the quality of the resulting code -- it took me about 5 evenings, and then about half of today to add basic admin functions.</p>

<p>My method is based around the <a href='http://www.massassi.com/php/articles/template_engines/'>excellent PHP Template Engine</a> I mentioned before.  Did I mentioned that it is the <a href='http://www.massassi.com/php/articles/template_engines/'>best PHP Template Engine there is</a>?  It's <a href='http://www.massassi.com/php/articles/template_engines/'>really great</a> (that's for Google).  In total I've got around 1600 lines of code, but that includes the template engine (which is only about 40 lines), admin functions for adding, listing, deleting and editing posts, a very simple but powerful flatfile database class I had to write at the same time, functions for getting cached remote files (used for my blogrolls), the RSS feed, the RSS feed picker, and a trackback server (pinched mainly from WordPress), as well as the front end stuff.  I've also implemented a kind of MVC (<a href='http://c2.com/cgi/wiki?ModelViewController'>Model View Controller</a>) system, and I have a complete data access layer (though one which is as simple as it can be - due to PHP data structures my data model is reduced to a list of constants).  I've loved how flexible the template engine stuff is too - you can use it for as much or as little of any page as you want.</p>

<p>Lots of things came together to make this project first very quick, and secondly something I'm proud of (can you tell?!):  First was the template engine, and realising that the goal is separation of presentation and 'business' logic, NOT separation of PHP and HTML (or separation of declarative and imperative code, to put it more generically);  Second, keeping in mind lots of the <a href='http://directory.google.com/Top/Computers/Programming/Methodologies/Object-Oriented/Criticism/'>criticisms of OOP</a> I've been reading, especially <a href='http://www.cs.loyola.edu/~binkley/772/articles/oopbad.htm'>Object Oriented Programming Oversold</a> and related articles;  third, and ironically, being more aware of MVC and other design patterns; fourth, having a better grasp of how to design databases. 
The resulting code tries to use a variety of paradigms <strong>as and when they are useful</strong>.  It also uses some techniques and ideas I've not seen before, which at first seemed like a bit of a hack, but after reading some more of the stuff about <a href='http://www.geocities.com/tablizer/top.htm'>Table Oriented Programming</a> I've now decided are a deliberate move!</p>

<p>The code still isn't perfect (or complete - I haven't don't bulk moderation of comments yet, or admin front end for adding categories), and it hasn't totally eliminated in all areas the tedious mapping of database fields to user interface fields, which was something I was aiming for.  There are also things I'm still working out and experimenting with, but I've got a pretty good basis for further PHP apps.</p>

<p>One nice thing I've implemented is separation of the presentation and control of forms such as the comments form.  This will enable me to make it fairly spam proof in the future, which is fast becoming a priority.</p>

<p>I'll be writing up separate entries on the range of things I've learnt with this project - it has been frustrating not having the software complete enough to use it for blogging for this past week!</p>

]]></content>
  </entry>
</feed>
