elliot's blog

Flight of the Conchords

I came late to the Conchords, and didn't realise what I'd been missing. (My sister's been a fan for a while, of course.)

I defy anyone not to find If You're Into It funny (not work safe):

And Business Time:

Currently their first series is being repeated on BBC Four on Tuesdays.

Films I've watched: 3 word reviews

  • Cloverfield: bleak, gripping, relentless
  • Cube: metaphorical, atmospheric, tense
  • Nightwatch: perplexing, disjointed, disappointing
  • 10000 BC: rubbish, rubbish, avoid

Microsoft .NET for Programmers

I've finally found a decent .NET book which suits the way I want to learn it: Microsoft .NET for Programmers by Fergal Grimes. Unlike most other .NET books I've looked at, it has the following plus points:

  • The coding is explained using code, rather than screenshots from Visual Studio.
  • The examples build around a simple core application (a poker game), demonstrating different aspects of .NET such as database access, validation, web services, email, XML, web forms, web sessions, Windows forms, and building up through short tutorials.
  • The code examples are succinct and pragmatic, but contain enough detail to be useful. (One book I've looked at about coding ASP.NET shows how to build a web application using two stage views with XSLT transforms, which has seemed a bad idea to me for several years - impractical, hard work, and not how I want to learn how to program .NET.)
  • It does explain .NET in a way that makes sense to programmers, rather than trying to teach programming at the same time as teaching .NET: coverage of constructors, destructors, data structures, packaging, configuration, reflection (though the large section about writing a compiler seemed slightly dense and unnecessary). There's also some good coverage of how to debug and trace applications, obviously written by someone who's done a lot of it.
  • It's got a big appendix explaining C# language constructs which is a useful reference.

So even though it's not an ASP.NET book, there's enough about ASP.NET to get you started with decent coverage of the main elements you need to know about, and enough pointers to go further. Good for me, anyway.

Using MySQL with ASP.Net, under Mono on Linux

Right, I decided there's not much point writing more about ASP.Net pages until I can show you how to do something useful with them. So I'm going to dive straight in and install the MySQL connector for ASP.Net, so we can do a bit of database-driven page stuff.

Setting up a MySQL database

First, you'll need MySQL. I'm not going to tell you how to install that (depends on your Linux), but hopefully it could be as easy as it was for me on Ubuntu:

sudo apt-get install mysql-server mysql-client

How you create your database and users is up to you. I like MySQL Query Browser and phpMyAdmin. The latter needs PHP and a web server; but MySQL Query Browser is a standalone desktop application. If you want to do this in a tutorial style via the command line, you can run these once you've installed the MySQL server and client packages:

$ mysql -uroot -p

mysql> CREATE DATABASE cdcat;
Query OK, 1 row affected (0.10 sec)

mysql> USE cdcat;
Database changed

Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO artist VALUES(null, 'Wire');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO artist VALUES(null, 'The Fall');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM artist;
| id | name     |
|  1 | Wire     |
|  2 | The Fall |
2 rows in set (0.00 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON cdcat.* TO cdcat@localhost IDENTIFIED BY 'hardpassword';
Query OK, 0 rows affected (0.12 sec)

Query OK, 0 rows affected (0.13 sec)

What we've done here is setup the first table in a CD catalogue database, namely:

  • Created a new database called cdcat
  • Created a table called artist in that database
  • Put two artists into the table
  • Created a user called cdcat with SELECT, UPDATE, DELETE and INSERT privileges on all tables in the cdcat database
  • Made those privileges active

Installing Connector/Net

Now you've got a MySQL database server, database, table and user set up, you'll need the MySQL connector for ASP.Net. You need to download Connector/Net from the MySQL website. The one you need is Windows Binaries, no installer (ZIP).

Once the zip file is downloaded, create a directory somewhere and unzip its contents into it. The file you're after is in the resulting bin directory, MySQL.Data.dll. To install it, use the gacutil tool included in the Mono installer, which puts it into the right place in your Mono library directory:

gacutil -i /path/to/unzipped/connector/bin/MySQL.Data.dll

If gacutil isn't on your path you'll need to reference it correctly using its full path.

Creating a simple page to show data from a table

To prove you've got everything installed correctly, we'll create a page to display the contents of the artist table using one of the standard ASP.Net controls. Like I've said before, this isn't going to be a full ASP.Net tutorial, so I'm not going to try to explain Web Forms and all that jazz: I'm just giving a few examples to help you get the pieces working nicely together. See one of the countless ASP.Net books for more detail. (By the way, if anyone can recommend a half-decent tutorial book for ASP.Net, please let me know, as the ones I've looked at are generally good reference works, but lousy tutorials.) I'll try to put more tutorial material in as I learn more about ASP.Net.

First, create a file called artists.aspx inside your project folder.

Next, put this code into the file and save it:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="MySql.Data.MySqlClient" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <title>CD cat</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <script runat="server">
    private void Page_Load(Object sender, EventArgs e)
       string connectionString = "Server=localhost;Database=cdcat;User ID=cdcat;Password=hardpassword;Pooling=false;";
       MySqlConnection dbcon = new MySqlConnection(connectionString);

       MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM artist", dbcon);
       DataSet ds = new DataSet();
       adapter.Fill(ds, "result");

       dbcon = null;

       ArtistsControl.DataSource = ds.Tables["result"];


    <asp:DataGrid runat="server" id="ArtistsControl" />


Finally, you need a web.config file, again in the project root directory. This contains application settings, such as which libraries your application needs. It should contain the following to enable the MySQL libraries to be loaded:

        <add assembly="MySql.Data"/>

Now run your application again with xsp2 from inside the project directory and browse to http://localhost:8080/artists.aspx. You should see this:

I didn't get to code-behind pages this time. Maybe next time.

Getting ASP.Net (C#) running on Linux, using Mono and xsp2

I'm going to keep this brief, but hopefully explain how to get ASP.Net to work on a Linux machine. Your best choice here is to use Mono, which implements most of the important bits of ASP.Net (in fact, probably all of them, but don't quote me). So for starters, here's how to get a simple ASP.Net page up and running under Linux. (Note that I didn't enjoy the MonoDevelop experience much, and didn't find a decent C# plugin for Eclipse, so I'll be writing code direct for now.)

First off, you're going to need Mono itself. The download site is at http://www.go-mono.com/mono-downloads/download.html. However, there aren't any official package for Ubuntu there, so I tried http://www.mono-project.com/Other_Downloads instead. If you can find a package for your distribution, that may well work.

I struggled to compile the source for Ubuntu and couldn't get the debs to work (I've got an old version of Ubuntu), before I noticed there's a cross-platform Linux installer which worked fine for me. However, Michael Hutchinson mentioned in a comment below that this isn't such a good idea; his blog entry links to another set of installation instructions I didn't manage to find on the Mono site, which look promising. I'll try those next time.

Here's the link in case you want to try it:


From a terminal, make it executable and run it:

chmod +x mono-1.9.1_2-installer.bin

This starts up the graphical installer. Follow the prompts to get it on your system. I recommend putting it into a directory out of the way of the standard Linux directory structure: I installed it into a directory within my home directory.

Next, create a directory for your project and put a basic ASP.Net page into that directory, so you can test that the Mono compiler's working properly. Create a file called index.aspx with this content:

<%@ Page Language="C#" %>
<script runat="server">
private void Submit(Object sender, EventArgs e) {
  button1.Text = "You clicked me!";

<h1>ASP.Net on Mono</h1>
<form runat="server">
<asp:Button id="button1" Text="Click me!" runat="server" OnClick="Submit"/>


I took this from the W3Schools tutorial on ASP.Net and modified it for C#.

To run your page, get a command line up and connect to your project's directory. Then run the embedded server xsp2 (bundled in the Mono installer), to start your application in its own web server:

xsp2 --port 9192

To see your site running, visit http://localhost:9192/ in a web browser. You should see a clickable button whose text changes when you click it.

That's enough for one night. Next time, where to put your code-behind pages, and perhaps how to get MySQL working with Mono.

Yeah, I've been learning ASP.Net (C#)

You wanna fight about it?

I might even write a blog entry about it. Try to stop me.


"Beware of that which is breathtakingly beautiful, for at any moment the telephone may ring or the airplane come down in a vacant lot." (John Cage)

Nicola and I had this at our wedding:

Now I'm getting all nostalgic. We had this during the wedding ceremony too:

We are quite soppy, as you might have guessed.

The Pick Up Artist

Just chanced upon this hilarious programme on TMF, The Pick Up Artist. The basic premise is that 8 geeks compete to become "master" pick-up artists (the word "master" gets bandied about a lot), guided by world-famous pick up artist, Mystery. Yes, that's his name; and he wears a big Jamiroquoi style pimp hat, has a tiny beard, and soft-metal hair. Mystery teaches his techniques (he's written books on them), then judges the performance of his students in real-life pick up scenarios. He sits and watches through hidden cameras as the geeks chat up girls, judging their work with his ex-students and now "wing men", J-Dog and Matador. My favourite parts were where they were watching one of them talking to a girl, and they said something like "He's losing it - he's getting close to the 'Let's just be friends' zone", like there was some science behind it all.

The students then go into elimination, at which point they blub like girls. Mystery hands out medallions to the contestants who'll progress to the next round, accompanied by phrases like "This isn't just about picking up girls; it's about building a life. You deserve it" (as he hands the medallion over).

Watch the trailer to get a taste of the hilarity:

Story understanding: an approach whose time has come?

During my Ph.D. research, the AI community was pretty much obsessed with neural networks, genetic algorithms, and other biologically-inspired, emergent approaches to intelligence. I, on the other hand, was pretty much at the opposite end of the spectrum: I was (and am) interested in that awkward place where psychology and AI meet, cognitive science; and in approaches to AI which concentrate at the symbolic level. I've written previously about how I view the differences between the low-level approaches and the high-level symbolic approaches: for me, a symbolic approach helped me explain what was going on during understanding, as I could more easily form a "narrative" of how the understanding was reached. The same could be done using those low-level approaches, but without the abstraction, I think it would be pretty complex.

Anyway, I was therefore pleased to see an inkling that maybe story understanding as a discipline is finding applications in interface design. Specifically, that there is a conference workshop dedicated to it happening next year: Common Sense and Intelligent User Interfaces 2009: Story Understanding and Generation for Context-Aware Interface Design.

Perhaps I should submit a paper? After all, the work I was doing on coherence of inference during language understanding has an application here. For example, a user keeps searching Google for "holiday Devon", and clicking through to websites about cottages for rent, B & Bs, hotels, tourist destinations in the area. You might want to design a butler application which sits in their browser, watches the interface and their searches, and tries to help them find what they're after.

One way to help would be to infer what they might be trying to do, based on what they've done already: for example, a valid inference might be that they're trying to book a holiday in Devon; from that, you could infer that they might want to hire a car, might be looking for a flight (depending on where they live), they might want to know about good restaurants in the area, buy travel accessories, etc.. At the same time, there are potentially a lot of valid but less useful inferences: they want a holiday (not just in Devon), they are a travel agent who lives in Devon, they know someone on holiday in Devon, etc.. Inferences which are probably logically valid (depending on the knowledge base), but to a human, potentially wasteful or even unwarranted. How does a system know when to stop making inferences and how to prioritise them? That was basically what I was trying to address in my thesis. I'm just happy to see these kinds of issues surfacing as more AI creeps into applications.

Stop being your own worst enemy: prevent yourself accessing work email from home

I am pretty bad at dipping into my work email when I should be relaxing at home. (I do work from home, but if I don't have my work computer at home, I shouldn't be looking at work email.) So I decided to take some steps to stop my bad habits.

The first is easy and works cross-platform: I installed LeechBlock, a Firefox extension which you can configure to block you from certain sites on particular days/times, or if you access them for longer than a certain period. Now if I try to visit work webmail, LeechBlock blocks my access and prevents me from reaching the site. You can even tell it not to let you access its options during the block times, but as I was setting the block for the whole week, I thought I might regret it.

Second was a bit more technical and wouldn't necessarily work on Windows. But I added a firewall rule to my iptables configuration to prevent me accessing my work webmail domain altogether:

iptables -A OUTPUT -p tcp -s 0/0 --dport 443 -d -j DROP

(obviously, replace with the IP address of the domain you don't want to access).

Thirdly, I fixed my hosts file to point the offending domain at localhost, so if I try to go to it, I would just get my local web server instead. On Linux, just edit /etc/hosts and add a line like: offending.domain.com

Now, I can undo all this, but it's a pain in the arse to do so, and will hopefully remind me I shouldn't be accessing work email when I'm not working :) Any other suggestions? (I tried putting a content block in my firewall, but it only seemed to work with HTTP domains.)

Syndicate content