Tapestry redirections

It’ll soon be a year for me working in a project that uses Tapestry as one of its core technologies. I’ve learnt many interesting things and also faced some challenges to do certain specific stuff. Internet has always been a good help tool, and now it’s time to give back my little bit.

Tapestry features the class RedirectException to break the execution at any time and bring the user to the URL you want. But that exception expects an URL, and if you want to reach an existing Tapestry page, you need the corresponging URL for it.

Fortunately, this post in the Tapestry wiki at apache.org showed me how to get that URL for Tapestry3. But I also needed that exception to work for Tapestry4, so I had to investigate how to do the same think using the HiveMind registry. Finally, I got the class working and I’ve contributed it to the wiki where I found the Tapestry3 one.

I hope this to be useful!

Hi-tech copper coil motor

During last months I’m attending CAP (Curso de Aptitude Pedagóxica, Teaching Ability Course). The subject I chose was “technology”, and we are developing some projects in the classes.

One of that projects was about making a home made electric motor using simple materials: a magnet, coiling copper wire, metal wire, cables, insulating tape and cardboard.

Cut 9 meters of coiling copper wire, loop it around two fingers and wrap it with insulating tape to fix the coil. Make an axis with straight metal wire and pierce the coil with it. Then, using insulate tape, fix the two copper wires in parallel side by side as close to the metal wire as possible, but avoiding short circuiting. Mount the axis over a framework made with cardboard and place the magnet under the coil. Scrape off the insulating varnish from the copper wire and attach two cable brushes to them, trying not to make a short circuit. Connect both cables to a 9V battery, give the coil an initial spin and… what you see is what you get:

Second life goes open source, second life goes Linux

As said in their web, Linden Labs has dual licensed their Second Life client both proprietary and GPL. But that isn’t everything: a new Linux client has been developed, so we all can enjoy the experience, and there are even people talking about using Mono as a scripting engine.

I have tried Second Life, and the least I can tell you is that it’s simply amazing. You can create objects and animate them writing scripts, perform all kind of actions (riding bikes, driving cars, talking, listening music, watching videos (ok, only through QuickTime in Windows), buying and selling objects, meeting people… in summary living a life. You should give it a try.
As a sample, I show you this picture, where my avatar is editing her motorcycle and seeing the source code of the script that drives it (click to enlarge):

Second Life script editing

Curious facts about Hibernate

Hibernate is a very useful framework to do Object-Relational mapping in Java. It saves a lot of time, gives the programmer a lot of flexibility and allows you to do amazing things like mapping object inheritance.

Nevertheless, it has some “strange” behaviours that, in my opinion, seem a bit courterintuitive. I’m going to tell you about the way Hibernate translates object relations into joins.

Let’s imagine we have the class Person, with attributes id and name, and the class Car, with attributes id and brand. Class Person has a one-to-one relationship with Car named car, and there’ll be persons who have a car, and persons who haven’t.
If we want to query about the cars each people have, the “intuitive” query would be this:

select p.name, p.car from Person p

And the “intuitive” result would be: (John, Car instance #1); (Peter, null); (Mary, Car instance #2), isn’t it?

It isn’t. The real thing is that Hibernate translates the HQL sencence to a SQL one that selects from Person and does an (inner) join with Car, in order to instantiate a Car with all its attribute values set up. As a consequence of that inner join, all the people having a null car are missing from the result.

Intuitive solution: force the outer join by hand

select p.name, c.id, c.brand from Person p left join p.car c

Non intuitive (but valid) solution: use the required attributes directly

select p.name, p.car.id, p.car.brand from Person p

In this last query, I would expect a NullPointerException when the person has no car, since if there is no car, there is no attribute to evaluate, but the exception doesn’t get thrown, the problem doesn’t arise and you get the work done.

Quite strange, isn’t it?

My own flavour of network config automatic choosing

Until a couple of days ago, I used to use Gnome network-admin’s ability of having multiple network profiles to configure my wifi card at work and at home. But yesterday, the program went crazy and started to crash without any logical reason and I decided to shift to another solution: logical network interface mapping.

Interface mapping is a feature of ifupdown (/etc/network/interfaces). You can define some logical interfaces and call a script in order to choose which one will be mapped to a physical interface. The /etc/network/interfaces could be like this one (being HomeNET and WorkNET two existing ESSID network identifiers):

auto eth1
mapping eth1
script /root/WIFI/wldetect.sh
map HomeNET HomeNET
map WorkNET WorkNET

iface HomeNET inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
wireless-essid HomeNET
wireless-key s:mysecretpass1 open
dns-nameservers 127.0.0.1 192.168.1.1

iface WorkNET inet dhcp
wireless-essid WorkNET
wireless-key s:mysecretpass2 open
dns-nameservers 127.0.0.1 192.168.100.1

I’m using resolvconf to activate the dns-nameservers directive in the interfaces file, and dnsmasq to take care of some dns issues with a couple of VPNs I use. That explains the first 127.0.0.1 entry.

The script /root/WIFI/wldetect.sh lists the available networks and chooses one of them being in a whitelist (HomeNET|WorkNET):

#!/bin/sh

# Config
WL_IFACE=`iwconfig 2>/dev/null | { read A _; echo $A; };`

# Reset the interface
ifconfig $WL_IFACE down
ifconfig $WL_IFACE 0.0.0.0
ifconfig $WL_IFACE up

# Search networks
NETWORKS=`iwlist $WL_IFACE scanning | grep ESSID | sed -e ‘s/.*”(.*)”/1/’`

# Bring down the interface
ifconfig $WL_IFACE down

# Select preferred networks
for NET in $NETWORKS
do
case $NET in
HomeNEt|WorkNET)
echo $NET;
exit 0;
;;
esac
done
exit 1;

And that’s all! I hope that this configuration could be helpful for someone.

Logitech QuickCam Express (USB ID 046d:092f) on Ubuntu Edgy

I’ve just bought the webcam in the title of this post at Alcampo and had a hard time trying to set it working.

In the pkg-spca5xx-devel Debian mailing list, Dmitry Semyonov says that this camera model is supported by the spca5xx driver, but its ID isn’t added to the driver source code yet. He’s published a patch, and I tried to apply it, but the patch utility complained. That was because the tabs would have been replaced with spaces or something. Then I discovered the “-l” option, which solved my problem and I could finally apply the patch.

At help.ubuntu.com I found detailed instructions about how to build the spca5xx source code, so, finally I had the work done.

I’ve written a recipe to perform all the steps. At first, copy the patch into the file /tmp/qcexpress.patch. Next, execute these instructions:

apt-get install spca5xx-source
cd /usr/src
tar jxvf spca5xx-source.tar.bz2
cd modules
patch -lp1 < /tmp/qcexpress.patch
cd spca5xx
make
make install

That’s all!
And, at the end, a living proof: MSN video chat using Kopete 🙂
MSN video chat with Kopete

Microelectronics and the Personal Computer

Today I was looking in Google for some information about the Xerox PARC Alto computer system. Alto was the first experimental personal computer having a mouse, a window environment, ethernet booting capabilities, sound, light pen, microphone, music keyboard and SmallTalk programming language for the affordable cost of US $32000 (in 1979).

While searching for that information, I found an article written two months before I was birth by Alan Kay for Scientific American, named “Microelectronics and the Personal Computer“. In this article, Alan shows the system and unveils all its potential. Such a system was comparable, in that age, to the printing invention, radio or TV. Its main improvement was the ability to simulate an environment, to be used as a tool to rise human abstraction and trial/error capabilities.

Mr. Kay was also worried by the fact of all that potential could also be misused, in the same way that the fact for a city having a public library doesn’t automatically bring knowledge to its inhabitants, or broadcasting scientific TV programs doesn’t make the audience to become a scientific.

It’s a pity to see how some of the worst worries of Mr. Kay have become into reality. Nowadays children don’t use computers as a tool for world exploration and experimentation, but as a copy-paste machine, a hand bounded interactive movie.

It’s a pity to see how the hard work of teaching envisioners, like Seymour Papert, has been thrown away to the trash can. Learning tools, like the Logo programming language, have been dismissed, and new ones, like Squeak, are still unknown to the teachers nowadays.

We know what computers are today but, what could they have been?

Cryptographic Filesystem

Yesterday’ve been playing around with CFS in my Ubuntu. I’ve never tried a cryptographic filesystem before, altough I knew there were many flavours laying out there.

CFS has two main advantages, as far as I know:

  • It doesn’t require any special kernel patch (at least, not for Ubuntu), because it uses NFS to do loopback mounting of crypted directories.
  • It uses directly the underlying filesystem, avoiding the need of creating fs images to mount by loopback. Crypted directories and files are mapped to normal directories and files with its name and contents crypted.

The package provides some utilities:

  • cmkdir: Creates and initializes a crypted directory on the host filesystem.
  • cattach: Attaches a crypted directory, making it available (as cleartext) under /crypt/*.
  • cdetach: Dettaches a previously mounted crypted directory.

I’ve tried CFS successfully, and added it to my list of useful tools. It’s clean, easy and powerful. 🙂

Limited lifetime scripts

While helping Xavi with a small task (batch converting ODT documents to PDF via a web form), I’ve remembered a little recipe I’ve written some time ago.

It’s a way to force some script to die after a defined timeout. So, you can perform a command by ssh inside a script or perform any blocking task you want, and it will always return.

The only thing you have to do is to put these single 3 lines of code at the start of your bash script:

SECURITY_TIMEOUT=60
CMD_PID="$$";
{ sleep $SECURITY_TIMEOUT; kill -9 $CMD_PID; } 2>/dev/null &
Enjoy it!