It's static now. The whole thing. All the images are there too, all the text is there and I changed the stylesheet so it takes up more of the screen space. The overview doesn't have links to all of the table of contents stuff but I'm tired right now.

In any case, it's good enough to start reading from. I did this mostly because I wanted a local copy but hey, it loads faster than the other dynamic version so why not let the rest of the Internet share in the speed?

Download a copy of the book.

Seaside/Squeak

| | Comments () | TrackBacks (0)

It's 4am and I'm about to sleep, but I've started converting the Seaside Tutorial book to a proper static HTML package that doesn't require a web server to view. The amount of JavaScript that loads and the way the pages are loaded on the web server was very slow. It took 9 seconds for a single page to load. By making it completely static, it took only a half-second to load.

Learn how to use Seaside and Smalltalk

I'll finish the rest of the pages later today, and then create a nice ZIP file out of it.

For the past few days I have been fixing up a website that my cousin found. He was working on some biology/technology homework and was tired of writing out DNA sequences, manually converting them to RNA and then searching through a table to find the amino acids that each trio of letter corresponds to.

Using jQuery and JavaScript magic, I came up with this. It converts DNA to RNA and then finds the amino acids in the sequence. The conversion between RNA and DNA takes place while you type, but you have to click to get the amino acids.

The whole thing is a single HTML file with 3 JavaScript files and a stylesheet. The JavaScript is divided into three categories; data, logic, and views. The data.js file contains information on amino acids. The logic.js file has code that deals with the conversions, and the views.js file has code for displaying the results. The amazing thing is that all of this works in Internet Explorer 6, Firefox 3, Safari, etc. Note: there are other JavaScript files included but they are for the fancy effects in the views.js file, they aren't part of the core logic of tool. The advantage is that the whole package is self-contained and you can copy the folder over to a USB thumbdrive and use the tool on any computer that has a web browser installed. You don't even need a web serrver.

The code is available at GitHub and is licensed under the MIT License.

A long time ago, I wrote a blog post and some code that validates file uploads in Django. In the last week, it seems a lot of people have been interested in the post and since Django finally has a stable 1.0 release, I thought I would update the previous blog post.

The other day I was going through some notes that I organize using Org-mode and I realized that it's a pain in the ass to write up links to Wikipedia entries all the time. So I whipped up some code that adds an org-mode link.

It's 1am and I have myself organized in terms of the meetups. I have a list of meetups and people who have shown up and can be considered regulars, I also have a template setup for discussing previous meetups. Also, this is the big thing, I have this in a GIT repo! So I can make whatever changes I want to the page offline and then simply copy/paste into the Association of Lisp Users wiki page for the Toronto Lisp Meetup.

On Friday I was bitching about the lack of websites that can import FOAF profiles. A lot of the popular ones like Twitter and LiveJournal can export them, but they don't seem to be able to import them and make use of the actual FOAF data. A portable file format only works when you can both import and export the data.

There are a lot of websites that export FOAF, Friend Of A Friend, data including: LiveJournal, Twitter, Pownce and hi5. There is a Facebook application that exports your Facebook profile to FOAF too!

FOAF doesn't appear to be dead in terms of exporting, but what about importing? That's the whole point of FOAF...to make your data portable so you can move it around easily. But I've searched and searched and I can't find anything on how to import my FOAF data into Twitter, or LiveJournal, or elsewhere. What's the point of freedom when I can't use it?

A simple example of how importing FOAF is useful: FriendFeed. It aggregates stuff from various social networks. I already have a list of online accounts in my FOAF file. FriendFeed, let me import that file and you can take care of the rest! I hate re-typing in all my account names so you can import them. It's annoying and boring.

The project is still alive. The last time I checked it looked a little dead, but now that I've checked out the mailing list archives, it looks like it's still alive. Awesome awesome :D

cl-terrace

Thanks to the list, I've discovered another web application framework for Common Lisp called cl-terrace. It's a Model-View-Controller framework (aren't they all?) with only the View-Controller part covered. I'm not sure exactly how that works, but it uses the Hunchentoot web server, and djula, a Common Lisp template engine based on the Django templating language which is nice.

The documentation for djula should be generated by the developer since the API is apparently changing around quite a bit. Djula looks like it handles internationalization and translations in a sane way. You specify translations using a dictionary (a.k.a. hash-table), the example shows how to do this.

cl-terrace is ASDF-installable in case you're itching to try it out. Using SBCL, run this:

(require 'asdf)
(require 'asdf-install)
(asdf-install:install 'cl-terrace)
to install it.

Ruby

On another note, a Ruby note, Chris Wanstrath of GitHub fame presented a keynote at the 2008 Ruby Hoedown about side projects where he said,

First off, the time issue. I don't know how many of you read RSS, but I challenge you (that's a keynote term) to give it up for a month. Just turn it off...What should you do instead? ...let other people do the filtering for you. Use your time for other things.

It's a good keynote and lots of communities could learn a thing or two from the Ruby community. The optimism of the community has to be balanced out as Unspace's Pete Forde says,

Folks in Ruby tend to write a lot of nostalgic, self-aggrandizing bullshit, though. You see a lot of "MY MY, THE COMMUNITY HAS EVOLVED INTO SOMETHING SPECIAL" and talk of changing the history of software development. I'm all for progress, and as a musician, I understand the function of hype in generating momentum. But sometimes we need to get real and be a little more harsh in our own self-analysis.

Anyway, off to write some code.

Mid-August Lisp News

Meetups

Toronto

7 August 2008, A very small gathering of Lisp users at the LinuxCaffe. Abram showed the inner workings of the game Abuse which uses Lisp for almost everything, except the core (which is written in C, this is similar to how Emacs works). An interesting question asked was whether or not the Abuse Lisp dialect supported macros, it seemed that the custom "macros" were all coded in C and thus untouchable. Next, a crazy mod that turns the game into a game of Super Mario was shown.

The disadvantages and misuse of car, cdr, caaaaar, cadaddarr, etc. were also mentioned. The consensus is that once you're using cadr, caddr, what you really want to be doing is creating a structure or object. That way you can access things by a descriptive name. An example of why this is a good idea is given by xmls, an XML parser. It parses XML and turns it into a giant list, with the first element being the element tag name, the second element being a list of element attributes, and the rest of this list being child elements. This can be tedious to navigate through.

Libraries for Scheme were also mentioned. The drawbacks of the various dialects of Scheme are that the specification does not define even the basics of common ways of dealing with libraries. Because of this, when you switch Schemes, you have to re-discover libraries that do what you want. This is an old complaint of course.

Lisp images and program startup costs were discussed in relation to Perl, PHP and Smalltalk. Some Lisps have the ability to dump a memory image and reload that later on. This improves the startup time since libraries are already loaded and not re-loaded or re-compiled. I noted that there doesn't seem to be a culture of image-sharing in the Lisp community as there is in the Smalltalk community. One reason suggested for this is that some Lisps run on 64-bit architectures and others run on 32-bit, which means code needs to re-compiled anyway. Perl and PHP were said to have no way of image dumping and this is particularly problematic for PHP since it seems to rebuild things for each website request. (This may be incorrect or a non-problem)

Finally, I mentioned traits in Smalltalk. Traits are collections of methods that can be used by classes and overridden (or not). Eiffel seems to have something similar, as does Ruby with mixins. Here is the paper that explains the idea more fully[PDF].

comp.lang.lisp

Kenny Tilton, the man behind Cells and Theory Y Algebra, asked why the special variable *default-pathname-defaults* is named that way. Pascal Costanza comes up with an answer and asks his own question in return,

Do you guys also worry about important problems?

Blogs

Xach's Cool Charts

Xach made some cool charts inspired by Tufte and stream graphs. The first chart shows movie box office data, while the second shows the version control activity of CMUCL and SBCL.

The charts were made using Vecto, a simple vector drawing library for Common Lisp.

cl-cairo2 updates

This is a nice update for cl-cairo2 users. Now cl-cairo2 loads only OS-independent parts of the library, with the OS-dependent parts becoming parts of extension packages.

Lisp Quiz

Lisp Quiz is inspired by Ruby Quiz which was inspired by Perl Quiz of the week. Ruby Quiz and Perl Quiz were weekly programming challenges, and Lisp Quiz hopes to do the same for the Lisp community. The first quiz tackles Minesweeper, having you design an algorithm that wins the game.

Everything Else

LispForum

LispForum, launched on 27 June 2008, is another place for Lisp-related discussion. It is run by Dave Roberts, the blogger who is behind the Finding Lisp blog. They have added a new sub-forum for Lisp Quiz puzzles which are supposed to be similar to the Ruby Quiz puzzles.

What's interesting about LispForum is that it's new (almost 2 months old, only!) and it already has 296 members. There are already 443 posts about Common Lisp, though there don't appear to be many Scheme fans. So we have yet another forum to recommend to newbie Lisp programmers.