Aquarionics

Category > Python

Taming the dead parrot

Thursday 8th May 2003

Python Question

I need to save a list into a tab-deliminated text-file. (Mark’s RSSParser sends me the last-modified of the feed as a list which I need to save to the config file so I can recall it when I next run and feed it to the site to make sure I’m not grabbing a duplicate).

The logical way to do this is to serialize the list and save it. For this, I find Pickle which does exactly that. The problem is that the format it saves out to contains line breaks, unideal in a tab-deliminated file.

The question is how do I save (or indeed print anywhere) a string as a raw string? The tutorial says that to output a raw string I prefix it with r, which causes logical problems when I’m trying to output from a variable.

Extra bonus points if you can tell me where I should have found this information.

Those who spoke on this:

gravatar image

Simon Callan:

2003-05-09 08:35 15 hrs after the Original Article

This sounds daft.
If you want to save a list to a text file, you don’t want pickle, as it uses an undocumented internal format.
I would go something like
data = ( “1.1”, “1.2”), (“2.1”, “2.2”), (“3.1”, “3.2”))
fh = file “name”, “wt”)
for current in data:

fh.write “%st%sn” % current)
fh.close()

which would produce a file like
1.1t1.2
2.1t2.2
3.1t3.2

Also, AFAIK, raw strings only apply to strings in the source of a python program, where it prevents the compiler from doing things to escape characters. Ie. “t” is a single character string with a tab in it, while r”t” is a 2 character string consisting of a backslash, followed by a t character.
All printing is raw, unless you get into things like unicode, etc.

Comment Link


Thursday 15th April 2004

Write first time

Workrave is telling me I should stop for the day. I trust it. This should not take long.

RSI back. Sentances shorter. Feel like am in a bad Bridget Jones parody.

Possibly Shatner impersonation.

Learning Python. Have taught python to play Foursquare solitare.

Badly.

Am positive that are better ways of doing things I’m doing. Doing it anyway. Learning Process Considered Nonhalmful.

Recent Things Seen:

(Blinks not working. No idea why. Suspect aliens. Possibly Allens.)

Aquarionics now has its own Amazon ASIN code. Counting days until am in bargain basement.

Fanpants. I’ve no idea what I can say about this.

Real ask Apple to open up AAC DRM because Real are famous for opening up formats and everything.

Freedom Force 2 Diary for great justice.

Am getting tired of sentances fragmented are they. Am going to cast Summon Gramatical Ability, to see what happens.

Ahh, better this is. Irritating that structure was getting.

Try that again. Right. It’s been an dull week on Planet Aquarion. I’m attempting to make the most of my employment limbo by learning how Python actually works. Despite having written Aquaintances in it, I’ve little to no idea how the language actually works (Aquaintances is very much cargo cult programming, and anyway, I’m no longer using it, I’ve switched to Bloglines instead along with the rest of the known world). This has involved working though Dive into Python and applying the new knowledge gained to solving the problem, which is making FourSquare work.

FourSquare Patience

  1. Shuffle normal 1c52 deck.
  2. Deal four cards into seperate “play” piles
  3. Remove any Kings from the top of any “play” pile.
  4. If any cards on the top of any of the play piles add up to 13 (A=1, J=11, Q=12) remove those two cards to the Win pile.
  5. If any play piles are empty, deal one card to each empty space and go to step 3.
  6. Otherwise, go to step 2.
  7. Once you run out of cards to be dealt. Add play piles together, do not shuffle and go to step two.
  8. When all cards are in the win deck, you’ve won.

(1c52 == 1 standard deck of 52 cards, meaning no jokers. Contrast with 2c52, 1c104 (Include latin suites), 1c54 etc)

For a patience game, it’s very simple, can be completely automated, but can be made more or less complicated more or less arbitarily. For example, you may want to consider which cards are underneath at step 4, to see if removing this pair rather than that pair will gain you access to that queen which matches that ace.

In short, it’s a nice progamming exercise for learning a language, but the real test is to see how much of the code you can reuse for writing BlackJack further down the line.

And no, I’m not publishing the code for at least another four lessons or so :-D

Also, I’m still playing x2, Tropico 2, and – thanks it getting posted back to me – Battlefield 1942 (Actually, mostly Battlefield Pirates) and waiting for my life to get interesting again.


Monday 10th May 2004

Accomplish

Todays accomplishment:

XML + XSLT + Python = HTML

(I should point out that the above has required my relearning Python from scratch – previous efforts have been basically PHP in Python – learning XSLT, and learning how mod_python works. Lots of work for so little gain)


Tuesday 11th May 2004

Python annoyance

Given the following code:

def index():
        try:
                import MySQLdb
        except:
                return "Couldn't import MySQL module"
        return "Yay Workyness"

inside a mod_python instance, is there any reason why it should return “Yay Workyness” and “Couldn’t import MySQL module” in roughly equal amounts? (MySQLdb in this case is a sub directory of the current working directory). Bugs I can cope with, but this inconsistancy is driving me insane…

Those who spoke on this:

gravatar image

Simon Willison:

2004-05-11 17:57 3 hrs after the Original Article

I good rule of thumb is that naked excepts are eeeevil and should be avoided at all costs. The problem is that you don’t know if you’re catching an ImportError or an error deeper down, somewhere in the MySQLdb module itself. Change your except line to “except ImportError” and see if you get a different exception rising to the top.

Comment Link

gravatar image

Aquarion:

2004-05-11 18:22 25 mins after Simon Willison

That makes sense. Still don’t know what’s going on, but asking my Friendly Neighbourhood Sysadmin to install the module globally appears to have made it Go Away

Comment Link

gravatar image

Rory Parle:

2004-05-11 22:40 7 hrs after the Original Article

I like your header graphic. It seems Mr Adams is spending rather more than a year dead for tax reasons. Unfortunately the world is doing a woeful job of finding a replacement.

Comment Link


Sunday 6th June 2004

PFd4-II Design Diary - Part One: Start of a Brand New World

In the first part of a brand new series, I'm going to document the entire process of getting a web-app working.

I've been promising a new version of PFd4 for a while now. I have also been meaning to learn Python properly, so I've decided to combine these two projects into one handy package.

PFd4 was originally concieved when 2d10 - which my girlfriend and a number of my other friends were playing an RPG on - went AWOL for two weeks. At the time I was staying with one of the players and her (now) husband, who hosts both this site and my main site Aquarionics. So, Girlfriend, Provider of Free Hosting (both real and virtual), and small number of other friends need a web site. At the time I was unemployed, homeless and about to slide into the dark pit of depression, so I took on the project.

I coded the original version of PFd4 in three days flat, including one day designing the data structures, and as such it isn't the greatest piece of coding I've ever done. The interface for the messaging was messy, and it only barely did what they wanted it to do well. Nevertheless it existed until the game ended a couple of months later, and during that time I consistantly promised myself that I would rewrite it. Now I'm unemployed again, although not homeless this time, and I want to learn a new language and skillset, so I'm using this.

The original structure for v1 is here.

These are the design principles for PFd4-II:

Technical

A new name.

I've never really liked the name PFd4, partly because my brain wants to parse it as PDF4. It stands for "Point First d4" (A d4 being a four sided dice) which is a play on 2D10 - the system it replaced - and the fact that it's quick, painful, and RPGish. (d4s are pyramid shaped, if you stand on them it hurts).

python/mod_python

It'll be written in python, built on mod_python, backending onto a mysql database - as the last one did. This is the tricky bit. I am a PHP programmer by trade - though I did both C++ and Java at University - and am just getting into this python lark. Most of the reason I'm doing this now is to learn python.

XML/XSLT

The python will generate XML, which will be fed though an XSLT stylesheet and passed to the user (Actually, I may not even do this to start with and leave the XSLT client-side, it's slightly quicker)

In fact, even quicker would be to generate XHTML by default - rather than an arbitary XML form - and transform from that.

XHTML/CSS3

The XSLT stylesheet will generate XHTML/CSS3 code that degrades gracefully to older browsers (If it isn't already, see above). It may also produce PDF versions of logs etc.

External Access

Allow XML-RPC interface, NNTP, SMTP access etc. Possibly

Gameplay

Campaigns

Games will belong to campaigns. Any number of active games can be in a campaigns. This may involve subcampaigns, though that might be a little too far.

Characters will belong to Games too, rather than campaign, meaning a character can't be in two games at once. I'm open to negotiation on this bit, because whilst I can see that having three characters for "Bob the Avenger" is duplication of effort, having Bob level up in one game and suddenly be levelled up in the other two is silly. This is also an interface problem, since I don't want duplicate names, but if they're in the same campaign - though different games - and they are the same person (Say, Bob The Avenger aged 16 and Bob the Avenger aged 25) that should be allowed (Yes, I do like the idea of Bob the Avenger, why do you ask?)

Voices

When a character makes a "play" they can do it as a 'voice'. So a thief pretending to be the lady of the person whose house she's robbing would be "Bobette the Thief as Lady Fitzdamnation", with Fitzdamnation as the 'voice'. This concept was popular with those who understood it, but complicated to explain. It remains (I like the idea, and it's my system, damnit) but may end up being on some kind of "advanced" system. Plus, I want to be able to use it so that GMs can use it without the players being aware of it, so instead of "GM as Lord Fitzdamnation" you just see "Lord Fitzdamnation". In fact, it's possible that all GM plays would be made this way, and make the GM register a character for any persistant avatars same as anyone else.

Other Players

At an option for the GM, no player should be able to see what other PCs are playing, or even whether a given play is made by a PC, NPC or GM. NPC is the tricky one of those, because PCs and GM characters can - and will - have profiles, whereas small NPCs probably won't.

Artifacts & Encyclopaedia

Every campaign will get an Enyclopaedia where they can put articles (Text (& Images?)) relating to the campaign. GMs will also be able to upload "Artifacts", a file - any type - which groups can view. (Needs to be worked on to avoid becoming arbitary gallery space)

Groups

Characters can be lassoed into groups, which can then be given permissions. For example, if the GM wanted the group to find an article in Elvish, s/he'd upload the file as an Artifact with the group of "Characters who understand Elvish" being the only group allowed access. Inside this group s/he'd put all the characters who - duh - understood Elvish, and only they would be able to read it.

'Play's can also be restricted to a group, or some groups, or a list of people (For example, all those didn't fail an observation roll might see that the carpet by the bookshelf is trapped, nobody else would see that message), though the list of people might be better off as a message. A message then just becomes a play that only the other person can see, which neatly stops me having to write another bloody e-mail replacement.

Tasks:

  • Implement the database
  • Login system
  • first-cut templating
  • User add/admin
  • Campaigns
  • Message Events
  • Games
  • Characters
  • Plays
  • [1]
  • Groups
  • Plays Mk2 (With groups)
  • Character Profiles
  • Encylopaedia
  • Artifacts
  • Design Cut 2
  • Bugfixen
  • Release.

[1] is the point where the system is usable for testing.

Those who spoke on this:


Sunday 8th August 2004

Sunday Morning & Python

Saturday we had a barbeque. People came around, we played games, we ate home made burgers, nice sausages and barbequed bananas. We dragged people though the streets of Letchworth, forcing them against their will to buy sweets from the World’s Nicest Sweetshop. Truely, we are bad people.

Today, being Sunday, I rose late (10 am being late to my commuter-bound sleep patterns), put some classical music on the stereo, read comics, drank black coffee with cinnamon bark in it, and genrerally did very little. Later, I watched the DVD of the Divine Comedy Concert that Mal sent me, read more comics ccooke pimped at me, and drank tea.

I’ve hit a stumbling block on my currently swapped in project (Which is still Cantrip. I’d hoped to release AqWiki before I got distracted by something else, but anyway) in the templating system I’m using (SimpleTAL) doesn’t appear to be able to return the resulting document as anything other than a file handle, which seems a little strange to me. I’ve fired off an email to the mailing list to ask, but it may be because I’m still thinking in PHP or something.

Answers on a postcard please…


The explaination & Python

After a number of similer requests, I’ve done a Goodbye Browserangel FAQ at holistic.

I leave BA on Friday 15th October, I enter Those Who Evolve so that’ll be fun.

Today I’ve spent attempting to work out how to do Python Web Apps sensibly without being tied to Zope. I’m grasping the Python Way, I think, but I still think in PHP and Web Dev terms, so actually learning by creating a site – rather than the abstract card games I’ve been doing – would probably be more useful.

So far I’ve been playing with Quixote mostly, but since Evolving seem to have centralised on Zope, that would probably be more useful. Thing is, every time I look at it I think something along the lines of “Crikey, that’s a bit overkill for this” and look for something simpler, but the more I go into it, the more Zope looks like The Thing I Should Know, since all the alternatives seem to start with comparing themselves to it. Input from those who know more about this than I do would be handy :-)


Wednesday 22nd September 2004

Cantrip Diary - ZopeTastic

Okay, so my new workplace use Zope, so it’s probably a good idea for me to use that as a framework. I mean, enough people use it for it not to be too bad, right?

Dear god does it suck. I mean, Whales though really thin gauze, it sucks that badly. I got it working on my local network after swearing at it quite loudly. It’s own personal religion of “Not Invented Here” is going to really annoy me, I can tell.

Lets start with the web server. It doesn’t run though Apache without a tremendous amount of futzing around. I like Apache, and run everything else off Apache, so the fact that all my Zope applications will run off a non-standard port (There are fixes for this, yes, but they also require a tremendous amount of futzing around). This is annoying.

Then there is the user system. I have a user account on this machine, you could even talk to it though LDAP. Requiring your own little world to run in – let alone where you don’t tell me the initial username & password, or where the access file is, or anything – is really annoying. Also, it should be noted that in every SINGLE guide I found on how to reset the password manually it missed the fairly basic piece of information that once you have reset the password, you must restart the Zope server otherwise you will spend half an hour working out why it doesn’t take the data. This, admittedly, is partly a Debian Package problem, but since delving has lead me to believe that it used to ask you for a default username and password on configure, and now doesn’t, I’m leaping to the conclusion that whining isn’t going to fix this any.

It should be a default requirement that every Debian package contains a file in /usr/share/docs explaining a) Which configure options were used, b) What you’re going to have to do next to make the package work, and c) Common pitfalls of the above.

Three, the interface. In the last six months or so, the bar for a web-based interface has gone from a minor hurdle to a max-height pole-vault, mostly due to GMail. However, I can state with no fear of derision that <textarea /> is the single most fucking awful method of inputting code since I used a C64 with a broken delete key, and the fact that the physical location of the source files is shielded from me (and will, I suspect, be chowned something silly anyway) means the best way I can see to develop with this pile of shit is to copy/paste from my default text editor, which is just retarded (And yes, that is exactly how I compose blog entries, but I don’t normally need to keep blog entries in CVS). I suspect there is a better way to do this. In fact, I’m sure there must be, or else Zope would be deader than a very dead thing, which brings me to my next point.

The Docs

My first problem with the docs is the inline commenting system. When I’m trying to digest a reasonably complex idea it is of no use whatsoever for the flow of the text to be interrupted constantly by inane slashdotesque comment. On the other hand, without the inline commenting I’d not have known that the introduction to Zope tutorial – which is far better than the one included in the distro – existed, also, I’d have read the chapter on DTML before the chapter on the more advanced, easier to use, designer friendly and new paradigm of Zope Page Templates, which starts off by pointing out how crap everything you read in the previous chapter was. ARGH

Nevertheless, I shall persevere with this Evil, because I’ve got no choice but to know it, in the hope that I will learn my way around it.

Okay, so “find / -iname ZopeZoo” has failed to find any of the files that are part of the tutorial. Where the hell is Zope putting the bloody files? *ARGH*

Those who spoke on this:

gravatar image

Senji:

2004-09-22 19:00 2 hrs after the Original Article

Mozex is your friend.

Comment Link

gravatar image

Aquarion:

2004-09-22 19:22 22 mins after Senji

Not the right problem.

As I say, copying and pasting into a text area is fine, it’s the fact I want to use a VCS that makes me hate it so much.

Comment Link

gravatar image

Sarabian:

2004-09-22 19:14 2 hrs after the Original Article

Don’t beat about the bush, tell us what you really think of Zope :)

Comment Link

gravatar image

Pingter:

2004-09-23 05:27 12 hrs after the Original Article

“and the fact that the physical location of the source files is shielded from me (and will, I suspect, be chowned something silly anyway)”

No such luck—it’s stored in its own database file of a format I don’t know. Look for a var/Data.fs under /var/lib/zope(2.7)/

However, you can access all your files via Zope’s FTP server, which runs on port 8021 or some such, which is a bit nicer.

Comment Link


Vampire: The Maskerade: Bloodlines. Plus: Python

(Too much punctuation in one title, perhaps?)

Aquarion returns from playing Bloodlines
Mandy_Away: good?
Aquarion: Sort of
Aquarion: The story is well done, the characters are very well done, and I'm enjoying it.
Aquarion: And it uses the HL2 engine, so it looks cool
Aquarion: OTOH, it runs like a dog (Even though HL2 - which is far more visually complicated - glides)
Aquarion: and there are occasional scripting glitches which are annoying.
Aquarion: (Like a bad-guy who crashes though the door, gun at the ready, and then stands up and still for a while because I'm hiding behind a box and he can't see me. Which just looks silly)
Aquarion: Oh, and the combat system is a bitch, but that may be because it tends to sink the frame-rate though the floor.
Aquarion: OTOH, I've been playing it for about six or so hours, apparently, which is a bit of a shock. So it must be bearable :-)

Talking of scripting, though, here is an example of Bloodlines' scripting:

## after the masquerade pop-up in the chopshop office
def OnMasqueradeEnd():
    if IsClan(FindPlayer(), "Nosferatu"):
        popup = Find("popup_24")
        popup.OpenWindow()
    else:
        popup = Find("popup_15")
        popup.OpenWindow()

    trig = Find("trig_popup_masquerade")
    trig.Enable()

Yup, Bloodlines' scripting is pure, 100% unadulterated Python code, so if it doesn't work, I can at least try to fix it...


Saturday 15th January 2005

Mounting Python

How do you work with Python and web development? Do you use quixote, mod_python, normal CGI, Zope or something I’ve never heard of? Why do you use that instead of something else?

Those who spoke on this:

gravatar image

Martin:

2005-01-15 22:37 6 hrs after the Original Article

Check out CherryPy at www.cherrypy.org. Take with a healthy dose of Cheetah (www.cheetahtemplate.org) and SQLObject (www.sqlobject.org).

Martin

Comment Link

gravatar image

Ben Hutchings:

2005-01-16 13:15 21 hrs after the Original Article

I’ve used CGI so far, because that’s what I know, but I haven’t done anything significant with it and don’t really fancy trying to roll my own session management.

Comment Link

gravatar image

Phillip Pearson:

2005-01-16 22:36 1 day after the Original Article

For topicexchange.com, I use SCGI (with scgi-cgi) but without Quixote. Requests come in to a hacked up scgi_server.py, which fakes up a CGI environment for the rest of the Topic Exchange code.

I did it this way because the code used to be all executed via CGI, but wasn’t coping well with the traffic.

Comment Link

gravatar image

Tim Parkin:

2005-01-16 23:07 1 day after the Original Article

We use Python for almost everything we do now and have settled on a web framework that really gives flexibility with ability to use the full power of Python for web templating. We use Nevow as the web delivery part and Twisted as a web server (sometimes through apache, sometimes directly). We’ve recently launched the Rugby Superleague site completely developed with Nevow and Twisted and I have to say it’s been pretty cool. Although Nevow is still 0.3 release, it’s definitley production capable and is getting more and more powerful all the time. We’re currently working on getting the forms handling ability so that it can work on any style of form you wish (the formless module just works to expose single objects, ‘naked object’ style). It takes a little more getting into than some templating frameworks and could definitely do with more documentation and better error handling but I’ve looked long and hard and not seen anything better. If you want to see some sample code, just shout. Good luck with Python, whatever framework you decide on, it’s a great language.

Comment Link


Saturday 2nd April 2005

Project Scout

Somewhat to my suprise, I have recieved not one, but two patches to open source projects that I run. That is that gilmae submitted a better install document for AqWiki, and John Meadows has submitted a new version of the viewer file for MusicDB

Flush with this success, I’ve started a new project. Well, two. Threeish, really. First, I’ve gone back to the base system that Cantrip and Escape will be built on, which is actually the Epistula execution model rebuilt in python and mod_python. This is almost finished (yay) and is far neater than the PHP version (double yay) but I’m having trouble with one thing. So, pythonites who are still reading this crap: How do I initalise a class where the name of the class is contained in a variable?

Two, and more importantly, how should I have known this?

The third thing is a collision of a few technologies I’ve been wanting to use for a while: XMLTV, SQLite and AJAX, or DHTML, or whatever we’re calling it today, with a dash of new-media SMS stuff thrown in. Basic premise for project Scout is that it sends you an SMS ten minutes before a TV program that you wanted is due to start. It’s a little more complicated than that, but not much (Until you get to the AJAX bits, really). Enough for me to be able to use it to drink even more of the Python kool-aid, while having something more useful at the end than a random philosophy generator.


Sunday 1st May 2005

Aquaintances 2

Aquaintances 2 is an XML Feed reader for Microsoft Windows, Linux and Apple OSX. It will support baysian filtering of posts – meaning posts you are more interested in will float to the top of your reading lists – as well as regex field matching. It is built in GTK/Python (on top of LibGlade) using the Mozilla Firefox GTK bindings. It parses feeds with the Ultra Liberal Feed Parser, stores them (and most other things) in an SQLite database. It will revolutionise the way you keep track of the world.

Natually, it doesn’t work yet.

This morning I fired up Glade and put down the main interface for the system, which involved a certian amount of farting around with GTK’s box model, and all was fine until I had to attempt to tie the web browser to this.

My preference for this project was to use Mozilla’s “Gecko” rendering engine for the actual displaying of feeds, which was made more difficult by the fact that there are three sets of pages refering to the GTK bindings I was looking for. PyGTKMoz is an aborted attempt to get it working, Mozilla itself has a website on the subject, and PyGTKMoz refers me to PyGTK, which doesn’t mention the bindings at all. Eventually it transpires that the Mozilla bindings are now part of “python-gnome-extras”, which an apt-get installed for me.

That failed to work, because it doesn’t require “mozilla-dev” or “mozilla-firefox-dev” and even when those are installed, I had to manually add /usr/lib/mozilla-firefox add /usr/lib.mozilla to /etc/ld.so.conf so that Python could find it.

Then I had to work out how to get a Widget Glade doesn’t know about into my nice Gladey interface, for which this article was a handy guide, although it’s bitrotted a bit.

Okay, so we have an interface that happily displays a webpage. time to put some actual feed data in it. Importing my OPML file from Bloglines, I wrote a thing to parse the XML (Starting with minidom, which failed because I needed to keep track of recursive tags. so I rebuilt it in SAX (An acronym with too many abbreviations in it) with the standard push/pop method of keeping track of where the hell we are, a method I’ve always found exceedingly ugly, but at least it’s quick…

The tree interface to the subscriptions list was next. The GtkTreeView element caused me a number of problems, partially because I was trying to use it before I really understood it. Also, all the tutorials for using it I found (iki fi, & moeraki were the most useful, as well as the Real Docs) assume you’re building the thing from scratch, rather than editing an already existing TreeView object. Also, there was an interchangability between “TreeStore” and “TreeModel” that was starting to give me a headache. Then, in a blinding flash of light, my screensaver kicked in, englightenment dawned, and I finally grokked it.

So, I have an interface with working buttons that displays the home page of every feed I subscribe to. Except three, which causes a segmentation fault for reasons I don’t understand, but are probably Not My Fault.

Aim is to get it reading and displaying feeds by tonight, with the Bayesian stuff happening tomorrow, at which point I release Real Code and start making it both cool and useable.

2005-05-02: Changed gtkmozbinding instructions, the firefox library appears to crash if you need a plugin

Those who spoke on this:

gravatar image

Stuart Langridge:

2005-05-03 14:19 2 days after the Original Article

What was wrong with minidom? Did it actually fail to parse the XML because of the nested tags? If it did then that’s a serious error in minidom, if the XML was valid…

Comment Link

gravatar image

Aquarion:

2005-05-03 14:30 11 mins after Stuart Langridge

It parsed it, but getElementsByTagName in the Body element returned a list of all the outline elements, and I completely lost the structure. I’d have ended up iterating though the list, grabbing the parent element, seeing where it fit and rebuilding some kind of associated array of the data structure. So I did it in SAX instead.

Comment Link

gravatar image

Stuart Langridge:

2005-05-03 14:35 5 mins after Aquarion

Ah, right, gotcha. That’s what getElementsByTagName() is supposed to do, of course. The solution here, I fear, is XPath. Well, your solution was SAX, but SAX gives me hives; it seems like the Wrong Way to parse XML, the same as regular expressions do. This is pure prejudice on my part, I admit.

Comment Link


Nicholas 'Aquarion' Avenell is a web developer in London, you can find out more about him or how to get in touch.

There are more Articles, Projects, Journal Entries, Photographs and things that defy description here, too.

If you're looking for something specific, there are Calendar & Category -based lists of everything.

And if you want to follow stuff that appears here, try a Syndication Feed, or the generic Feed of everything.


Aquarion's last Twitter was: [updating]
Twitter last updated


[RSS Icon][ESF Icon][CDF Icon]
© 2000 to 2008 inclusive Nicholas Avenell
All comments are the property of their creators, published with permission
(Unless otherwise indicated, the opinions and sentiments expressed on this site are those of the author and not of any organisation of which he is an affiliate, including his employer. Caveat Lector, E&OE. sigh)
0.909 seconds, 159 queries, 2.77Mb on Thu, 02 Oct 2008 11:53:51 +0000
Generated by Epistula Version 2.0.3