Thursday, July 28, 2005

The Birth Of Google

Wednesday, July 27, 2005

More D port progress

efl.edb is now complete for a first version. All natice Edb.h funcionality has been wrapped up with D functions/methods to give them a D feel.
I've started on the Eet.h. This also shouldn't take time. I'm going to avoid Evas for now, and instead probably focus on all the smaller libs, Epeg, Epsilon, Imlib (not soo small), Embryo. If i survive thru all these, i think i'll be in the right frame of mind to tackle the big boys, Evas, Ecore, Edje, Ewl.
Something is happening though as i'm doing all this. EFL is getting very clear. There is this thought of a Python port in my mind too. If I last thru all these a Python port will be very feasible and clearer too.
On the Xlib front. I'm continuing with the #define constants. I should be thru tonite or tmrw, then enter a thourough testing phase to see if i can transliterate C programs to D using Xlib.d; Once that is successfull, then i'll start to wrap the functions into D classes, etc.

Traveller's Log 1

The sacred book of hacking says: "Every coder worth his modules, should have time that is *his* own to spend mashing at the stuff that interests him. That is the only path to true greatness"
There are they who wander in this path, but get sidetracked by the Great Coperate (tm). It is rumoured that some of them have been seen in the dungeons of the Great W$ debugging the Legendary Beast... Ai EE, that accepts malformed HTML, and spits your CSS back in your face. Needless to say, great is their misery.
Consider instead, J. R. Hacker of the Noob, of the order of the Freshman, of the order of the Unemployed. He it is said of, to have followed the path of X. It is said he was visited in a dream by the GNOME, the great protector of Gtk. Weather it be true, we shall never know. But we know it was he who initiated the GNOME Project. Today, he has been granted the venerable post of VP at the Wovell.
Thus spake the great master Google and I listened to his result pages. From them I have found the path to the SourceForge. I have learned to drink from its great repository with the cup of CVS and SVN. Master Google has thought me the rudimentary yet arkane art of building using the secret autotools and raw Makefiles.
I have learned to sit at the feet of other students of Great Master Google who meet at the IRC. Great scholars of the order of the #c, #python, #bash, #linux, #edevelop, #archlinux, and a great many other sects that are more numerous than any one human can possibly know. But the Great Master Google knows them all.
In the hallways of the #c, i have learnt the secret arts of glibc, and devoted myself the the art of libdl. I have learned to grok the PEPs of the Python dot Org to understand what the Masters say in #python. Now i understand the way of the List-Comprehension, and I can swim through any Generator Expression. There is still the secrets of the Meta-Classes and Decorators to be mastered though. But i have found that sitting under the ElementTree, one can feel the Zen of XML.
Finally I also have started my journey thru the desert of OSS. That great Oximorous Multiverse. My sword in hand, is built from Raw Linux found in the KISS valleys of I have extended the blade and stuck a custom -mm kernel in the handle. I carry about a small Vim anvil in case i need to craft any C, D, Python, Bash tools. My backpack contains additional PHP and Perl hammers among a lot of other contraptions that master Google has given to me over the years.
My quest I know not where it will lead me, but I am intent on finding that path to true greatness.

Tuesday, July 26, 2005

Edb.h to Edb.d

Anyway, just to Test my understanding of the .h to .d conversion process thoroughly, yesternite, i basically started and finished porting Edb (from the enlightenment EFL) to D. And you know what? I'm extremely IMPRESSED with those libraries. I was expecting to have lots of #defines to copy across, but NO NO NO NO NO!!!

Raster and guys are using really good C programming Semantics, with little used but beneficial features of C. Instead of using #define foo baa, like everyone else does, they use C's enums... And looking thru the header files, they read like a cool users manual. WOW!!! I'll tell you something... that library is WELL designed.

also, i've wrapped up the Edb into an Edb class, to make it feel more like a D programmer would expect. and the Edb class is ready as a version :)

What is left are three functions:

char **e_db_dump_multi_field( char *file, char *file2, int *num_ret);
char **e_db_dump_key_list( char *file, int *num_ret);
char **e_db_match_keys(E_DB_File *db, char *pattern, int *num_ret);

I have to make these module level functions, and give them D calling semantics, and encapsulate away the raw pointers.

And oh.. here's a sample program that worked for me yesternite:


import std.stdio;
import efl.edb;

int main(char[][] args)

Edb db = new Edb("afile.edb");

db.set("Magnus_i", 55);
db.set("Magnus_f", 55.59);
db.set("Magnus_s", "fifty-five");


Edb db2 = new Edb("afile.edb");

int ival = db2.get_int("Magnus_i");
float fval = db2.get_float("Magnus_f");
char[] sval = db2.get_string("Magnus_s");


writefln("Magnus = %d\t%f\t%s", ival, fval, sval);

return 0;


Oh... and i forgot to mention... since D has inherent support for unittests, the Edb.d module contains its own unittests.

Why am i doing this? I'm learning... Duh!!!

This means to me that i totally understand the C.h to D.d conversion process, and hey... its fun.

Once i totally wrap up the C parts of Xlib.h, then I can start giving them D objects to make D Xlib programming more fun.

Essien... out.

Xlib, C to D port: Third Iteration

O blimey!

When i said i would probably start again one more time on the Xlib C to D port... i sort of felt it. I'm not so sure i meant it, but i had to do exactly that this weekend.

When the Mythical Man Month says, plan to start from scratch at least once... its very true. Things get clearer if you not scared of starting over at least once. Infact... just plan for it.

I completed the second iteration of Xlib and had Xmd.d, X.d and Xlib.d as at Saturday, in the wee hours of morning. Then i tried to port a simple Xlib C program that draws a line to its D version. It was then my suspicions of gcc -E were confirmed. Most of the convenience macros and #define constructs were missing. The convenience macros are not really a problem, since D semantics will mean having to rely less on such trickery, but the #define constants are really important, as they are mostly values that are unique to a function etc.

Thus i decided to look at h2d at

I tried it out, and my... it made my work even easier, and converted all the structs, typedefs, types for me. phew!!! time shaver, but still, the script it uses 'deeify' is still subject to the gcc -E problem, since it still employs it.

My third iteration, involved:

1. Using h2d's 'deeify' to run convert the .h file to a .d file.
2. Visually inspecting the .h file and copying over all the #define constants that have been left out by 'deeify'
3. convert the copied over #defines to either const declarations or enums (this part is still hard boring work)

Using this, i quickly went thru Xmd.h and X.d again, and they are ready in their first version. The last is Xlib.d, which has quite a number of boring constants to work on. I'm going to probably whip up a script to do those. But now that everything is *really* clear, i'm making progress.

Friday, July 22, 2005

Lazzyness is not a bad habit! Slothfullness is :)

So what’s the difference?

Hehe… in my world, I classify Laziness as the unwillingness to do more work than you feel you need to do. Slothfulness, in this same world of mine, is the unwillingness to do work that must be done.

You still don’t see the difference? Lemme explain. I’m slothfull about my Laundry (trust me… you don’t want to stick your nose near my laundry bad :) ), but I’m totally Lazy about Programming.

Porting XLib to D, is a case in point. From my limited understanding of the conversion process, I jumped in, took one look at Xlib.h, saw that it included X.h, and Xmd.h, and I decided to start by converting X.h to X.d

All well, and good, till I started doing the actual conversion. I started seriously replacing complex #defines, #ifndefs, etc, with version() statements, etc, and got stomped on a number of them, put TODO: markers on them for a next iteration, and tried to move as fast as I could. In the first two days, I completely had X.h converted to X.d (a whooping 3000+ line file!!!). That proves I’m not slothfull by my definition.

Well, next was Xmd.h to Xmd.d, and I started… full of energy and enthusiasm… and then I realized… heck… at this rate… I’ll NEVER finish this stuff!!! How did I come to that realization? Well, all this files are VERY LARGE. Then my lazy side kicked it… my hands just REFUSED to move on the keyboard again, and I started thinking… there MUST be something I’m not doing correctly. I considered writing a bash or python script to take the drudgery away, but then there were still so many special cases, and my RegEx is not FBI class RegEx (whatever FBI class RegEx is :) ).

It was then I started looking closely at the docs and found that there was a recommended step I was indeed missing out.

There is a recommendation to run the Preprocessor before conversion actually starts.. hmm… how did I ever miss that? Will it simplify my work? I went to find out.

I ran gcc –E on X.h and OMG!!! The result was less than 20 lines of code… I immediately began to suspect the process.
I repeated this on Xmd.h and DAMN! The same thing… all the code was disappearing, and some files like Xosdefs.h turned up totally empty. I popped into irc, asked around a bit, and someone said I may have empty files if I’m not referencing anything from those files.

Keeping that in mind, I reapeted that on Xlib.h, which pulled in code from X.h and Xmd.h, and I compared the sections it pulled in, and they were the same as the ones I got when I ran gcc –E on the independent files. Also, Xlib.h wasn’t empty like the other files, but it was just left with struct defs and typedefs…

Wow!!! That is a whole lot less work than my previous approach. So I’ve already clobbered the old sources, and started again. I’m almost certain I may start afresh at least once more as things get clearer, but it’s a whole lot more clearer. What I want to do is to download digital mars C compiler and use that to run the Preproccessor stage and compare the two outputs.

Currently my work is cut out for me, I’ve written a quick and dirty bash script, that does most of the typedef replacements that are obvious, and the type mappings (unsigned long long -> ulong for instance).

I’m sure I’ll be able to test my example code this weekend, so I’m still shooting for that.

Back to laziness and sloth. I was lazy about continuing, but not slothfull about doing the necessary research. Also, my continuing along with my HARD WORK approach, will seem to prove that I’m not lazy and not slothfull. The truth is, once I refuse to AT LEAST CONFIRM a suspicion, then I’m slothfull. This is probably one of the key factors that separate smart hackers from the regular drone next desk :).

Maybe I’m not your uberKewl smart hacker, but hey…I’m MY UberKewl smart hacker :)

Essien… Out.

Thursday, July 21, 2005

XLib D port, Jython BlackBerry apps

Progress on porting XLib to D, took a minor step forward yesternite.

I've completed X.h -> X.d conversion, and dmd reports no errors. That's a little victory. Now, X.h actually includes Xmd.h, which has some *wicked* preprocessor defs, like:

#if defined (_LP64) || defined(__alpha) || defined(__alpha__) || defined(__ia64__) || defined(ia64) || defined(__sparc64__) || defined(__s390x__) || (defined(__hppa__) && defined(__LP64__)) || defined(__amd64__) || defined(amd64) || defined(__powerpc64__) || (defined(sgi) && (_MIPS_SZLONG == 64))
#define LONG64 /* 32/64-bit architecture */

My translation to D, looks so far like this:

version( _LP64 || __alpha || __alpha__ || __ia64__ || ia64 __sparc64__ || __s390x__ || __hppa__ || __LP64__ __amd64__ || amd64 || __powerpc64__ ) {

version = LONG64;

Ofcourse, you'll note that i don't have any representation for the compound && that is or'd into that expression..:

|| (defined(sgi) && (_MIPS_SZLONG == 64)

I'm not sure how to add that to the version() construct. What is really stomping me, is how to cater for the _MIPS_SZLONG == 64, since i can't specify expressions in a version() conditional. Hmmm....

Anyone with any ideas? I'm still thinking about this. I'll continue tonite, and i'll move on to other parts... everything doesn't have to be picture perfect for a first release, which will happen when i'm able to run the tutorial at:

I won't need those defs to get it work on my box, which is a humble AMD Anthlon64 :), but we'll need them eventually if we're really serious about portability.

Btw, yesterday, i was also trying to get a Jython BlackBerry sample to build, and suprisingly, i got quite far, only to be stomped by a preverification error. java.lang.NoClassDefFoundError. I used jythonc to build a .java file out of my .py program, and proceeded to use rapc.exe (RIM's custom tool for creating .cod files, needed by the BlackBerry).

rapx.exe actually calls another program preverify.exe, and then calls a java compiler, then does some funky stuff. My problem, happened at the preverification stage. it was preverifying the jython.jar archive and borked. The good news is, i think its just a path thing i have to sort out, as when i also tried to preverify net_rim_api.jar, without using the IDE, it also borked on the same error.

I'll give this another shot sometime tonite. If this woiks, this WILL be SOOOOOOO cool... my next step will be generic MIDP and CLDC apps in jython! WHOOOOO!!!

Ok... Essien... out.

Wednesday, July 20, 2005

Revisiting D

After not doing active D coding in a while, I’ve been revisiting it gently in the past weeks. What slowed me of initially was there was nothing I was doing with it productively.


For my scripting and generic one-off projects that I see no reason why I need to compile, I use the venerable Python, and at work, I work with C#. And back at the shell, I still use serious Bash scripting. So apart from the proof of concept D sprint that I set for myself, I really didn’t have any project to use it for.


Well, it seems that is going to change. Someone on (, suggested the creator of DFL (, do a Linux/Unix port of DFL, utilizing Xlib. So, I’ve jumped the opportunity to put my D to the test.


What we’ll be doing is basically porting XLib to D so D GUI toolkits like DFL, can be built easily on Linux.


The truth is, what we’re doing (thanks to D being a practical and realistic language), is not as hard as its sounding… infact, all we have to do, first convert all the necessary XLib header files to d modules, then we can work on making the D modules more ‘D-Like’, adding object oriented paradigms etc, but the first part, is actually boring translation if you may J


I started somestuff last nite… and my first target is to be able to import X11.Xlib (analogous to #include <X11/Xlib.h>), for this, I have a whole lot of modules to convert. I’ve moved part of X.h to X.d, I’ll continue tonite.. and hopefully in two nites time, I should be able to write a basic XLib app in D.


In other news, as I started working on this yesternite, it became clearer how I would approach porting the EFL to D. Infact, I don’t even need the whole EFL right now, I just want to make the test module that comes with e17, be writable in D, then I’ll go from there. I’m not going to code that yet, I’ll wait for things to become clearer from the XLib effort, then I’ll let my inner-coding-monkey™ get to work on that J


Essien out.


Tuesday, July 19, 2005

Kernel Issues, e17 autobuild script

I just solved a very frustrating issue that showed up with my Kernel.


First of all, my laptop (a Compaq R4000), has issues with the default installed ArchLinux Kernel 2.6 (I’ve not tried 2.4).

I had to build a kernel during the install to get my Keyboard to work – yes, keyboard… I have no idea what happened. I’ve even tried doing a visual examination of the diff b/w the two kernel .config’s but I came up with no clue… anyway… at least it worked, with one funny glitch: My time was really accelerating, so when I ran that kernel for a while, and rebooted into windows, I’d have kerberous issues b/cos of time sync.


Last week, I decided to solve that problem once for all, by repeating a compile from my FailSafe kernel config. In doing that… I felt I should do some more optimizations and playing around, and I disabled PNP_BIOS support, and left only PNP_ACPI. Well… this cause me untold headaches, as my Network card stopped working… the driver would load properly, but I’d just get an SIOCADDRT: Network Unreachable.


Very frustrating… I searched high and low, and had no clue what was causing it, until I ran across some Redhat user threads, and someone mentioned IRQ issues that had given him similar errors, then I closely looked at my dmesg, and noticed a complain about IRQ handling with ACPI and some drivers that may still be using the old method. That was when I recalled my visual diffs of the Arch kernel and my own config, that PNP_BIOS was OFF… well… long story short… I enabled it back and its working again… and I’ve learnt something new!


On other fronts, I’d been using Rensel’s Repository to feed by e17 needs on ArchLinux for a while now, but after noticing that he only seems to build against Rasterman’s releases on, I decided to roll mine (I’d tried this before and had serious compile issues).


Anyway, this time, I was prepared, and after getting from CVS, I built the eet, edb, evas and ecore, they all worked, tho I had an eye opening problem with ecore finding evas, and I finally mastered the use of the ‘—with-bleh-config=/path/to/bleh-config’ argument to ./configure.


Now I have a tried and tested autobuild script for e17, that builds using ‘pacman’, and installs to my system. I did most of the work over the weekend, but still had some issues with some packages finding Ewl headers, and my result from ‘/usr/bin/ewl-config’ was really messed up. Yesternite, I stayed up till 4.00am, finetuning that script, and currently… its in its simplest form, with a library, and two actually builder scripts. And to test stuff, I uninstalled my last successful build, setup the build process and went to sleep. When I woke up around 7.30, I just logged in and typed ‘startx’… and yup! It works beautifully.


I also managed to write my first e17 module today (actually I just modified the snow module, using the test module as a guide :) ), at least it works.


So now, e17 is back up to current spec, and Dapo wants it tonite too :).


Ahh… I’m thinking of modifying this script to work with Autopackage (


Anyways, I guess I have my work cut out for me.


Essien, out.


Friday, July 15, 2005

We've caught a virus

At my office.. we’ve caught a virus!


I swear I had nothing to do with it…


But currently… everyone is talking Python, Linux, Open Source (when I mentioned this to Stan, we agreed to keep our big mouths shut, and see where all this was leading to)


I mean, core Windows guys who would not even look at Open Source stuff, suddenly going out of their way to learn Linux… and not just any distro, ArchLinux (


You probably wont guess what their default window Manager is:  e17 (infact, Dapo has asked me to build Arch Packages of the lattest e17 from cvs… wow! These guys are really demanding ;) )


Uhh… and yup… they’re already trying Mono, MonoDevelop and are seriously excited… infact… Dapo said, “The world is getting interesting”, this was when I told him about WINE (, well… I just told him, “Its always been interesting… you just didn’t know about it then”.


Any way, did I say I had nothing to do with it? I guess I lied… I’ve been doing passive evangelism…. The sort that Microsoft will use when they release Longhorn – They’ll force you to use it… force you nicely J


Well, I released PMUtils today to the rest of the guys in the office, made it look VERY COOL J, and it uses the lattest libpm (python version), I’m too lazy to update the C# version (uhhh… this means… I just don’t want to do it :D), this means that to have publishing features for myPM, you HAVE TO install python, elementtree, and my libraries, libpm and systray. To make things cleaner, I’ve used inno setup, to pack these nicely.


So now, everyone at Splashers Technologies ( uses a Python program everyday ;)


That is VIRAL Marketting. And we’ve caught the Linux/Python/OpenSource virus :)


I learn from the best.

Monday, July 11, 2005

Eclipse Help Plugin for D

I went playing with Eclipse this weekend (again! :) ).

Anyways, I don't see the reason of using Eclipse and being a developer if one doesn't know how to create a plugin. But then again, one can't just go about creating plugins just for the sake of plugins.

Any way, i've been having his 'itch' recently. My most used eclipse plugin PyDev, doesn't have all documentation that comes for instance with PythonWin or the Standard IDLE. Also, the eclipse plugins for the 'D' programming language doesn't have any documentation/reference.

I went to work, to see how easy it would be to extend the Eclipse help system, and the screeny above is the result of that effort, for the D programming Language.

To be honest, i really can't say i totally grok the stuff, but at least i have the idea. I've just downloaded the HTML docs for Python, and will over the couple of days, try to work them in.

I'm also going to clean up the D docs and contribute them to the eclipseD guys.

Am i having fun? You bet...

Essien out.

Thursday, July 07, 2005

Java on LInux for Client, Inno Setup

Finally Dapo has figured out all he needs to run a Java TTS (Text To Speech) App on Linux, and he's set for his Demo in Lagos this weekend.

I'm finishing up his Linux setup, and his environment is:

Archlinux/e17 (yuh baby.!)/Eclipse/Tomcat/MySQL/Java

(I'm wishing we could have added Jython to that too :) )

Kewl huh? you bet.

Also, I decided to master Inno Setup once for all, and I finally got it working, and have used it to package PMUtils 1.0. Its rather flexible and i prefer the setup package it produces to the default msi's we build with .NET... uugghh!!!

Anyways, i'm using the proper setup on my box now, am noticing some usability issues... i guess i'll hit guys with it tmrw.

Nokia Development with Eclipse

I've been working on this gently ever since i finally got the hang of Eclipse. Last nite, i stayed up, read some pdfs on Programming style and stuff like that, and continued on trying to get this to work.
Basically, i learnt that the Nokia Development Environment could plug into Eclipse as well as other popular Java IDEs. I've downloaded and setup the Nokia Development Environment, and in the process, also Downloaded and setup the EclipseME plugin.
Now, i can create a Nokia MIDP Project (but i don't know where to go from there :) ) Also, I have options of creating a MIDlet suite, but when i try to do that, eclipse complains that there is no platform to build the MIDlet for. I'm still looking into this.
Anyway... It looks like i'm actually set for developing Nokia apps, and i have the 7210 SDK (which i can test with my phone :) ). What i need now, is a sort of wholesome primer... From looking at the docs that come with the SDK, its a lot like writing a BlackBerry App, i just need to know how to create the entry point.
I'll scrounge around some more this weekend, download lots of articles from Forum Nokia, and spend next week reading thru them... am sure i'll get it all working by next week... Ahh... i feel a whole new frontier coming for me.
By the way, i'm itching to get the new Nokia Internet Tablet, once its officially released. Its a pure Linux Based Beast... And from what i've seen via Google and various blogs... its going to be one fun hackable platform. Maybe i'll just get this instead of the Zaurus I was thinking off... hmm....

Wednesday, July 06, 2005

Python Speech API for Windows

Dapo has been working on this Java app that should read text out of a webpage, and my! Has he had issues with Java!


He’s gone from issue to issue, and he wishes he could have done it all in C# / .NET (He’s really our local .NET guru J ).


Anyway, I started feeling slightly jealous, and set out to see how hard it would be to achieve in Python. I hit my repository – AKA – Google J, and typed in Python Speech API.


There were myriads of  results. I picked the first one that happened to be a recipe from the Python Cookbook on ActiveState. :


Well, the second link I checked out was a module called pyTTS, which is a thin layer atop Microsofts SAPI framework. :


To say that I was shocked will be an understatement… this is what the code to read a line looks like with pyTTS:


#-----------start of code -------------#

import pyTTS


tts = pyTTS.Create()

tts.Speak(“Unbelievable right? But I’m speaking!”)


#------------uhh… end of code :D -------#


That’s it!!!


I called Dapo over, to look at the sample Python Code, and we all started laughing… I mean it was so simple it was absurd.


The point here, is not *JUST* that it is only three lines of code. The point is that I most python libraries feel the same way. They do most of the underground work for your Default Scenario (which you end up using 90% of the time), and if you still want to get raw access… be my guest… its always there. The CookBook recipe still shows that without pyTTS, I could still build something simple and very much Pythonic from scratch, in VERY LITTLE lines of code. Its definitely amazing to have this much power at your finger tips.


If there is one thing I’ve learnt from Python, it is the power in succinctness. IMOHO, any developer that is not harnessing this succinctness yet from any source, Perl, Python, Ruby, Groovy, etc, is really wasting valuable time on things that he/she doesn’t have to spend time on.


Now, this is not exactly running out of a web page (So its not exactly Dapo’s *Current* problem… but a Python Webapp, is same as a Python Desktop app, and I don’t have to battle Java Applets like he’s doing now… poor guy J )


Now, what’s the next cool thing I’ll do with this? Hehehe… I think ‘misctray’ is going to start reading my tutorials and reading materials for me J





More systray utils

Yesterday, I decided I needed to clean up some of my remote pop3 mailboxes I’ve not checked in a while.


Not a problem, but I have a very slow link, and downloading 13.8Mb of mail is not something I’d like to wait after work to do. So well, I got home last nite, and welded together another systray based utility I named ‘misctray’. Currently, It has just 2 uses… check the number of mails on a particular account, and allow me to delete the mails without downloading them first (basically a looped ‘DELE’ J ).


Tested it out this morning, and boom! It works. ‘misctray’ has me thinking tho… I think I’d like a framework, where I can write arbitrary python scripts, drop them in a ‘mistray plugins’ folder, and misctray would pick them up automagically, and create a menu/menu-item out of them. That way, I can have one consistent launcher for my python scripts, right on my Windows System Tray.


Hmm…nice idea… I like it, I’ll do it.

Monday, July 04, 2005

PMTray 1.0 with some screenshots

Well, well, well, sometimes we make plans and totally don't end up following them, because a better plan came up all of a sudden.

That's basically happened to me over the weekend.

Remember i had planned to start working on the now very much hypothetical and soon to be not so vapourware 'phiba' :). Well, i found another immediate need, PMTray. PMTray is my lattest addition to the PMUtils package i currently use to manage our time and interact with our web based time management tool.

I quickly put this together with the systray module (that dude has realy gotten usefull).

Using systray to solve a real problem also helped me to refactor it for better usability, and what i really need to add now before i can satisfactorily declare systray-1.0.0 is 1) A status message akin to Yahoo Messenger Notifications (when folks log on and off, but as beautifull as Outlooks Mail notifier messages.
2) Support of an OnApplicationLoad event, so i can run a full service off the systray.
3) Support for Notification Balloons (This is not really too important if i can achieve the first one. Infact, any of 1 or 3 will be cool for a version 1.0.0, and both WILL ROCK!)

The screenies sort of speak for them selves. (pmtray is the cool - yup, cool, green icon nearer the system clock)

1. pmtray is idle
2. pmtray - showing menu options
3. pmtray - synchronizing with WebPM

ok... gtg, i really have this pain in my neck... i think its a cold :(