I was a judge this year on Packt Publishing's Most Promising Open Source CMS award: the results have just been announced. The winner was SilverStripe.
I was personally impressed by the slickness of the interface, and by the fact that it has been designed to scale well to large websites. The developers have obviously thought carefully about the architecture, and are aiming for the "CMS plus web platform" approach of Drupal. I was also personally impressed by the responsiveness of the development team, their willingness to work in the community, and the clarity of their vision for the product. Worthy winners. Give it a look.
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.
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:
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.
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.
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 mysql> CREATE TABLE artist ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) ); 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) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.13 sec)
What we've done here is setup the first table in a CD catalogue database, namely:
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.
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">
<head>
<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);
dbcon.Open();
MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM artist", dbcon);
DataSet ds = new DataSet();
adapter.Fill(ds, "result");
dbcon.Close();
dbcon = null;
ArtistsControl.DataSource = ds.Tables["result"];
ArtistsControl.DataBind();
}
</script>
</head>
<body>
<h1>Artists</h1>
<asp:DataGrid runat="server" id="ArtistsControl" />
</body>
</html>
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:
<configuration>
<system.web>
<compilation>
<assemblies>
<add assembly="MySql.Data"/>
</assemblies>
</compilation>
</system.web>
</configuration>
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.
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:
http://ftp.novell.com/pub/mono/archive/1.9.1/linux-installer/2/mono-1.9.1_2-installer.bin
From a terminal, make it executable and run it:
chmod +x mono-1.9.1_2-installer.bin ./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#" %>
<html>
<head>
<script runat="server">
private void Submit(Object sender, EventArgs e) {
button1.Text = "You clicked me!";
}
</script>
</head>
<body>
<h1>ASP.Net on Mono</h1>
<form runat="server">
<asp:Button id="button1" Text="Click me!" runat="server" OnClick="Submit"/>
</form>
</body>
</html>
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.
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.
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:
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.