Tuesday, December 30, 2008

My first entry to Engrish - Pictures That Is Your Funny Engrish

"Mafia not allowed in Kitchen"

I sent this picture to engrishfunny@gmail.com on the 16th, and they must have so many contributions that it has taken them 10 days to post it on their blog of terribly translated english signs.

It is now available for all to see and comment on here:


BTW, the picture was taken in a corner hawker shoplot along Jalan Imbi - they serve great konlow and Ipoh sarhorfun.


Wednesday, November 26, 2008

Proprietary File Lock-OUT!

Got a query from a colleague to help open a PowerPoint file, from his client. It may be password protected (who password protects presentations?!!!) so it may cause problems ...

Sure enough, OpenOffice.org complains:


So I was forced to install Microsoft Office, which I have been avoiding like the plague. To keep it as far away as possible, I put it in a Virtual Machine. Waited the 15 minutes to install, and loaded the file up. This is the wonderfully helpful error I got:

"PowerPoint can't open the type of file represented by M:\xxxx.ppt"

WHAT?! So much for the "de-facto" file format which everyone uses! Im so happy I haven't been using .doc/.xls/.ppt for over 5 years now. None of this rubbish. Real open formats for me, thanks.

And look at that smugfaced Clippy! No wonder people hate him!


*Uninstall Microsoft Office - that pile of crap*


Sunday, November 09, 2008

Fantastic first day at foss.my!

Today was foss.my! With only 40 odd days to prepare for this, the committee certainly pulled it off! It was really enjoyable...

Here were my tweets, starting from 7 Nov, Friday 4pm:
Oh. Just found out that Im giving the keynote at foss.my ... hopefully not much to update on the slide! (yes just one). 4:09 PM yesterday (7 Nov) from TwitterFox

@aizatto just one slide, remember? 5:09 PM yesterday from TwitterFox in reply to aizatto

@angch OK! Good luck in setting things up. Make sure xrandr works with the projectors. 5:18 PM yesterday from TwitterFox in reply to angch

Checking the slide for fossmy. about 24 hours ago from TwitterFox

Awake! Bleary eyed, but off to fossmy now. about 17 hours ago (8am Saturday 8 Nov) from TwitterBerry

Alright! At #fossmy now! My keynote shd be on soon, after the registration queue gets shorter. about 16 hours ago from TwitterBerry

30 speakers at #fossmy, and OLPCs to be given out! about 16 hours ago from TwitterBerry

Heh @rajdylan's guitar skills abit rusty, but it was fun! about 15 hours ago from TwitterBerry

@brianritchie ah, its always cheesy, but brings a smile all the time. about 15 hours ago from TwitterBerry in reply to brianritchie

Whoah, Twitter is busy at #fossmy about 15 hours ago from TwitterBerry

@brianritchie ill be here both days! about 14 hours ago from TwitterBerry in reply to brianritchie

Hmm @seraphine, maybe we need a BOF for twitter at #fossmy to add them twits. about 14 hours ago from TwitterBerry

@aizatto just 30 hours to go! Eat sugar. about 14 hours ago from TwitterBerry in reply to aizatto

Bought a Inkscape sticker at the foyer of #fossmy. Cute! Get your own, you call the price. about 14 hours ago from TwitterBerry

#fossmy "customers should have a choice" - Microsoft about 13 hours ago from TwitterBerry

"Windows is a framework to support DRM. Novell is working on it for Linux" - Microsoft about 13 hours ago from TwitterBerry

Accessibility talk by @kaeru at #fossmy. about 13 hours ago from TwitterBerry

Fadlin will be demoing how a blind user uses the gnome desktop with assistive tech at #fossmy about 12 hours ago from TwitterBerry

Not everyday you can drop off Dylan to a guitar lesson about 12 hours ago from TwitterBerry

Malaysian Association to the Blind will be rolling out Linux desktops to their members in 2009. #fossmy ftw! about 12 hours ago from TwitterBerry

Anybody with old DDR1 ram is required to upgrade Mal Assoc for Blind computers. If u have any old PCs, please contact @kaeru about 12 hours ago from TwitterBerry

Earth247.tv by @cerventus. - "Drupal has a high learning curve, but everything else is sucky after it" about 11 hours ago from TwitterBerry

Darn u @cerventus and your audience participation! I'm running around passing the mikes to people at #fossmy about 10 hours ago from TwitterBerry

@brianritchie I was the sneakernet! about 10 hours ago from TwitterBerry in reply to brianritchie

30k mysql queries per second with memcached instead of 6k on a good day without. Mixi tech talk by Toru @tmaesaka at #fossmy about 10 hours ago from TwitterBerry

Mixi is beta, but corporate thinks its "better"! about 10 hours ago from TwitterBerry

Ruby talk by @aizatto. He doesn't need the mike. about 9 hours ago from TwitterBerry

Aizat gives love to OSX filesystem events. I thunk it was #fossmy? about 9 hours ago from TwitterBerry

@seraphine @cheeaun - with 20% less pay? about 9 hours ago from TwitterBerry in reply to seraphine

@kagesenshi good work dude! Thanks for carrying the boxes up for me. about 8 hours ago from TwitterBerry in reply to kagesenshi

Blender Inkscape and GIMP - BIG stack for digital content creation! Lightning talks at #fossmy ftw! about 8 hours ago from TwitterBerry

@fossmy - GOD wins with lightning talks. Zeus maybe! about 8 hours ago from TwitterBerry in reply to fossmy

"Regularity is important to keep the community growing." - @piawaugh at #fossmy about 8 hours ago from TwitterBerry

@cheeaun where are you, we haven't met. about 8 hours ago from TwitterBerry in reply to cheeaun

"Linux Australia is a terrible name because its more than linux" - @piawaugh ... "Change your NAME!!!" - @rms about 7 hours (6pm) ago from TwitterBerry

"Hacking with your friends on FOSS is a legitimate career move!" - @piawaugh at #fossmy about 7 hours ago from TwitterBerry

"New South Wales is rolling out 250k OpenOffice.org to their teachers." - @piawaugh at #fossmy about 7 hours ago from TwitterBerry

"Mad Dog Hall totally inspired me at the first LCA, for me to contriute" - @piawaugh ... Hopefully someone here at #fossmy will be inspired about 7 hours ago from TwitterBerry

"A dozen good journalists in Australia who are clueful about FOSS. There is interest now in the Biz and Govt community" - @piawaugh #fossmy about 7 hours ago from TwitterBerry

Cambridge 5 Card Mao ftw!!! Thanks @piawaugh! about 3 hours ago from TwitterBerry
For more tweets on foss.my, click here.

It was a really eventful day, jam packed with good quality talks. Now to sleep for more goodness tomorrow.


This picture was on our pre foss.my meeting at Pelita with Pia Waugh (thanks, aizat!):

[Thanks sumardi for the most excellent pictures of foss.my, day 1]

[btw, to reverse the order of twits, copy and paste it into a text file and use awk:
awk ' { line[NR] = $0 }
END { for (i=NR;i>0;i--)
print line[i] }' twitter.txt > rettiwt.txt

Wednesday, October 22, 2008

Misnamed Package

Intech yesterday had these TMNet advertisements:
'Wang' means money in malay, however combining it with 'Package' certainly gives it a whole different spin. This poor combination is definitely a branding fail for TMNet.

For those unclear of what 'Wang' could be a slang of, JonJonB clearly illustrates what it means.
Purely in the interests of science, I have replaced the word "wand" with "wang" in the first Harry Potter Book ... (read it)
This will certainly evoke horrible imagery when you next go to Sungai Wang.


Tuesday, October 14, 2008

Mentally Challenged Parkers

While in McDonalds Shah Alam, this young scrawny punk drove his red sports car and parked in the middle of the two handicapped parking bays. So not only did he park in a space allocated for the Physically Challenged, he also took up two spaces for his precious car. I managed to snap a picture of him as he walked by:

Me: Please don't park in the handicapped bay
Doofus: Huh?
Me: Are you physically challenged?
Doofus: No?
Me: Then why did you park there?
Doofus: Cannot ah?
Me: No!
Doofus: Who are you?
Me: Just a concerned citizen.
Doofus: So? ... Do what you have to do lah
Fine! So I took this picture:
Some may say that technically he is "correct", because the sign says handicapped to the left and right. It doesn't say anything about parking in the middle! Hah. But driver of BJD 8282, you are a true pillock.

A wonderfully bubbly McDonalds waitress walked by offering free refills (FTW), and I described to her the driver who parked there. 2 minutes later, he was seen driving off and going around in circles looking for a proper place to park.

However 15 minutes later, two other drivers decided that they too are handicapped, and parked in the spot.

Drivers of BHW 262 and WMB 4425, you too must be mentally challenged to be so totally inconsiderate. Shame on you. Parking Cretins.


[Update: 28 Oct 08: Peter Tan has picked up this item "How to become famous without even trying" and commented:
Driver of car BJD 8282. Pray very very hard that you never ever officially qualify to use these parking spaces. It is no fun for a disabled person to travel twenty kilometers to run errands only find all accessible parking spaces taken up by inconsiderate people like you and leaving us no place else to park.
Update: 31 Oct 08: Eleanor of "Freewheeling" wrote a post "Being caught parking in disabled car parking spaces" and featured our SYN.net smugfaced friend.
"... its one way for them to catch notoriety and be marked by their behavior and be splattered over different blogs for being shown to be inconsiderate. Shame on them!"

Monday, October 13, 2008

I love OOo (and how to convert odf to pdf on the command line)

In continuation of Khairil's meme for foss.my, "I love OOo!"

OpenOffice.org has been my only office suite for the past 5 years (or more?) and its extremely flexible.

Just today I learnt something new: a certain govt agency needed files in PDF because their "IT Department" just haven't gotten round to install OpenOffice.org in their machines. Its quite a few files, and I didn't fancy doing it manually.

So a quick google brought up two options: Use the Macro language, which involved copy and pasting some Basic code, or using unoconv which is a command line python script, by dag wieers. I prefer the command line, so I apt-get installed it.
#sudo apt-get install unoconv
And then running it may get you this error:
# unoconv -f pdf TC4-*.od?
Error: Unable to connect or start own listener. Aborting. javaldx: Could not find a Java Runtime Environment!
The reason is because you need to have OpenOffice.org running in the background (or in a remote server) first. Launch soffice, and run the command line again, and everything will succeed quietly.

Isn't it wonderful that a UI app can be used to convert files from the command line? Isn't it great that it can be driven from the command line with the wierd wildcards (*s and ?s). Isn't it just awesome?

Sign up to foss.my, Malaysia's premier community driven, community focused conference for Free and Open Source Software. Be there and be square. 8-9 Nov 2008


Friday, October 03, 2008

Dialup with Ubuntu, Bluetooth, Blackberry Bold and Maxis 3G.

Since the E61, I have used the iPhone, and Blackberry 8820 both of which didn't support blue tooth Dialup networking features. Now that Im testing out the Blackberry 9000 Bold, I had to make sure that it can be turned into a mobile modem. Im happy to report that it does!

I followed the same setup sequence as the Nokia E61, which I described here "Ubuntu dialup via bluetooth" The modifications are as follows:

The device address would obviously be different, so you will need to do
# hcitool scan
Scanning ...
00:1E:37:E5:FB:xx n/a
00:21:06:FD:5C:AB yky phone
00:1A:6B:87:EE:xx HP-IMD-10042A
00:1E:37:0B:85:xx HP-RSM-10046A
Test that the phone has the required features, and find out the Channel number:
# sdptool browse 00:21:06:FD:5C:AB

Browsing 00:21:06:FD:5C:AB ...
Service Name: Dialup Networking
Service RecHandle: 0x10000
Service Class ID List:
"Dialup Networking" (0x1103)
"Generic Networking" (0x1201)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100
Edit the /etc/bluetooth/rfcomm.conf file with the appropriate values
rfcomm0 {
bind yes;
device 00:21:06:FD:5C:AB;
channel 1;
comment "yky phone";
Resetting the /etc/init.d/bluetooth restart may or may not have rfcomm0 registered. To manually do so, use this command:
rfcomm bind 0 00:21:06:FD:5C:AB 1
This will create the /dev/rfcomm0 modem file.

Now here comes the part which took me a while to figure out. I just ran wvdial BB with the same settings as with e61, but ran into this error:
--> Initializing modem.
--> Sending: ATZ
--> Sending: ATZ
--> Sending: ATM0
ATM0 <-- here is the error: No "OK" received
--> Sending: ATQ0
--> Re-Sending: ATM0
--> Cannot get information for serial port.
--> Cannot open /dev/rfcomm0: Transport endpoint is not connected
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
I noticed that whenever a command is at Init3 in the /etc/wvdial.conf file, the dialer will fail, and the modem will never return a "OK". So remove all Init commands except for the single most crucial one, which is the AT+CGDCONT one at Init2:
[Dialer Defaults]
Phone = *99#
Username = maxis
Password = wap
New PPPD = yes
Dial Command = ATDT

[Dialer BB]
Modem = /dev/rfcomm0
Baud = 115200
Dial Command = ATDT
Init2 = AT+CGDCONT=1,"IP","unet"
FlowControl = crtscts
Modem Type = Analog Modem
Stupid Mode = 1
New PPPD = yes
I have added two more lines in the config file. "Stupid Mode" is required. Otherwise for some strange reason, the authentication process will not start. "New PPPD" is optional, it starts a new PPP Daemon on connection.

Now, it should run without a problem:
# wvdial BB
--> WvDial: Internet dialer version 1.60
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
--> Sending: AT+CGDCONT=1,"IP","unet"
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
--> Carrier detected. Starting PPP immediately.
--> Starting pppd at Fri Oct 3 19:14:00 2008
--> Warning: Could not modify /etc/ppp/pap-secrets: Permission denied
--> --> PAP (Password Authentication Protocol) may be flaky.
--> Warning: Could not modify /etc/ppp/chap-secrets: Permission denied
--> --> CHAP (Challenge Handshake) may be flaky.
--> Pid of pppd: 31565
--> Using interface ppp0
--> local IP address
--> remote IP address
--> primary DNS address
Dialup works via the command line. Ctrl-C kills the connection.

Now that Im trying out KDE, I wanted to see if KDE's dialer would make things easier. So I ran "kppp"

Click on "Configure", and "Add" a new Account. Skip the Wizard. In the "Dial" tab, enter in
Connection name: maxis
Phone number: *99#
Authentication: PAP/CHAP
Check the "Store Password" checkbox
You dont have to modify anything else, so click OK.

Then in the "Modems" tab, click "New...". In the "Device" tab, enter in these details:
Modem name: BB
Modem device: /dev/rfcomm0
Flow control: Hardware [CRTSCTS]
Line Termination: CR
Connection speed: 115200
Use lock file: checked
Modem timeout: 60 sec
In the Modem tab, click on "Modem Commands ..."
Just add in Initialization string 2: AT+CGDCONT=1,"IP","unet"
The other default values should be OK. Click "OK"
You can try out the modem by clicking on "Query Modem..." but I just got blank fields for AT1 ... AT7.

Now that you've defined the Account and Modem device, you can try to connect. Use
Login ID: maxis
Password: wap
and click on "Connect"
It should work, sometimes it hangs at setting the modem volume, but a quick reconnect knocks it into order. You should then be rewarded with a screen like this:

So a nice GUI dialer also works too!


Monday, September 29, 2008

-"We're sorry, this video is no longer available" YouTube downloader

More often than not, when the planets and moons aren't oriented in the right manner, I get the dreaded "We're sorry, this video is no longer available" from YouTube. I know that the video is certainly NOT "no longer available" because its clearly viewable by other people.

Fortunately in the linux world, there is this little python utility called youtube-dl which can be run from the command line to download any YouTube file. So when you get this error, copy the URL of the YouTube file, and do this:

# sudo apt-get install youtube-dl
# youtube-dl http://www.youtube.com/watch?v=videofile001

if it doesn't work, it will complain with this verbose error:

Retrieving video webpage... done.
Extracting URL "t" parameter... done.
Requesting video file... failed.
Error: unable to download video data.
Try again several times. It may be a temporary problem.
Other typical problems:

* Video no longer exists.
* Video requires age confirmation but you did not provide an account.
* You provided the account data, but it is not valid.
* The connection was cut suddenly for some reason.
* YouTube changed their system, and the program no longer works.

Try to confirm you are able to view the video using a web browser.
Use the same video URL and account information, if needed, with this program.
When using a proxy, make sure http_proxy has http://host:port format.
Try again several times and contact me if the problem persists.

You can then repeat this process over and over again, until it succeeds. Unfortunately this requires effort. And we computer users hate expending any unnecessary energy if possible. After all, focusing on the terminal, clicking the up arrow and hitting return is so so tedious.

So I wrote a little bash script to complement youtube-dl as it sports a few extra features:
  1. It will automatically try and retry to youtube-download the file until it is successful (thanks to $?)
  2. It will rename the resultant flv video filename to the current date and time, instead of the random garbage filename. (using date +%F...)
  3. It terminates gracefully when the user hits Ctrl-C (by setting a trap ...)
  4. It promotes world peace by waiting a few seconds before trying again (sleep is always good)
And here it is:


fname=`date +%F-%H%M`


while [ $result = 1 ]; do
echo Attempt $i "$fname".flv
trap "echo User killing the download; exit" INT TERM
youtube-dl $1 -o "$fname".flv
let i=i+1
if [ $result = 1 ]; then
sleep 10

Try it out. The most I had to wait was 24 attempts. Thats 46 keypresses saved!


Wednesday, September 17, 2008

Rukun Negara - have you read it? really?

This is the Rukun Negara which was drummed into our little skulls when we were young:
Of course, when I first knew about it, it was in Malay, and I never really found out what the long and grand words like 'kesusilaan', 'keluruhan' and 'kedaulatan' (with regards to undangs) really meant. Even if I did, would you expect an 7 year old to differentiate between the Constitution and the Rule of Law?

However it was only recently that I found out that there was more to this story than these bullet points. The 'Rukun Negara' that we have learnt aren't actually the real principles (rukuns). They are merely tactical means to fulfill a grander plan; and the real National Principles are as follows:
Our nation, Malaysia, being dedicated :
  • to achieving a greater unity of all her peoples;
  • to maintaining a democratic way of life;
  • to creating a just society in which the wealth of the nation shall be equitably shared;
  • to ensuring a liberal approach to her rich and diverse cultural traditions;
  • to building a progressive society which shall be oriented to modern science and technology;
I really like, and can related to these original Rukuns; Unity, Democracy, a Just society, Equitable Shared Wealth, Liberal, Celebrating the diverse Cultures and Traditions, Progressive Society, and orientation towards Science and Tech! Who cannot like that?

This was written in 1970, just after the May13th disaster. It was intended to correct the path of our Nations growth. And yet, after almost 40 years on, we can see how the real Rukun Negara has been "forgotten", and this is clear with the "progress" of our country and society.

We see families split because of religulous body snatchers, money politics, judicial crisis, abuse of the NEP to cronies, fanaticism, restriction of traditions, regressive societies and a poorly implemented science roadmap.

I think its time we really understand the original principles of Rukun Negara, rather than the abstract version which we have all grown to ignore.

Please re-read your Rukun Negara, and help make Malaysia a better place.


The Malay version:

BAHAWASANYA NEGARA KITA MALAYSIA mendukung cita-cita hendak :

  • mencapai perpaduan yang lebih erat di kalangan seluruh masyarakatnya ;
  • memelihara satu cara hidup demokratik ;
  • mencipta satu masyarakat adil di mana kemakmuran Negara akan dapat dinikmati bersama secara adil dan saksama ;
  • menjamin satu cara liberal terhadap tradisi-tradisi kebudayaannya yang kaya dan berbagai corak ; dan
  • membina satu masyarakat progresif yang akan menggunakan sains dan teknologi moden.

MAKA KAMI, rakyat Malaysia, berikrar akan menumpukan seluruh tenaga dan usaha kami untuk mencapai cita-cita tersebut berdasarkan atas prinsip-prinsip yang berikut :


Tuesday, September 16, 2008

Long Advertisements

Not many companies can afford super long advertisements nowadays. Its costs alot for airtime. Plus you really need compelling content to keep the audience interested.

This 2 minute advertisement from Nike which I saw prior to a movie which I think is great:

This 4 and a half minute advertisement from Microsoft, which was just launched, and is #2 in a series of ten, which I think is utter crap:

One makes you want to watch more to see how more interesting the ad can become (and it does!) while the other just makes you want to watch more to see how bad it can become (and that it does too.) One inspires and makes you worship the brand, while the other just makes you go "... meh?" One is young and exciting while the other is old, drab, out-of-touch and really patronising ("Traffic jam in my garage" - ouch!) One makes full use of the celebrities featured, while the other abuses the has-beens of celebrities. One is tight, well structured and coherent, while the other is rambling, confusing and irritating.

Surely with all the money in the world, they could have done better?


Monday, September 15, 2008

Copy and Pasting between a remote Windows desktop and Linux client

If you need to Copy & Paste between a remote Windows desktop and your Linux workstation, use "Terminal Server Client" to access the host Windows XP/Server with "Remote Desktop" enabled.

In the Terminal Server Client, make sure that the Protocol selected is RDPv5. The default is RDP, which doesn't have the bells & whistles.

Once selected, copy and pasting is fully integrated between machines!


Monday, September 08, 2008

Lotus Notes 8 and wrestling with attachments in Linux

A gripe about opening attachments in Lotus Notes 8 is that LN will fail silently, leaving the user guessing whether things are happening or not. If a user double clicks on an attachment, a dialog will pop up requesting if the user wants to "Open", "Edit", "View", "Save" or "Cancel".

Clicking on View for me gives a strange error: "Unable to create view: Device is disposed" and gives a whole load of eclipse errors in the details. I dont have the time to figure that one out.

So the next best thing is to "Open" the attachment. However that doesn't do anything, and LN fails to report that something has failed. The solution for this however is available here: "IBM - Attachments do not open from Lotus Notes for Linux Client when Open, Edit, or View is chosen in the 'Open Attachment' dialog" The trick is to remove IBM's own "openwith" program with whichever desktop manager you happen to install.

# sudo mv /opt/ibm/lotus/notes/openwith /opt/ibm/lotus/notes/openwith.old
# sudo ln -s $(which kde-open) /opt/ibm/lotus/notes/openwith

It works, but its amazing that we have to jump through these hoops just to open attachments!


Thursday, September 04, 2008

Getting Aztech UM-3100 USB Modem to work on CentOS 5

Our old Hylafax external modems decided to kick the bucket over the weekend, and it was an opportunity to refresh the hardware. They lasted a good 9 years (or more!) and I dont think they make them anymore.

Additionally they had to be powered by large adaptors, which took up way too much room. So a good solution would be to use some USB modems; small, cheap, USB powered and easily replaceable.

We chose Aztech UM-3100 USB Modem. Relatively cheap at about RM70, we thought it would be a great solution. So I plugged it into the machine, and this was the dmesg output:

usb 1-2: new full speed USB device using uhci_hcd and address 2
usb 1-2: device descriptor read/64, error -71
usb 1-2: device descriptor read/64, error -71
usb 1-2: new full speed USB device using uhci_hcd and address 3
usb 1-2: device descriptor read/64, error -71
usb 1-2: device descriptor read/64, error -71
usb 1-2: new full speed USB device using uhci_hcd and address 4
usb 1-2: device not accepting address 4, error -71
usb 1-2: new full speed USB device using uhci_hcd and address 5
usb 1-2: configuration #1 chosen from 2 choices
drivers/usb/class/cdc-acm.c: Zero length descriptor references

cdc_acm: probe of 1-2:1.0 failed with error -22
usbcore: registered new driver cdc_acm
drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

So not very good news to start off the day. This usb-modem isn't supported out of the box, fortunately it isn't too much a problem, but it does require a recompilation of the cdc-acm (USB Communication Device Class definition - Abstract Control Module). Here is a brief lowdown on how to get the Aztech modem recognised in CentOS 5.0.

Prepping the system for module compilation

First, we need to bring down the linux kernel source.

# wget -c ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/kernel-2.6.18-8.1.8.el5.src.rpm
Length: 48176889 (46M)
8% [==> ] 4,018,200 124.1K/s eta 7m 27s

It took only about 7 minutes to download. A "rpm -hiv" extracted the sources in /usr/src/redhat. You will then need to extract the source from redhats patches by doing this:

# rpmbuild -bp --target=$(uname -m) /usr/src/redhat/SPECS/kernel-2.6.spec

which should recreate the kernel source in /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686. Copy your config from the /boot directory to this directory

# cp /boot/config-`uname -r` ./.config

Now you are ready to compile the entire kernel ... if you want to. For me, I just want to compile the usb modem module, and not need to wait for the entire compilation process. But first, the modifications.

Adding support for the modem.

This ubuntu forum post "Shiro/Conexant (Rockwell) RD02-D400/Aztech UM3100 USB 56K Modem" provides the information to add support for the Aztech modem. First of all, we need to make sure that the ID as reported by lsusb is matches our modifications. To do so, type this:

# lsusb
Bus 001 Device 009: ID 0572:1328 Conexant Systems (Rockwell), Inc.

You will see that its 0x0572, 0x1328. This is what we will use in our modification. Modify the cdc-acm.c file:

# nano drivers/usb/class/cdc-acm.c

scroll down about 97%... put this in similar place, next to all the other devices
{ USB_DEVICE(0x0572, 0x1328), /* Aztech UM-3100 */
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
Save, and that's all with the source code modification. No big deal.

Compiling the specific module.

Instead of having to build the kernel and all the modules, we can tell 'make' to build from specific directories. First, you will have to compile some scripts which are used for MODPOST, which is important to make the .ko module files.

# make SUBDIRS=scripts/mod/
WARNING: Symbol version dump /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/Module.symvers
is missing; modules will have no dependencies and modversions.

CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
Building modules, stage 2.

Then you can actually build the modules which are of particular interest to you, in this case "drivers/usb/class"

# make SUBDIRS=drivers/usb/class modules
WARNING: Symbol version dump /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/Module.symvers
is missing; modules will have no dependencies and modversions.
Building modules, stage 2.
CC drivers/usb/class/cdc-acm.mod.o
LD [M] drivers/usb/class/cdc-acm.ko
CC drivers/usb/class/usblp.mod.o
LD [M] drivers/usb/class/usblp.ko

The file which you need is drivers/usb/class/cdc-acm.ko so just copy this to the real modules directory of your running kernel.

# cp drivers/usb/class/cdc-acm.ko /lib/modules/2.6.18-8.el5/kernel/drivers/usb/class

Loading up the new module

Unload the module if it was loaded before:

# rmmod cdc_acm
ERROR: Module cdc_acm does not exist in /proc/modules

And load up the new one

# insmod cdc_acm

To check that its there:

# lsmod |grep cdc
cdc_acm 15136 0

And now, plug in the Aztech modem, and see what happens:

# dmesg
cdc_acm: no version for "struct_module" found: kernel tainted.
cdc_acm 1-2:1.0: ttyACM0: USB ACM device
usbcore: registered new driver cdc_acm
drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

Congratulations, it looks like its been recognised as ttyACM0

Testing the modem

Make sure you have the 'cu' utility installed. It usually comes in the 'uucp' package:
# yum install uucp
Once 'cu' is available, use '-l' to speak directly to the line.
# cu -l ttyACM0
You can then reset the phone, and try to call out.
(9 is to get a dialtone from my PABX, and the comma is to wait).
Also test the modems ability to auto pickup after 1 ring with this command
However Hylafax controls the pickup process, so make sure this is not set. Reset the modem with this:
And quit from 'cu' with this tilda command:

Your Aztech modem should be recognised by the system even after a reboot (test it, its the only reboot you'll need to do). You can now plug in more USB modems to cater for your Fax server's needs.


Mutt - forwarding attachments automatically

Some little tricks with mutt again. By default mutt doesn't forward MIME attachments in the email, and it previously involved a laborious process of saving each file (in the current directory) and reattaching the file (from the users mail directory, which involves traversing the directory structure). So a quick google solves this issue entitled "How do I forward a message including attachments?"

In your ~/.muttrc file (create it if it isn't there already), add these two settings:
 set mime_forward=yes
set mime_forward_rest=yes
Done. Less hassle.


Tuesday, September 02, 2008

Woah, buddy!

Check out these figures:

That looks like a series of numbers growing exponentially and spiralling out of control. I wonder what the deficits figures are?


Thursday, August 28, 2008

When you censor, you make people curious.

Silly MCMC. Dont they know that "censoring" a website via DNS blackholes is the lamest way of blocking it? I mean if they wanted to really censor, then deny all traffic into Malaysian backbones. Do it properly.

Instead they just told ISPs to blackhole entries to malaysia-today.net. Circumventing this is really easy, either by direct IP, or changing DNS server to any other foreign one, or having other people "mirror" the IP addresses.

Now we, the Malaysian public, know that someone doesn't want us to read the ramblings of RPK. Instead now RPK gets the credibility. Now there is more of a suspicion that what he is writing is hitting a nerve.

So shame on MCMC, shame on the people who authorised this, and shame on the ISP who bowed to this directive.

Don't they know that whenever you try to ban something, the desire for people to want to read it increases? duh.


Thursday, August 14, 2008

My Ten Commandments

A good set of commandments to live by:

  1. Thou SHALT NOT believe all thou art told.

  2. Thou SHALT seek knowledge and truth constantly.

  3. Thou SHALT educate thy fellow man in the Laws of Science.

  4. Thou SHALT NOT forget the atrocities committed in the name of god.

  5. Thou SHALT leave valuable contributions for future generations.

  6. Thou SHALT live in peace with thy fellow man.

  7. Thou SHALT live this one life thou hast to its fullest.

  8. Thou SHALT follow a Personal Code of Ethics.

  9. Thou SHALT maintain a strict separation between Church and State.

  10. Thou SHALT support those who follow these commandments.


Tuesday, August 12, 2008

IE6 on Linux ... why?!

Revamping a website to make it more CSS compliant, and getting rid of a whole load of <table> gunk. Playing with unordered lists and list items and tailoring the look with simple CSS is very addictive and somewhat rewarding. However this comes with a price, and its the Microsoft tax yet again. This time its a tax on my patience. Things just don't appear as they should on IE6, while Firefox, Netscape, Konqueror, Safari and Opera works perfectly. Considering that it still has about 30% market share (still way more than Firefox), it is a problem which needs to be addressed.

So to help me debug it without having to pull up a Remote Desktop, I had to install IE on my Linux machine. Eugh.

Fortunately the pain of installation was rather ... painless. IE4Linux has a great installation process which allows you to install IE5, 5.5 and 6 using wine and cabextract. The process is described here, and the screenshots looked like this:

It took about 7 minutes to download the CABs and run through the installation. The binaries are kept in a ~/.ie4linux folder. Running a user friendly symbolic link from ~/bin/ie6 displays ie in all its glorious splendour:

"Master, It Lives!"


Monday, July 28, 2008


BarCamp was held in Kuala Lumpur for the first time over the weekend. I didn't expect much of it, thinking that it would be a lame attempt to for pseudo web2.0 wannabes to 'network'. I was pleasantly surprised, as at the end of the first day it was encouraging to see a good sharing community growing here OTHER than the MyOSS one.

Ditesh volunteered me to speak a month back, and I thought I had ample time to prepare a presentation. I left it really late, and only started work on the presentation 2 days prior. I drew up a rough mind map on things worth talking about regarding the 2 year story of OpenMalaysiaBlog, and was figuring out how to present it. After all, a standard presentation with bullet points would have driven people insane, and a steve-jobs type one takes way too much time in preparation and rehearsals, and would severely limit audience interaction.

So the best thing I figured was to present the big picture; the mind map itself.

I was asked during the presentation on how I created it. I said "Adobe Illustrator, of course!" This brought on boos and jeers, of which I said "... kidding, I used Inkscape; a Free and Open Source vector illustration program. The source file is in svg."

What I realy like about Inkscape is its a real quality software. It has never crashed on me yet. The output to png is impeccable. It has great blur effects which makes for good drop shadows. The gradient tool is useful and usable. I also found a hidden feature, which is to embed bitmap images within the svg. By default, images are linked from external files.

To present, I just used plain ol' Eye-Of-Gnome (EOG). You will need to make sure that you set the background to white or to a solid colour:
Whats good about EOG is that it worked really well with my eeePC's touchpad. The vertical and horizontal scroll edges worked smooth and consistent scrolling, and pressing Control and manipulating the vertical scroll allowed me to zoom in and out effortlessly. It was surprisingly easy to manipulate the touchpad standing up and infront of the few people in the room.

What I liked about the talk was the interactiveness, and there were at least 4 people in the room who were outspoken, which encouraged a robust discussion. We eventually ended up taking a significant amount of time talking about Software Patents, of which I was surprised that non MyOSS members were clued up on. As a bonus it was good to know that they too understood the dangers it mounted on software development both proprietary and open source, in Malaysia.

At the end of it, was a rendition of Bob Dylan's "For the times they are a-changing'" by our resident musician and GSoC personality, Raj Deelan.

Hasan explained that this song was featured in our first blog post at openmalaysiablog.com, and it represented the changing times we are currently experiencing. I apologised for the bad transcript which was projected, as I left out 2 verses of the song, which left the karaoke afficiandos in the lurch (Aizat, it was reported that they could hear you 3 rooms away). However I made sure that this verse was in:
"Come senators, congressmen
Please heed the call
Don't stand in the doorway
Don't block up the hall
For he that gets hurt
Will be he who has stalled
Theres a battle outside
And it is ragin'.
It'll soon shake your Windows (tm)
And rattle your walls
For the times they are a-changin'."
Well done to the BarCamp organisers, the two Daniels, Kamal Fariz and many others for holding a quite spectacular event which brought together a community willing to share.


Picture credits goes to Azman Saini's Flickr photostream. Thanks!

Small mentions of my talk by Ditesh
There were many questions from the audience, most seemed to be awed by the level of dedication the OpenMalaysia people seemed to have put in to promote openness and transparency in Malaysia’s government ICT policies.
Yuen Chi
I liked how Yoon Kit's presented the stories in a mind-mapping-like diagram.
... how OpenMalaysia Blog got started ,how the reaction from .MY Goverment in Opensource. Yeah how the big company starts lobbying around ... IMHO, this is to ensure the future of country is control by our own wills not other.
Meng Wong
The opensource guys related the story of ODF versus OOXML; not only that, they whipped out a guitar and, in a slightly cheesy but earnest moment we sang "The times, they are a-changing."

Monday, July 14, 2008


Wow. Malaysia's very own Minister of Science Technology and Innovation (MOSTI) called his fellow constituent party within Barisan National a "political bitch".

"The worst kind of enemy is the one that is within," he said in a statement, noting the Sabah Progressive Party's "persistent flirting with the opposition to bring down the Government".

Maximus, who is also Science, Technology and Innovation Minister, said in doing so the party renders itself being viewed as nothing more than a political bitch.

I guess nowadays language like this is of the norm for Malaysian politicians, where 18SX words are exchanged on a daily basis. I wonder what it must be like to be a kid reading mainstream papers today. One would have to be exposed to words like sodomy, anal sex, rape, bugger, bitch, homo, etc, and have its explanations skirted around.

Why do they even bother with censorship then?

[ Malaysiakini also reports on this issue. ]


Tuesday, June 17, 2008

Midi to MP3 and abit of editing

My offspring loves watching Pocoyo, and I kinda like it too. Cute, mildly twisted humour and very entertaining. I learnt today that there is an Official Pocoyo Blog. Its very interesting, as it has news and information on the production of the series.

There is a blog entry entitled "Pocoyo Opening MIDI" - sure enough, they posted the midi file for the opening credits where Pocoyo introduces the characters with a few variations of the catchy theme.

I downloaded the midi, and wondered how I could make this a ringtone, for phones which dont support midi. Timidity was the solution.
# sudo apt-get install timidity
[Downloads about 29MB worth of stuff]
# timidity opening_pocoyo.mid -Ow -o poco.wav
It then displays a mapping of midi instruments, and warns if there are no appropriate instruments. For this case, I got 3 missing ones:

No instrument mapped to tone bank 0, program 11 - this instrument will not be heard
No instrument mapped to tone bank 0, program 108 - this instrument will not be heard
No instrument mapped to drum set 0, program 85 - this instrument will not be heard

you can then play the wav, but we are only halfway there. We still need to convert it to mp3.
# lame poco.wav poco.mp3
LAME 3.97 32bits (http://www.mp3dev.org/)
CPU features: MMX (ASM used), SSE, SSE2
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding poco.wav to poco.mp3
Encoding as 44.1 kHz 128 kbps j-stereo MPEG-1 Layer III (11x) qval=3
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
1555/1555 (100%)| 0:04/ 0:04| 0:09/ 0:09| 9.2741x| 0:00
kbps LR MS % long switch short %
128.0 25.0 75.0 81.9 11.3 6.8
Writing LAME Tag...done

To test, mplayer can be used:
# mplayer poco.mp3
I then sent this file over to my phone, and its my new ringtone!

Instead of having the entire song, I used Audacity and extracted only the final part of the tune. I also used the "Fade In" effect to make it sound better. Audacity has an "Export" to mp3, which makes the lame part redundant.


Thursday, May 29, 2008

Airport Security

Saw this sign in Heathrow Airport:

What is this suppose to mean?
  1. The rest of the airport is NOT secure
  2. Because of me, they now have to secure it
  3. Im a terrorist, and I now need to be aware that I shouldnt be
  4. Its a reminder to airport staff to be more vigilant
Argh. Whatever that sign is suppose to mean, it does NOT make me, an innocent passenger feel any better.



Copying Pictures from the iPhone

Im thinking of upgrading the firmware of the iPhone to 1.1.4. Before I do that however, I needed to move out the pictures Ive taken. For some strange reason, my Windows machine, which has iTunes on, refused to recognise the iPhone as a camera. Or rather it did, but when I accessed it as a 'drive', it didn't copy over the photos. It would display the listing of the files, but when I do a drag-n-drop, the copied files would be 0 bytes. Very strange.

Also iTunes doesnt make it obvious on how to sync the pictures which I've taken. Doubly strange.

Giving up on that, its back to Linux to help me out on this rather simple task
  1. Make sure your iPhone is connected to wifi.
  2. Find out the address by going to Settings / Wi-Fi, and tapping on the wifi details. It should display the IP address there, e.g.
  3. Also in Settings, go to the General / Auto-Lock menu and set the time-out to "Never". Otherwise the wireless will cut off. Don't know why the options are restricted to only 5 minutes.
  4. On the linux shell, use this command:
    • scp -rp root@ .
  5. This should copy all the files in the directory where the photos are stored.
    • -r is for recursive and
    • -p is to preserve the time and date
  6. The default password for ssh in an iPhone is 'alpine' for the 1.1.3 firmware.
Thats all to it. You can also do some interesting stuff with rsync, but I just wanted my pictures out before the machine gets wiped.


Wednesday, May 21, 2008

Ballmer strikes back.

So Ballmer went to Hungary ...
... an this student started shouting ...
... and threw eggs at the most powerful CEO in America ...
... and made Ballmer look like he was cowering in fear ...
... and while the student was taken away ...
.... Ballmer strikes back!!!
.... "heh, you don't mess with the best baby!
Ive got the best throwing arm in the world!

See it on YouTube.


DSpam: WebGUI modifications - Javascript goodies.

Ive been using dspam for two years now. It has been set up as a broad filter which checks all the emails passing through our systems. It has worked very well over the past year although going through the thousands of emails has been a chore.

The WebGUI for dspam is rudimentary, and is really built for single users to review their own spam/hams. It really isnt designed for large volumes. So I had to make some modifications.

Modification #1: Looking for missed SPAM.

The problem with the WebUI when you view the History tab is that it displays ALL the emails which pass through the system. This would be a normal requirement, but if you really are just interested in reviewing the False Negatives, i.e. SPAM that got away, it really takes ages to scroll through the pages one after another. If your domain has attracted alot of spam, over 70% of the entries are spam anyway, and you arent really interested in that information.
So the solution is to ignore the SPAM entries from the /var/dspam/.../dspam.log file. To do this, you will need to modify the /var/www/html/dspam.cgi file.

This is the patch (dspam.skipSPAM.patch):

With this patch, you can toggle the ability to skip through Spams by adding in another url argument &skipSPAM=true on the URL address. Otherwise, if you want this on by default, just make $skipSPAM = "true" in the perl script.

The result should look something like this:
Notice how the Spams are ignored, giving you a clear view of what to retrain or allow. I also skip through Whitelisted emails so that means less lines to review. I use Firefox's tab browsing, and just middle click the entries which I want to flag off as Spam. The process is very fast, and I probably need to click through about 3 pages of history to mark off any significant growth in spam.

Modification #2: Marking Dead meat the brute force way
One of the hassles of clearing False Positives is the process of going through each and every spam item and checking it off. Early on, I modified the nav_quarantine.html template file with this small Javascript which checked off the first 200 items. Here is the patch for the "Select 200" modification for the templates/nav_quarantine.html file (nav_quarantine.select200.patch)

This worked well to a certain extent, but when you have over 10K entries, refreshing the page 500 times is certainly not an option. There MUST be a better way. And there is ...

Modification #3: Marking Dead meat the elegant way.
Blindly selecting the first 200 entries isnt really an efficient way of culling the confirmed spam. I needed an almost automated way to handle this. So I embedded more information from dspam into the WebUI and written some Javascript to make this process alot more bearable.

The first requirement is to remove all the marked spam of a given percentage of certainty. Throughout the entire production usage of DSpam, I have yet to see a False Positive with a certainty score of more than 70%. What would be great is to check off all entries given a score automatically. This is now possible by entering a confidence number, and simply clicking on the "Mark Rating" button.
What the script does is that it uses XPath to query out all rows which have a rating of more than what is entered. The Javascript code looks something like this:

var pRate = parseFloat( document.getElementById("rating_val").value ) / 100;
var xpath = document.evaluate( "//tr[\@rating > "+pRate+" ]", document, null, +XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
I have also added an extra feature in that it will also mark of similar items which may have less of a confidence than provided. This will be elaborated below, in the "hash" I generate with all the entries later. Because of this 'recursive' behaviour, the script will take a while to complete, so you may need to increase the timeout for Firefox (otherwise it may complain with a "A script on this page may be busy, or it may have stopped responding. You can stop the script right now, or you can continue to see if it completes.") To do so, type about:config in the URL bar, and adjust the dom.max_script_runtime from the default of 10 to something larger like 500.

Modification #4: Ajax waits for no refresh.
Another tedious part about using the WebUI is that whenever you need to purge the quarantine of the caught spam, it takes ages because it causes an entire page refresh. Its OK if the list is less than a thousand, but when it reaches 20K or more, its just too much.

Then we come to another problem when deleting the entries from the /var/dspam/.../dspam.mbox file. As you remove entries from the file, if at any point during that time, a new email arrives, the deletion will cancel and the file will roll back to its original state plus new email. So realistically on a busy system, you can't delete more than 50 spams at a go. This means we will have to endure ALOT of page refreshes.

What I implemented then was a AJAX type handler for dspam.cgi to execute. I added the Javascript features in the WebUI, and it looks like this:
As you click the button, the Javascript will scroll through the checked list, and when it compiles 25 entries, it forms a query back to dspam.cgi to execute in the background. It will alert the user by stating it is currently "deleting 25". When the call is successful, it will state "deleted 25". It will then repeat the process if there are still items to be checked.

The figure 25 is something which I found to be small enough to cater for non roll backs, and because the process is automated, it doesnt need to be large. So to clear off 15K entries, it takes about 30 minutes to an hour.

Modification #5: Hashing up spam
For the remaining spam which isnt obvious, I have included two little clickies on the end of the table. "del" deletes the entry immediately, while "hash" checks the entry's checkbox, and all entries with similar subjects. This means you can click off multiple spams with just one click as demonstrated below:

This makes marking off spam almost ... fun!

Patching the WebGUI
I include with this post three patches. In the dspam.cgi directory, run this:
# patch < dspam.skipSPAM.patch
# patch < dspam.ajax.patch

and in the template directory
# patch < nav_quarantine.select200.patch

Otherwise dspam.cgi and template/nav_quarantine.html are also available.

How I use these modifications
Whenever I have the time to review the spam collection
  1. I load up the quarantine page until its fully loaded.
  2. I then click on "Mark Spam" with the default rate of 85%.
  3. This takes a few seconds depending on your PC.
  4. I then click on the "Ajax delete" button to start the deletion process in the background.
  5. In the meantime, I reduce the rate down to 70% and sometimes 60% to clear off further spam.
  6. I also start from the top, i.e. 47% confidence spam items, and slowly review the items up to about 53%, clicking on the "hash" to remove the spam items.
  7. After I clean off the False Positives (if any) I click on the "Select 200" and eyeball the remaining items until there are no entries left.
  8. It still takes some time, but at least its a whole less time than before!

I hope this helps!


Thursday, May 15, 2008

Converting video: Realmedia to DivX

I have a video which is encoded in rmvb. Realmedia (who they now?). I want to convert it to a divx file so that I can burn it on a DVD and watch it on my DivX-DVD player at home. This is what I tried to view it with ffmpeg:
# ffmpeg -i videofile.rmvb -vcodec mpeg4 out.mpg

FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-pp --enable-swscaler --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libogg --enable-libgsm --enable-dc1394 --disable-debug --enable-shared --prefix=/usr
libavutil version: 1d.49.3.0
libavcodec version: 1d.51.38.0
libavformat version: 1d.51.10.0
built on Mar 12 2008 14:31:53, gcc: 4.2.3 (Ubuntu 4.2.3-2ubuntu4)
[NULL @ 0xb7e086e8]Unsupported video codec
[NULL @ 0xb7e086e8]Unsupported video codec
Unsupported codec (id=72) for input stream #0.1
So that didn't work. FFmpeg doesnt seem to understand Realmedia. A bit of googling brought me to this command:
# mencoder videofile.rmvb -o outfile.avi -ovc xvid -xvidencopts fixed_quant=5 -oac mp3lame -lameopts abr:br=128

Opening video decoder: [realvid] RealVideo decoder
Error: /usr/lib/win32/drvc.so: cannot open shared object file: No such file or directory
Win32 LoadLibrary failed to load: drvc.so, /usr/lib/win32/drvc.so, /usr/local/lib/win32/drvc.so
Error loading dll
So that doesn't work either; looks like Im missing some DLLs. Abit more googling, and I am recommended to visit this page "MPlayer Codecs", which is a compilation of all the codec dll's for quite a few video formats. So I downloaded essential-20071007.tar.bz2 and windows-all-20071007.zip which was extracted into the /usr/bin/win32 directory as root.

After which, the mencoder command worked without a flaw in converting between Realmedia to DivX.

What joy, this multitude of proprietary file formats.


Wednesday, May 14, 2008

Windows Terminal Server - Maximum connections blegh.

Don't you just love proprietary software? It restricts you in the most irritating manner.

I unfortunately had to do something on a Windows 2003 server, and I normally go about by using the wonderful Remote desktop protocol. Linux has an excellent client implementation of it, and I use it more often than VNC for Windows servers.

This time however, I was alerted with this error:
"The terminal server has exceeded the maximum number of allowed connections."
Translation: "Nye-nye! Buy CALs!"

Not wanting to be a neanderthal by rebooting the machine, I decided to see if I could circumvent this "problem" with a bit of Googleducation. Well, it seems its possible with Windows 2003. You can actually make use of the "console" session if your login has the role of an administrator. To access the console, or "session zero", in Linux its like this:
# rdesktop -0
... where you replace your server IP address with the example provided above. The "-0" flag indicates that you want the console session. In MS-DOS's command.com, supposedly, because I havent tried it, its:
C:\> mstsc -v: /f -console
Once you are in, and get some scary errors about kicking out the currently logged in person, you can view the RDP session which have been hanging around, taking up the precious license seats.

The command.com commandline command is:
C:\> query session
Subsequently, you can delete the Disconnected / Orphaned / Stray / Dismembered sessions using this command, which is very similar to vncserver -kill :[screen #]
C:\> reset session [session ID]
You can disconnect ALL sessions by selecting the highest ID (usually >65536) e.g.
C:\> reset session 65538
Obviously I tried it once and got kicked out of by remote desktop. Heh. Cheap thrills.

So there you have it: how to retain access, and a simple way of 'resetting' your Windows 2003 server's remote desktops without having to reboot the darn thing, because of the artificial restrictions placed on software based on user access licensing.