Describing the Optimus Maximus 17 Years Early

Many people looked in awe when the first saw Art. Lebedev Studio’s Optimus Maximus keyboard – a keyboard with small OLED screens attached to each button. This allows the currently active program on your computer to switch your keys with whatever keyboard layout or shortcut layout you are currently using, and suit the visual appearance of the keyboard to what each button actually does. I’m not going to discuss the apparent problems with this and the Other Attempts at LCD Based Keyboards, but I’m going to quote a few sentences from “The Design (Psychology) of Everyday Things” which I happened to come across the other day:

Someday key labeling will be done by electronic displays on each key, so changing the labels will also become trivial. So computer technology may liberate users from forced standardization.

I guess Donald A. Norman were going “Yeah, I know.” when Art. Lebedev Studio released their first concept shots.

Gangstagrass

An usual post for me, but I’ve really enjoyed a mashup album by the very talented RENCH lately. The album is called “Gangstagras” and is an ingenious mix between bluegrass and hip-hop. The album is available for free over at gangstagrass.com, but I’d suggest downloading it through the Gangstagrass torrent instead, both to save bandwidth and help share an amazing compilation.

And if you enjoy the album, buy some of the other albums available.

JSTL, Taglibs and Capitalizing

After spending at least an hour of searching for an easy way of just capitalizing a string in a JSP, finding nothing and then starting on my own taglib do to the work, I finally found what I was looking for. The Jakarta String Taglib’s capitalize function! Amazingly enough, the documentation were not a good hit on Google, and it took quite some time to actually get the Google Fu correct. I stumbled across the documentation after searching for jakarta taglib (as JSTL is the Jakarta Standard TagLib) and rediscovered the other taglibs available from Apache Jakarta. Solved my problem in a second or two, and I hopefully never have to further endulge in writing my own taglib without keeping it as a separate JAR-file again.

PHP Norge Meeting Tomorrow (15. May 2008)

There’s a member meet in PHP Norge (the norwegian PHP user group) coming up tomorrow, but seems like I’m not going to make it this time either. Suddenly got a meeting in Fredrikstad that might run late, and Christer is leaving for New York on friday, so he’s not attending either. Too bad, but hopefully all the other guys will have a great time. We’re still on for PHP Vikinger, so I guess we’ll meet there.

All other PHP users in the area are of course encouraged to visit!

Google Launches Friend Connect

Google announced their release of Friend Connect today, a platform built to share social data across social networking site, and for allowing 3rd party applications for building applications on top of the social networks already available at other sites. Together with OpenSocial this will hopefully make it possible to maintain your friends graph across sites and available applications, so that you don’t have to reconnect with your friends on ALL the social sites that you use out there. I also hope that it moves some of the lock-in and power of the largest players in the market, and will allow us smaller developers to allow our customers to use their existing data with us. I’ve signed up for the beta program, but I’m guessing that there’s quite a few companies that’s going to get in before my ticket shows up.

Anyways, the plan is to integrate the service over at the best site for electronic tournaments (pwned.no) and at a few other projects that I have brewing in the “this will be cool” section. More about those projects later.

The Details of Liberty City

As a small break from all the programming related posts, I present you with an amazing photo set at flickr showing real life New York-locations compared to those available in Grand Theft Auto 4. The level of details that the people doing the 3D models for GTA4 has managed to get into the game is simply remarkable. [via Boing Boing]

The Graph of Company Classification


I’ve been meaning to do this for quite some time, but I never found the time before yesterday’s evening. Equipped with the data we’ve made searchable at Derdubor, I digged into the classification of the companies that our dataprovider provides us with. Their classification uses the standard NACE codes for communicating what type of business we’re dealing with, and this set of different classifications is standardized across european nations (there is a new standard that was released in 2007, to further synchronize the classification across the nations).

My goal was to explore the graph that describes the relationship between the different groups of classification. A company may be classified in more than one group, and by using this as a edge in the graph between the classifications, I set out and wrote a small Python program for parsing the input file and building the graph in memory. For rendering the graph I planned on using the excellent GraphViz application, originally created at AT&T just for the purpose of creating beautifully rendered graphs of network descriptions.

My Python-program therefor outputs a file in the dot language, which I then run through neato [PDF] to render the beautiful graph as a PDF.

An example from my generated dot-file:

graph bransjer {
	graph [overlap=scale];
	node [color=lightblue2, width=0.1, fontsize=12, height=0.1, style=filled];
	"Forsikr.,pensjonsfond-unntatt off. trygd" -- "Forsikringsagenter og assurandører" [penwidth=1.15441176471];
	"Forsikr.,pensjonsfond-unntatt off. trygd" -- "Hjelpevirksomhet for forsikring og pensj" [penwidth=1.23382352941];
	"Forsikr.,pensjonsfond-unntatt off. trygd" -- "Skadeforsikring" [penwidth=1.35294117647];

The penwidth=-attributes sets the width of the line between the nodes, and the “string” — “string”-entries describes an edge between the nodes.

I first ran into problems with managing this enormous graph (we’re talking 500k relations here), as trying to render the complete graph would throw both dot and neato off (as soon as we pass 2000 relations, things begin to go awry). Actually, this turned out to be a good thing, as it made me (and with Jørn chipping in a bit) think a bit more about what I actually wanted to graph. I’m not really interested in places where there only are one or two links between different classification groups, as these may be wrongly entered, very peculiar businesses etc. (with a total of 500k registrations, such things are quite common). Instead, I focused on the top ~1000 edges. By limiting my data set to the top 1000 most common relationship between groups, I’m able to render the graph in just below ten seconds, including time to parse and build the graph in Python before filtering it down.

The resulting graph of NACE connections is quite interesting, and shows that most classifications are connected in some way. If I further extend the number of edges, the sub graphs that are left unconnected to the “main graph” would probably establish connections. An interesting observation is that most health service-related businesses (such as doctors, hospitals, etc) live in their own sub graph disconnected from the main graph (this is the graph in the upper right). Another interesting part is the single link from the “main graph” and up into the IT consultancy business group (webdesign, application development, etc) which is placed in the top of the graph.

The Design of Everyday Things

One of the books in my last order-a-lot-of-interesting-books-from-Amazon-craze, was The Design of Everyday Things. I’ve just started reading it, after reading through Robert Hoekman Jr.‘s Designing the Moment on my regular train trip between Fredrikstad and Oslo (good book by the way). The Design of Everyday Things is one of those books that gets mentioned all the time and that I’ve never really gotten around to reading, and I’ll have to say that it’s been an enlighting experience. Since I’ve been reading quite a few user interaction books lately, much of this is stuff I’ve already been introduced to other places, but it’s very nice to be able to put it into a broader context.

I’d recommend the book for anyone who’s going to design a user interface at any time, so get to it and order it today if you haven’t already done it.

Yahoo!, SearchMonkey and Microformats

Both Rasmus and Sara has posts up about a new feature of Yahoo! Search which actually seems to be a step forward in terms of search engine functionality. This will make it possible for 3rd party developers to actually run code on Yahoo!’s servers to enhance their search result for your own page.

The first examples shows how they’ve used Microformats to give a better presentation of businesses available. I’ve previously implemented the hCard microformat at Derdubor, where we have a local directory search for businesses in Norway. All our search hits and profile pages are tagged up in microformats, so that a compliant parser are able to fetch business information and provide it to our users in a proper way. It’s simply great to see Yahoo! add this kind of support for new formats, and I’m already looking forward to playing with it to give better results for pwned.no and a few other projects I’m playing around with.

Christer Goes Bug Hunting

Christer had the pleasure of hunting down a bug in Zend Framework a couple of days ago, and he has just posted a nice article about the bug in Zend MVC Components and how he debugged it. If you’ve never used a debugger before, this article is probably also going to be a bit helpful, and it gives a little insight into how the Zend Framework MVC-components work.