<?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[A Django website that took (a lot) more than 20 minutes.]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/a-django-website-that-took-a-lot-more-than-20-minutes/" />
    <id>http://lukeplant.me.uk/blog/posts/a-django-website-that-took-a-lot-more-than-20-minutes/</id>
    <updated>2006-06-19T20:32:44Z</updated>
    <published>2006-06-19T20:32:44Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Python" />
    <category scheme="http://lukeplant.me.uk/blog" term="Software development" />
    <category scheme="http://lukeplant.me.uk/blog" term="Web development" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <category scheme="http://lukeplant.me.uk/blog" term="Django" />
    <summary type="html"><![CDATA[A Django website that took (a lot) more than 20 minutes.]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/a-django-website-that-took-a-lot-more-than-20-minutes/"><![CDATA[
<div class="document">

<div class="section">
<p>These days you seem to hear a lot about building a web app in 20 minutes
using framework X and language Y.  The most exaggerated of these I
read recently was <a class="reference" href="http://homepage.mac.com/svc/LispMovies/index.html">(Re)writing Reddit in Lisp in 20 minutes and 100 lines</a>.  Here is a
brief critique, without having watched the movie at all:</p>
<p>100 lines of code in 20 minutes is 300 lines an hour.  Typically
you would expect to be able to do 30-40 LOC/hour, so this is very
good going.  Here are a few explanations, all of which are possible,
with varying degrees of plausibility (and I'm ignoring the possibility that the author was
exaggerating in terms of time -- though he is clearly exaggerating with the
use of the word 'rewrite', as <a class="reference" href="http://programming.reddit.com/info/7n44/comments/c7onb">other people have pointed out</a>):</p>
<ol class="arabic simple">
<li>The author is a super genius.</li>
<li>He had half the code written in his head before he sat down to type.</li>
<li>He knew the problem domain exceptionally well -- he wrote something
similar in python (or lisp) the week before.</li>
<li>He had a working installation of everything he needed, to which he
could just add a few pages i.e. he had already done all the 'set up' phase.</li>
<li>He was benefiting from the development honeymoon period (more below).</li>
</ol>
<p>There are some other possibilities that probably don't apply to this
case, but often contribute to the '20 minute web app' syndrome:</p>
<ol class="arabic simple" start="6">
<li>Lots of copy and paste was involved</li>
<li>You have a framework or piece of software that, out of the box,
happens to provide a very large proportion of what you need.</li>
</ol>
<p>The 'honeymoon' period of software development is the bit that comes
after you have set your machine up etc, and you start coding from
nothing.  If you have nice frameworks or libraries, you can get
fantastic levels of productivity at this point.  There are various
reasons, but I think you can summarise it by saying that you are doing
zero 'maintainance' programming, and you have, at that point, a very
small application that suffers from none of the problems of large
applications.</p>
<p>For instance, achieving <a class="reference" href="http://c2.com/cgi/wiki?OnceAndOnlyOnce">OAOO</a> is very easy when you are
writing the code for the first time.  Even if you do produce
duplication, it's very easy to keep track of, and you haven't yet
suffered the pain of <em>not</em> obeying OAOO.</p>
<p>You also haven't had to worry about the finishing touches and tying up
loose ends -- it makes no sense to do them yet, so you rightly ignore that for now -- but
those finishing touches take time.   Nor have you had to worry about
deployment etc.</p>
<p>The problem is that none of the above will help the more normal
programmer to maintain that kind of productivity on a larger application.
The honeymoon period is soon over, and finding ways to remove
duplication and write maintainable, flexible code with few defects
becomes much harder.  Even the techniques that may have made the initial
development phase so easy and productive may turn out to be the bane
of your life (such as copy-and-paste, and lots of the shortcuts and methodologies
typically encouraged by PHP).</p>
<p>So, I'm going to present to you an account of an application that took
a lot longer than 20 minutes to write.  I intend to make it as
balanced as possible.</p>

</div>

<div class="section">
<h2><a id="what-i-ve-been-doing-for-10-months" name="what-i-ve-been-doing-for-10-months">What I've been doing for 10 months</a></h2>
<p>Since September (September 2nd, to be exact, according to my
Subversion logs), I've been working on a <a href="http://www.djangoproject.com/">Django</a> project in my spare
time, and it's finally complete.  I've kept a pretty complete log of
my hours, split by activity, so I'm hoping it will be of some use to
those trying to make realistic estimations of coding time.</p>
<p>The project is now live at <a class="reference" href="http://www.cciw.co.uk">www.cciw.co.uk</a>.
It is a website for a charity that runs outdoor Christian camps, which
I've been involved in all my life (literally!).  The website has all
the details of the camps, camp sites, leaders etc, and a community of
people who have been on the camps, based around a message board and
photo gallery system.  [Edit 2012: the site is now quite different in emphasis since this article in 2006, since the forums are rarely used now]</p>
<p>Until a few days ago, the website was running under PHP with
a <a class="reference" href="http://lukeplant.me.uk/resources/flatfile/">flatfile database</a>.
The new website is mainly a re-implementation of
the existing functionality, but I have added quite a few things and
tidied quite a lot up, and I didn't bother trying to salvage any of
the existing PHP code by porting it -- I wrote everything from scratch.</p>
</div>

<div class="section">
<h2><a id="aims" name="aims">Aims</a></h2>
<p>My main aims were:</p>
<ul class="simple">
<li>to get rid of the ropey old PHP code (not to mention the flatfile
database), and produce some clean, maintainable code.</li>
<li>to make it easy to moderate the message boards.  The main users of
the website are 11 - 17 year olds, and the camps are strongly Christian in
ethos and aims, so it's very important that the camp website is always
a safe and fun place for the campers to interact.</li>
<li>to make the website manageable by other people instead of just me,
and hopefully write myself out of the picture.</li>
<li>to add some fun new features.</li>
<li>to generally increase usability.</li>
<li>to get a reliable database, and a proper SQL one that
would enable things like the 'stats roundups' I occasionally do.</li>
<li>to do some test driven web-development.</li>
</ul>
</div>

<div class="section">
<h2><a id="hours" name="hours">Hours</a></h2>
<p>I've spent a total of 240 hours on the project, or about 6 working
weeks.  That's
quite a lot, and quite a bit more than you typically hear quoted for
Django apps, but the project is probably fairly large compared to most
of the ones you hear about:</p>
<p>It contains 22 database models, about 60 view functions (which vary massively
in size -- a handful are straight generic views, some of the message
board ones are moderately complex), 15 Atom feeds and a total of 56
template files.  It also has 14 custom template tags and various other
bits and pieces as you would expect in a project of that size.</p>
<p>Also, the figure given above totals <em>all</em> my activities, including:</p>
<ul class="simple">
<li>learning Django (and Python to some extent)</li>
<li>data migration (a lot of it -- I was careful to ensure none
of the old message boards were lost, and some of them go back
6 years to an even older system.  I even managed to rewrite
any embedded URLs in message board posts etc so that they are still
correct)</li>
<li>design mockups (I'm not much of a designer, but I'm the only person
who is working on this), and then the actual designs in XHTML 1.0 strict,
the highest quality stuff I've done so far in terms of semantic
HTML and clean CSS.</li>
<li>all the setup and deployment issues (setup was easy, but final
deployment was harder because of another project I wrote that used
the same database, and some of the same tables, but was deployed
earlier, so I had to do a bit of a database merge).</li>
<li>a fair amount of content editing</li>
<li>oh, and writing the code (models, views and templates), testing
and debugging, which accounted for about 75% of the time spent
(perhaps a little less, it's not always easy to divide up the time correctly).</li>
</ul>
<p>In terms of code there are about 2000 lines of template code, 6000
lines of Python, and 900 lines of migration scripts (done in
Python).  I know LOC
aren't that accurate a measure of program size, but hopefully that's
of some help.</p>
<p>Given those figures, it looks like I was reasonably productive --
averaging over the complete time that comes to about 37 LOC/hour,
which is reasonable.  I also have been careful to avoid cut-and-paste,
which can be an easy way to get stuff done, (and add LOC), but also an
easy way to leave an unmaintainable mess behind!  The great design of
Django, including things like <a class="reference" href="http://www.djangoproject.com/documentation/templates/#template-inheritance">template inheritance</a>,
and the power of the Python language makes it possible to really keep
duplication to a minimum.</p>
<p>Some of the things that added to the development time were:</p>
<ul class="simple">
<li>trying to handle my existing data properly (which added a fair amount of special
casing etc)</li>
<li>changing Django APIs -- which meant sometimes I had to
rewrite, and sometimes I avoided features that I knew were not stable,
and went for something that might not have been optimal just to
crack on.</li>
<li>lack of ability in the design area</li>
<li>deciding to change to Postgres part way through (though that was fairly
trouble free)</li>
<li>and probably a bit of perfectionism.</li>
</ul>
<p>I should also point out that the framework is more mature than when I
started!  In fact, some of the things I coded have become part of
Django -- the hours where I was consciously hacking on Django
itself I was careful to log separately, but nevertheless some of the
code I wrote for CCIW ended being generic and has made it's way into
the core framework -- so that's code you won't have to write if you
start with Django now.</p>
<p>On the other hand, there are some things which would increase a
realistic estimate of the coding time.  The main one is that for at
least half of the code I was writing, especially the message board
code, I had a very good idea of what I
was doing, having implemented it once already, even if it was several
years ago.  It's very difficult to measure the effect of this --
although the python code I wrote bears very little resemblance
superficially to the original PHP code, it is very likely that my subconscious
knowledge of how it would work in general helped me a lot.</p>
</div>

<div class="section">
<h2><a id="analysis" name="analysis">Analysis</a></h2>
<p>I'm quite pleased with my results!  I'm not sure if
I can really give a less biased view.  I normally find with
programming that by the time I've finished a project, I'm already
quite unhappy with the quality of the code, and I have a list of
'cleanup' TODOs, or even 'rewrite this large chunk of it' TODOs, which
usually never get done. By the time a few years have passed, I'm
downright ashamed.  So far I don't feel this way about any of the code -- let's see
how long that lasts!</p>
<p>The quality of the HTML is pleasing - the <a class="reference" href="http://lukeplant.me.uk/resources/djangovalidator/">Django validator app</a> I wrote
(development time not included) made creating the entire site
using only XHTML 1.0 strict really very easy -- a
task that I used to think was quite a challenge.  The only part that
proved tricky was writing a bbcode parser that would accept anything
the users can throw at it and always produce valid XHTML that matched
what the user would expect to get.</p>
<p>In terms of visual design, I'm reasonably pleased -- though there are quite a
few places that could do with a designer's eye.  And as for end user
experience, I can't really say yet.  I've tried to slim down the
interface and make the pages a bit simpler than they were before, but
some new features, especially 'tagging', have added more things back
in.</p>
<p>In terms of making the website easy for other people to manage,
Django's admin has solved pretty much all of that.  For the main
models that other people will have to administer (which are details of
the camps we run, camp sites they run at and people who run them),
it's astonishing how well the automatic admin functionality caters for
it -- it does a lot more than I would have managed to create if I were
writing a custom admin interface manually.</p>
<p>I've also made the website self-maintaining as much as possible -- for
instance, every year each camp that has just finished gets a new
forum, and this now creates itself on first access.  The website also has
a concept of the 'next year', which depends on when camps finish etc,
and the 'clock' for this ticks over automatically.</p>
<p>For moderation, everything now has a feed, so it is very easy to
aggregate message board posts for the entire website, or for an
individual user, and be aware of new topics etc.  I discovered some
nice patterns while doing the Atom feed work -- detailed below.</p>
<p>On a downside, I did very little test driven development.  I came to
the conclusion that Django's view functions are very difficult to
test.  They take complex objects and return complex objects, and their
output is highly dependent on what is in the database, so you have to
do a lot of set up first.  The view functions themselves often do very
little -- in fact some were just generic views, so testing them would
just have been testing Django.  Some do quite a lot however, but what
exactly they do will depend on the validity of input and data in the database
etc.  I realised that unit tests are pretty inappropriate,
but functional tests, using a tool like <a class="reference" href="http://twill.idyll.org/">twill</a>, would be perfect.</p>
<p>Unfortunately, after installing and playing around with twill, I
never got around to writing tests with it, partly because of the pain
of having to write setup code.  I know that other Djangoers have done
good work here, but with time constraints this was the first thing to
go.  I did, however, write tests the parts of the system which could
be decoupled easily from the view functions -- in particular most of
the bbcode parser was developed in a test driven manner, which worked
very well.</p>
</div>

<div class="section">
<h2><a id="feeds" name="feeds">Feeds</a></h2>
<p>I didn't use Django's
'high level' feed framework, as it didn't fit very well, but the lower
level one was just perfect for what I wanted.  Feeds are all available
at URLs with '?format=atom' appended to the normal page.  To handle
this, I've got mini-framework involving a <tt class="docutils literal"><span class="pre">handle_feed_request()</span></tt>
function and base <tt class="docutils literal"><span class="pre">CCIWFeed</span></tt> class that inherits from
<tt class="docutils literal"><span class="pre">feeds.Feed</span></tt>.</p>
<p>With these in place (25 lines of code), my class for generating the
feed for new message board posts, for example, looks like this:</p>
<pre class="literal-block python">
class PostFeed(CCIWFeed):
    template_name = 'posts'
    title = &quot;CCIW message boards posts&quot;

    ## This is called by CCIWFeed.items()
    def modify_query(self, query_set):
        return query_set.order_by('-posted_at')[:POST_FEED_MAX_ITEMS]

    def item_author_name(self, post):
        return post.posted_by_id

    def item_author_link(self, post):
        return add_domain(get_member_href(post.posted_by_id))

    def item_pubdate(self, post):
        return post.posted_at
</pre>
<p>(Plus there are two templates to support this).</p>
<p>However, you can also get a PostFeed for a specific member -- i.e. all
posts that were created by that member.  The only thing that needs to
change is the title, so the implementation is just the following:</p>
<pre class="literal-block python">
def member_post_feed(member):
    &quot;&quot;&quot;Returns a Feed class suitable for the posts
    of a specific member.&quot;&quot;&quot;
    class MemberPostFeed(PostFeed):
        title = &quot;CCIW - Posts by %s&quot; % member.user_name
    return MemberPostFeed
</pre>
<p>The view code has to call <tt class="docutils literal"><span class="pre">member_post_feed()</span></tt> with a specific member,
and passes the generated class to the feed handling code.  It doesn't
require a special view -- it just requires two lines in the existing
HTML view for a specific member's posts.</p>
<p>This pattern is repeated quite a number of times, and I think it is
wonderfully elegant -- it's so easy to see what it is supposed to do,
and using a class in the same way you use closures is so expressive.</p>
</div>

<div class="section">
<h2><a id="conclusion" name="conclusion">Conclusion</a></h2>
<p>I've enjoyed this project, and I'm very pleased with the result, but I
am also happy to get it over with, as it has been dragging on in
my spare time since September.  The launch of the new website
has been a bit of a non-event.  The amount of traffic on the
site varies enormously -- after the camps in the summer when everyone
has just met up again, there is a massive surge in activity -- last
August and September the very small active user base managed to create
up to 280 posts a day.  But right now, there is almost no
activity and it's been like that for months.  I have to tell myself
that it hasn't been a wasted effort :-).</p>
<p>If anyone wants to play with it, you can use the forum at
<a class="reference" href="http://www.cciw.co.uk/website/forum/8/">http://www.cciw.co.uk/website/forum/8/</a> and log in using user name and
password 'guest'.  I'll probably clear out everything that 'guest'
creates every week or so, so create whatever you like.</p>
<p>Finally, if anyone is interested in any of the code, I'd be happy to
make it available.  Most of it is probably quite specific to CCIW, and
not very re-usable, but I made the tagging functionality very generic
(I posted to django-devs about this already), and there may be other
bits people would want to glean.</p>
</div>
<div class="section">
<h3>Postscript</h3>
<p>For the language partisans:  my reference to the Lisp article wasn't meant to imply that using Lisp for web development would't scale or would be worse than Django -- I have no idea, as I have never used Lisp.  (By contrast, my references to PHP <em>did</em> come from experience and <em>were</em> meant to imply that Django is much better than PHP :-).  My main point was that a small project really doesn't give you much idea about a bigger project -- the techniques used for a  prototype or small project may or may not scale.  I do know that Django was written by experienced developers who knew the pitfalls of web development, and wrote the framework specifically to avoid them, and to make the common things very easy, and I think they have succeeded admirably.</p>
</div>
</div>
]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Django]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/django/" />
    <id>http://lukeplant.me.uk/blog/posts/django/</id>
    <updated>2005-09-10T18:28:32Z</updated>
    <published>2005-09-10T18:28:32Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Python" />
    <category scheme="http://lukeplant.me.uk/blog" term="Web development" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <category scheme="http://lukeplant.me.uk/blog" term="Django" />
    <summary type="html"><![CDATA[Django]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/django/"><![CDATA[
<p>Just discovered the <a href="http://www.djangoproject.com/">Django web development framework</a>, and I think I'm in love.  It's written in Python, and you can use it with mod_python and Apache, which means it's more accessible than other Python frameworks.  And it's brilliant.  </p>

<p>I'm starting to rewrite the CCIW website using Django, and I'm amazed at my progress.  It comes complete with an object relational mapper (ORM) to do all the database stuff for you -- you just write class definitions.  Not only does it do all the backend stuff, dynamically create APIs for getting all related objects for a given object, and provide a very nice template engine, it also generates a wonderful administration interface for you, completely dynamically and for free!  So far I've written the basic classes (about 15-20 tables in all), and written scripts (in python) for porting almost all the old data (I was amazed how much there is — 17,000 posts to the message boards!), done some of the actual website pages and configured the admin interface a bit.  Here is a screenshot of the kind of interface you can create in <em>literally</em> a couple of lines of code:</p>

<p><a href="/blogmedia/djangoadmin.png" title="Follow link for full image of Django admin interface"><img src="/blogmedia/djangoadmin-thumb.png" /></a></p>

<p>Hopefully it won't take me too long to get the whole website done.  It should mean lots of new features for the members (e.g. searching, improved bookmarks), much easier moderation functionality for moderators and point and click interfaces for updating the website for CCIW staff (e.g. for adding camp details as above).</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Ubuntu and Debian AMD64 repository]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/ubuntu-and-debian-amd64-repository/" />
    <id>http://lukeplant.me.uk/blog/posts/ubuntu-and-debian-amd64-repository/</id>
    <updated>2005-04-08T21:58:08Z</updated>
    <published>2005-04-08T21:58:08Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="lukeplant.me.uk" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <category scheme="http://lukeplant.me.uk/blog" term="Linux" />
    <summary type="html"><![CDATA[Ubuntu and Debian AMD64 repository]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/ubuntu-and-debian-amd64-repository/"><![CDATA[
<p>I've started a small repository for AMD64 builds of Debian and Ubuntu packages.  I found that there are a quite of lot of debs out there from various sources which have been built for i386 architecture, but not for AMD64.  It is <i>possible</i> the i386 debs will work on an AMD64 Ubuntu I think, but you'd have to 'force' the install, and apt-get won't find any i386 debs anyway, so it's a much better idea to rebuild the software.</p>

<p>As I find software I need but which doesn't have an AMD64 build, I'll rebuild it from deb sources and upload it.  So far I've only done <a href="http://lpnotfr.free.fr/kde-apt.shtml">kio-apt</a> and <a href="http://www.venge.net/monotone/">monotone</a>. I'll put a proper page up listing what I've got soon.</p>

<p>For now, you can get the packages using apt-get and adding these lines to your sources.list:</p>

<p>deb http://lukeplant.me.uk/debian ./<br/>
deb-src http://lukeplant.me.uk/debian ./<br/>
</p>

<p>I've only tested them with Ubuntu, which probably corresponds to Debian sid (unstable).  I may also accept requests for building AMD64 packages for those who don't know how (or can't be bothered!).</p>

<h3>Monotone</h3>
<p>By the way, the instructions for building <a href="http://www.venge.net/monotone/">monotone</a> warn that you'll struggle to build it with 128Mb of RAM, and they weren't wrong!  I found the g++ compiler using up to 170Mb to compile that thing!</p>

<p> I've now started playing with it for the rewrite of <a href="http://www.cciw.co.uk/">cciw.co.uk</a> which really needs to be done.  However, I don't think it will really be a distributed development project (which is what monotone is for), unless there are some more CCIW people who know PHP  and are interested in hacking on this.  Anyone? </p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[MrKnowItAll's inbox]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/mrknowitall-s-inbox/" />
    <id>http://lukeplant.me.uk/blog/posts/mrknowitall-s-inbox/</id>
    <updated>2004-09-11T18:08:43Z</updated>
    <published>2004-09-11T18:08:43Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Personal and misc" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <summary type="html"><![CDATA[MrKnowItAll's inbox]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/mrknowitall-s-inbox/"><![CDATA[
<p>There is a user on <a href='http://www.cciw.co.uk/'>CCIW</a> called <a href='http://www.cciw.co.uk/members.php?sp=MrKnowItAll'><b>MrKnowItAll</b></a>.  He is, in fact, just a bot who notifies people when their favourite places have been added to (and of course you can turn him off in your preferences).  But that doesn't stop him getting messages in his inbox:</p>

<h3>MrKnowItAll's inbox</h3>

<div style="margin:10pt">
<table border=1>
<tr><td><b>From</b></td><td><b>Message</b></td><td><b>Date</b></td>
<tr><td><a href='http://www.cciw.co.uk/members/Beth/'>Beth</a></td><td>Huh?! who on earth are you!?!?! hmmmm...... let me think...... could you be Rich!? <img alt="wink" src="http://www.cciw.co.uk/images/emoticons/wink.gif"></td><td>10 Oct 2002, 10:33:29</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/Beth/'>Beth</a></td><td>Hey you know you can get REEEEAAAALLLY annoying!! I don't know why you chose me to pick on!!</td><td>10 Oct 2002, 10:35:58</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/james/'>james</a></td><td>This must be Jon Mackenzie<br>Or Michael Jackson</td><td>3 Mar 2003, 21:27:35</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/becky/'>becky</a></td><td>heya yes looks like they did who is this btw?!?!?!</td><td>5 May 2003, 21:24:02</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/Goose/'>Goose</a></td><td>Thanks, like I've never seen that before?! Can i ask, who are u?</td><td>8 Aug 2003, 14:10:08</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/Jenny_14/'>Jenny_14</a></td><td>will u stop sendin them msgs i dont want to know anymore plz stop thnak you</td><td>9 Sep 2003, 20:51:20</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/lane/'>lane</a></td><td>who is this?</td><td>9 Sep 2003, 19:40:01</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/Catz/'>Catz</a></td><td>Heya, sorry, me is a little confused :s, is this graeme? and wot are you trying to show me? sorry i'm a lil confussleeeddddddd! have a gr8 new year tho love catziex x x</td><td>12 Dec 2003, 14:35:33</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/caz1991/'>caz1991</a></td><td>hi i dont now how u are so what do u what</td><td>8 Aug 2004, 10:06:55</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/gorjess/'>gorjess</a></td><td>who r u?</td><td>8 Aug 2004, 22:27:51</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/caz1991/'>caz1991</a></td><td>did u go it camp and plz stop it who r u</td><td>8 Aug 2004, 20:26:26</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/caz1991/'>caz1991</a></td><td>can u plz stop it now who r u</td><td>8 Aug 2004, 16:55:03</td></tr>
<tr><td><a href='http://www.cciw.co.uk/members/Rich_Tea_2/'>Rich_Tea_2</a></td><td>who is this</td><td>9 Sep 2004, 21:15:18</td></tr>
</table>
</div>
<p>I guess posting that here is a bit mean, but what is the point of power if you don't abuse it?  :-) BTW, I do tell people after a while if they really don't get it.</p>

]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Toothache]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/toothache/" />
    <id>http://lukeplant.me.uk/blog/posts/toothache/</id>
    <updated>2004-09-06T04:01:56Z</updated>
    <published>2004-09-06T04:01:56Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Personal and misc" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <category scheme="http://lukeplant.me.uk/blog" term="Christianity" />
    <summary type="html"><![CDATA[Toothache]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/toothache/"><![CDATA[
<p>Well, not exactly toothache.  Last time I was at the dentist I had some x-rays on my back lower teeth to look for cavities, and it showed up that the wisdom teeth on either side were coming through at an angle - both were still submerged, but tilted forwards about 20-30 degrees, and on a collision course.  We left them, since neither of them was giving me any pain at the time.  That time is over.  Hence the time of this entry.  It's the kind of pain that really isn't too bad if you've got plenty to be doing, but trying to sleep is the pits.  I did actually manage an hour or so, but the gums have continued to swell, and the discomfort proportionally, so I figured I may as well get up, and do something profitable.  Not sure where rambling away on my blog fits into that, but anyway.

<p>I'm reminded of one of <a href='http://www.reformed.org/documents/Edwards/j_edwards_resolutions.html'>Jonathan Edward's resolutions</a>:</p>

<blockquote>10. Resolved, when I feel pain, to think of the pains of martyrdom, and of hell.</blockquote>

<p>I guess the big idea behind that is to limit self pity, and to get a good perspective.  The previous one is equally fascinating:</p>

<blockquote>9. Resolved, to think much on all occasions of my own dying, and of the common circumstances which attend death.</blockquote>

<p>As far as I can tell from the bits of his biography and other writings that I've read, Jonathan Edwards was not a morbid kind of person.  His attitude was to think about things that would do him spiritual good, irrespective of whether it was comfortable.  All the resolutions demonstrate the amazing seriousness which was characteristic of his life - for him, religion (in the sense he used the word) was not an important part of his life, but absolutely everything.

<p>While I'm rambling,  I've got to mention "The Heavenly Man", which I'm reading at the moment, and really enjoying.  There are, without a doubt, quite a number of places where theologically I can't agree with what is being implicitly taught.  But on the whole I have to say I've been so challenged by it.  Some of the Christians seem to match descriptions like <a href='http://bible.gospelcom.net/cgi-bin/bible?version=NKJV&passage=2%20Cor%208%3A1,2'>2 Corinthians 8:1,2</a> so amazingly.  Brother Yun is clearly a mighty man of God, and must have been a very well known Christian in China, yet when in prison his family suffered great poverty, as the Christian community was too persecuted and poor itself to help them.  If a famous preacher over here was in anything like a similar situation, you could guarantee his family would be well cared for -- we live such pampered comfortable lives, and I for one so easily forget the immense suffering of Christians in other lands.

<p>Well, I've still got about 4 hours before I'll be able to get any pain killers, so I've got to find some more things to do.  So far I've fixed some things with the CCIW website, added <a href='http://www.cciw.co.uk/members.php?sp=VALLEY'>VALLEY</a> as a moderator, fixed some problems with this blog (times should now show up correctly instead of German time, including all previous posts), read my email, and a few other bits and pieces.  I do have about 20 things on my todo list, but none of them looks fun...
]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Reboot Blues]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/reboot-blues/" />
    <id>http://lukeplant.me.uk/blog/posts/reboot-blues/</id>
    <updated>2004-08-25T01:29:17Z</updated>
    <published>2004-08-25T01:29:17Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <category scheme="http://lukeplant.me.uk/blog" term="Linux" />
    <summary type="html"><![CDATA[Reboot Blues]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/reboot-blues/"><![CDATA[
<p>I had to reboot my computer today, which is quite gutting.  Some program crashed and somehow my keyboard stopped responding, so although the system itself hadn't crashed, I was still rather stuck, and a reboot was the only option.  I had only achieved 83 days without rebooting as well - 100 would have been nice :-( .</p>

<p>The upside is I can now get on with a few things that required a reboot, like trying out the Linux 2.6 kernel (supposed to be quite a bit faster, and I need that on this old machine), and installing some other distros to try out my kio-sword software.</p>

<p>That aside, I have been kept busy with CCIW lately - there has been a big increase in activity lately (it reached 230 posts per day on Friday), and keeping up with that is quite a task, one the web site doesn't really help me with -- it's showing its age now.  Still, I've improved the 'semi-moderated' mode and auto-moderation so that I get more helpful e-mails out the system.  A proper database backend would make a lot of things easier, and while I'm dreaming, about 5 more moderators too :-) .  The chat room is another nice addition, but again it needs man power in the form of moderators to make it useful.</p>
]]></content>
  </entry>
  <entry>
    <author>
      <name></name>
      <uri>http://lukeplant.me.uk/blog</uri>
    </author>
    <title type="html"><![CDATA[Back to sunny Bradford]]></title>
    <link rel="alternate" type="text/html" href="http://lukeplant.me.uk/blog/posts/back-to-sunny-bradford/" />
    <id>http://lukeplant.me.uk/blog/posts/back-to-sunny-bradford/</id>
    <updated>2004-08-16T16:28:18Z</updated>
    <published>2004-08-16T16:28:18Z</published>
    <category scheme="http://lukeplant.me.uk/blog" term="Personal and misc" />
    <category scheme="http://lukeplant.me.uk/blog" term="lukeplant.me.uk" />
    <category scheme="http://lukeplant.me.uk/blog" term="CCIW" />
    <summary type="html"><![CDATA[Back to sunny Bradford]]></summary>
    <content type="html" xml:base="http://lukeplant.me.uk/blog/posts/back-to-sunny-bradford/"><![CDATA[
<p>After two weeks holiday in Wales (<a href='http://www.cciw.co.uk/pastcamps.php?sp=2004-2'>Camp</a> followed by <a href='http://www.emw.org.uk/ministries/conference/default.htm'>Aber conference</a>), I'm back to work again.  Or should I say back to anything but work.<br /><br /><p>I've been welcomed back by alternate bright weather and thunderstorms, which kind of confines me indoors, after having already spent hours at my computer on saturday when I got back.  So far, I have:<br /><ul><br /><li>Dealt with about 400 of the 700 emails I had waiting for me (I'm on lots of mailing lists, so I didn't actually read all those, but scanning them still takes a while)<br /><li>Uploaded some photos to the photos page for my camp<br /><li>Caught up with what's been happening on the <a href='http://www.cciw.co.uk'>CCIW website</a> and sorted out some pesky CCIW users (WW III had already broken out on the message boards).  This is becoming quite a big task, and I need to find a way easy way to monitor and moderate what is going on.  Activity at the moment is quite high, and Damo is doing more than his fair share of monitoring it.<br /><li>Fixed up my blog, so it now includes headlines on the right hand side, and links to past months, plus some other tweaks.  The blog is powered by CuteNews, which I've now hacked a bit, so it works quite nicely for a blog as well as for my news, and does  RSS feeds too -- all in all, I'm pretty happy with it.<br /></ul><br /><br /><p>On Sunday I had a very nice anti-social afternoon, at home with my thoughts.  The Aber conference left me with lots to think about and go over, perhaps I'll blog some of those thoughts when I get them a bit more organised.
]]></content>
  </entry>
</feed>
